From 86c036505b91bc9d28b869822afe7d507545d7c1 Mon Sep 17 00:00:00 2001 From: Lipis Date: Thu, 24 Dec 2020 23:05:22 +0200 Subject: [PATCH 01/45] chore: Remove unused cursorX, cursorY from AppState (#2665) --- src/appState.ts | 4 - src/components/LayerUI.tsx | 2 - .../regressionTests.test.tsx.snap | 134 ------------------ src/types.ts | 2 - 4 files changed, 142 deletions(-) diff --git a/src/appState.ts b/src/appState.ts index b4dc998cd..7b8eba034 100644 --- a/src/appState.ts +++ b/src/appState.ts @@ -44,8 +44,6 @@ export const getDefaultAppState = (): Omit< viewBackgroundColor: oc.white, scrollX: 0 as FlooredNumber, scrollY: 0 as FlooredNumber, - cursorX: 0, - cursorY: 0, cursorButton: "up", scrolledOutside: false, name: `${t("labels.untitled")}-${getDateTime()}`, @@ -108,8 +106,6 @@ const APP_STATE_STORAGE_CONF = (< currentItemStartArrowhead: { browser: true, export: false }, currentItemEndArrowhead: { browser: true, export: false }, cursorButton: { browser: true, export: false }, - cursorX: { browser: true, export: false }, - cursorY: { browser: true, export: false }, draggingElement: { browser: false, export: false }, editingElement: { browser: false, export: false }, startBoundElement: { browser: false, export: false }, diff --git a/src/components/LayerUI.tsx b/src/components/LayerUI.tsx index 6e4ebbebc..767b3e8ff 100644 --- a/src/components/LayerUI.tsx +++ b/src/components/LayerUI.tsx @@ -641,8 +641,6 @@ const LayerUI = ({ const areEqual = (prev: LayerUIProps, next: LayerUIProps) => { const getNecessaryObj = (appState: AppState): Partial => { const { - cursorX, - cursorY, suggestedBindings, startBoundElement: boundElement, ...ret diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap index 8ffa26a57..f9cee43f3 100644 --- a/src/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap @@ -19,8 +19,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -474,8 +472,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -935,8 +931,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": "id10", @@ -1705,8 +1699,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -1903,8 +1895,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -2355,8 +2345,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -2602,8 +2590,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -2760,8 +2746,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -3231,8 +3215,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -3533,8 +3515,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -3731,8 +3711,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -3969,8 +3947,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -4215,8 +4191,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -4570,8 +4544,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": Object { "angle": 0, "backgroundColor": "transparent", @@ -4859,8 +4831,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": Object { "angle": 0, "backgroundColor": "transparent", @@ -5160,8 +5130,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": Object { "angle": 0, "backgroundColor": "transparent", @@ -5362,8 +5330,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": Object { "angle": 0, "backgroundColor": "transparent", @@ -5542,8 +5508,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": "id3", @@ -5989,8 +5953,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -6301,8 +6263,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -8329,8 +8289,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -8685,8 +8643,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -8934,8 +8890,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -9181,8 +9135,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -9490,8 +9442,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -9648,8 +9598,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -9806,8 +9754,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -9964,8 +9910,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -10152,8 +10096,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -10340,8 +10282,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -10528,8 +10468,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -10716,8 +10654,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -10874,8 +10810,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -11032,8 +10966,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -11220,8 +11152,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -11378,8 +11308,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -11566,8 +11494,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -12276,8 +12202,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -12523,8 +12447,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -12619,8 +12541,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -12713,8 +12633,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -12871,8 +12789,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -13173,8 +13089,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -13475,8 +13389,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -13633,8 +13545,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -13823,8 +13733,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -14066,8 +13974,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -14384,8 +14290,6 @@ Object { "currentItemStrokeWidth": 2, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -15217,8 +15121,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -15519,8 +15421,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -15821,8 +15721,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -16194,8 +16092,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -16355,8 +16251,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -16670,8 +16564,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -16903,8 +16795,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -17152,8 +17042,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -17473,8 +17361,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -17567,8 +17453,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -17725,8 +17609,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -18540,8 +18422,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -18634,8 +18514,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": "id3", @@ -19358,8 +19236,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": Object { "angle": 0, "backgroundColor": "transparent", @@ -19757,8 +19633,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": Object { "angle": 0, "backgroundColor": "transparent", @@ -20046,8 +19920,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "down", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -20142,8 +20014,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -20634,8 +20504,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, @@ -20728,8 +20596,6 @@ Object { "currentItemStrokeWidth": 1, "currentItemTextAlign": "left", "cursorButton": "up", - "cursorX": 0, - "cursorY": 0, "draggingElement": null, "editingElement": null, "editingGroupId": null, diff --git a/src/types.ts b/src/types.ts index 9c99376cb..6161bf883 100644 --- a/src/types.ts +++ b/src/types.ts @@ -67,8 +67,6 @@ export type AppState = { viewBackgroundColor: string; scrollX: FlooredNumber; scrollY: FlooredNumber; - cursorX: number; - cursorY: number; cursorButton: "up" | "down"; scrolledOutside: boolean; name: string; From e9cb7ee77cea33f44731b605a78d1999a9d5f733 Mon Sep 17 00:00:00 2001 From: Lipis Date: Fri, 25 Dec 2020 12:15:34 +0200 Subject: [PATCH 02/45] chore: New Crowdin updates (#2620) Co-authored-by: Kostas Bariotis --- scripts/locales-coverage-description.js | 17 +- src/i18n.ts | 6 +- src/locales/ar-SA.json | 15 +- src/locales/bg-BG.json | 15 +- src/locales/ca-ES.json | 13 +- src/locales/de-DE.json | 15 +- src/locales/el-GR.json | 21 ++- src/locales/es-ES.json | 83 ++++----- src/locales/fa-IR.json | 15 +- src/locales/fi-FI.json | 13 +- src/locales/fr-FR.json | 25 +-- src/locales/he-IL.json | 125 ++++++------- src/locales/hi-IN.json | 19 +- src/locales/hu-HU.json | 213 ++++++++++----------- src/locales/id-ID.json | 17 +- src/locales/it-IT.json | 15 +- src/locales/ja-JP.json | 15 +- src/locales/ko-KR.json | 21 ++- src/locales/my-MM.json | 15 +- src/locales/nb-NO.json | 15 +- src/locales/nl-NL.json | 93 +++++----- src/locales/nn-NO.json | 87 ++++----- src/locales/percentages.json | 43 ++--- src/locales/pl-PL.json | 87 ++++----- src/locales/pt-BR.json | 235 ++++++++++++++++++++++++ src/locales/pt-PT.json | 77 ++++---- src/locales/ro-RO.json | 13 +- src/locales/ru-RU.json | 95 +++++----- src/locales/sk-SK.json | 13 +- src/locales/sv-SE.json | 13 +- src/locales/tr-TR.json | 51 ++--- src/locales/uk-UA.json | 19 +- src/locales/zh-CN.json | 31 ++-- src/locales/zh-TW.json | 13 +- 34 files changed, 914 insertions(+), 649 deletions(-) create mode 100644 src/locales/pt-BR.json diff --git a/scripts/locales-coverage-description.js b/scripts/locales-coverage-description.js index 3a8ea7951..f4715353c 100644 --- a/scripts/locales-coverage-description.js +++ b/scripts/locales-coverage-description.js @@ -24,6 +24,7 @@ const crowdinMap = { "nl-NL": "en-nl", "nn-NO": "en-nnno", "pl-PL": "en-pl", + "pt-BR": "en-ptbr", "pt-PT": "en-pt", "ro-RO": "en-ro", "ru-RU": "en-ru", @@ -57,6 +58,7 @@ const flags = { "nl-NL": "🇳🇱", "nn-NO": "🇳🇴", "pl-PL": "🇵🇱", + "pt-BR": "🇧🇷", "pt-PT": "🇵🇹", "ro-RO": "🇷🇴", "ru-RU": "🇷🇺", @@ -90,6 +92,7 @@ const languages = { "nl-NL": "Nederlands", "nn-NO": "Norsk nynorsk", "pl-PL": "Polski", + "pt-BR": "Português Brasileiro", "pt-PT": "Português", "ro-RO": "Română", "ru-RU": "Русский", @@ -114,16 +117,14 @@ const boldIf = (text, condition) => (condition ? `**${text}**` : text); const printHeader = () => { let result = "| | Flag | Locale | % |\n"; - result += "| --: | :--: | -- | --: |"; + result += "| :--: | :--: | -- | :--: |"; return result; }; const printRow = (id, locale, coverage) => { - const isOver = coverage > THRESSHOLD; - let result = `| ${boldIf(id, isOver)} | `; - + const isOver = coverage >= THRESSHOLD; + let result = `| ${isOver ? id : "..."} | `; result += `${locale in flags ? flags[locale] : ""} | `; - const language = locale in languages ? languages[locale] : locale; if (locale in crowdinMap && crowdinMap[locale]) { result += `[${boldIf( @@ -133,14 +134,12 @@ const printRow = (id, locale, coverage) => { } else { result += `${boldIf(language, isOver)} | `; } - result += `${boldIf(coverage, isOver)} |`; + result += `${coverage === 100 ? "✅" : boldIf(coverage, isOver)} |`; return result; }; -console.info("## Languages check"); -console.info("\n\r"); console.info( - `Our translations for every languages should be at least **${THRESSHOLD}%** to appear on Excalidraw. Join our project in [Crowdin](https://crowdin.com/project/excalidraw) and help us translate it in your language. **Can't find your own?** Open an [issue](https://github.com/excalidraw/excalidraw/issues/new) and we'll add it to the list.`, + `Each language must be at least **${THRESSHOLD}%** translated in order to appear on Excalidraw. Join us on [Crowdin](https://crowdin.com/project/excalidraw) and help us translate your own language. **Can't find yours yet?** Open an [issue](https://github.com/excalidraw/excalidraw/issues/new) and we'll add it to the list.`, ); console.info("\n\r"); console.info(printHeader()); diff --git a/src/i18n.ts b/src/i18n.ts index ca8efb38d..4ed0a28f0 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -4,7 +4,7 @@ import { EVENT_CHANGE, trackEvent } from "./analytics"; import fallbackLanguageData from "./locales/en.json"; import percentages from "./locales/percentages.json"; -const COMPLETION_THRESHOLD_TO_EXCEED = 85; +const COMPLETION_THRESHOLD = 85; interface Language { lng: string; @@ -34,6 +34,7 @@ const allLanguages: Language[] = [ { lng: "nl-NL", label: "Nederlands" }, { lng: "nn-NO", label: "Norsk nynorsk" }, { lng: "pl-PL", label: "Polski" }, + { lng: "pt-BR", label: "Português Brasileiro" }, { lng: "pt-PT", label: "Português" }, { lng: "ro-RO", label: "Română" }, { lng: "ru-RU", label: "Русский" }, @@ -51,8 +52,7 @@ export const languages: Language[] = [{ lng: "en", label: "English" }] ) .filter( (lang) => - (percentages as Record)[lang.lng] > - COMPLETION_THRESHOLD_TO_EXCEED, + (percentages as Record)[lang.lng] >= COMPLETION_THRESHOLD, ); let currentLanguage = languages[0]; diff --git a/src/locales/ar-SA.json b/src/locales/ar-SA.json index 59238624c..a436775c2 100644 --- a/src/locales/ar-SA.json +++ b/src/locales/ar-SA.json @@ -37,7 +37,7 @@ "fontSize": "حجم الخط", "fontFamily": "نوع الخط", "onlySelected": "المحدد فقط", - "withBackground": "مع الخلفية", + "withBackground": "", "exportEmbedScene": "تضمين المشهد في ملف التصدير", "exportEmbedScene_details": "سيتم حفظ بيانات المشهد في ملف PNG/SVG المصدّر بحيث يمكن استعادة المشهد منه.\nسيزيد حجم الملف المصدر.", "addWatermark": "إضافة \"مصنوعة بواسطة Excalidraw\"", @@ -76,8 +76,7 @@ "group": "تحديد مجموعة", "ungroup": "إلغاء تحديد مجموعة", "collaborators": "المتعاونون", - "toggleGridMode": "التبديل إلى وضع الشبكة", - "toggleStats": "", + "gridMode": "", "addToLibrary": "أضف إلى المكتبة", "removeFromLibrary": "حذف من المكتبة", "libraryLoadingMessage": "جارٍ تحميل المكتبة...", @@ -118,9 +117,10 @@ "redo": "إعادة تنفيذ", "roomDialog": "بدء المشاركة الحية", "createNewRoom": "إنشاء غرفة جديدة", - "toggleFullScreen": "التبديل لوضع ملء الشاشة", - "toggleDarkMode": "تبديل الوضع الليلي", - "toggleZenMode": "تبديل الوضع الليلي", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "إلغاء الوضع الليلى" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "تحميل الرسم الخارجي سيحل محل المحتوى الموجود لديك. هل ترغب في المتابعة؟", "errorLoadingLibrary": "حصل خطأ أثناء تحميل مكتبة الطرف الثالث.", "confirmAddLibrary": "هذا سيضيف {{numShapes}} شكل إلى مكتبتك. هل أنت متأكد؟", - "imageDoesNotContainScene": "لا يحتوي ملف الصورة على بيانات المشهد. هل قمت بتمكين هذا أثناء التصدير؟", + "imageDoesNotContainScene": "", "cannotRestoreFromImage": "تعذر استعادة المشهد من ملف الصورة" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "انقر واسحب، افرج عند الانتهاء", "text": "نصيحة: يمكنك أيضًا إضافة نص بالنقر المزدوج في أي مكان بأداة الاختيار", "linearElementMulti": "انقر فوق النقطة الأخيرة أو اضغط على Esc أو Enter للإنهاء", + "lockAngle": "", "resize": "يمكنك تقييد النسب بالضغط على SHIFT أثناء تغيير الحجم،\nاضغط على ALT لتغيير الحجم من المركز", "rotate": "يمكنك تقييد الزوايا من خلال الضغط على SHIFT أثناء الدوران", "lineEditor_info": "انقر نقراً مزدوجاً أو اضغط Enter لتعديل النقاط", diff --git a/src/locales/bg-BG.json b/src/locales/bg-BG.json index d70b71998..f8337ff57 100644 --- a/src/locales/bg-BG.json +++ b/src/locales/bg-BG.json @@ -31,13 +31,13 @@ "round": "", "arrowheads": "", "arrowhead_none": "", - "arrowhead_arrow": "", + "arrowhead_arrow": "Стрелка", "arrowhead_bar": "", "arrowhead_dot": "", "fontSize": "Размер на шрифта", "fontFamily": "Семейство шрифтове", "onlySelected": "Само избраното", - "withBackground": "С фон", + "withBackground": "", "exportEmbedScene": "", "exportEmbedScene_details": "", "addWatermark": "", @@ -76,8 +76,7 @@ "group": "", "ungroup": "", "collaborators": "", - "toggleGridMode": "", - "toggleStats": "", + "gridMode": "", "addToLibrary": "", "removeFromLibrary": "", "libraryLoadingMessage": "", @@ -118,9 +117,10 @@ "redo": "Повтори", "roomDialog": "Започнете сътрудничество на живо", "createNewRoom": "Създай нова стая", - "toggleFullScreen": "Превключване на цял екран", - "toggleDarkMode": "", - "toggleZenMode": "", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "" }, "alerts": { @@ -161,6 +161,7 @@ "freeDraw": "", "text": "", "linearElementMulti": "Кликнете върху последната точка или натиснете Escape или Enter, за да завършите", + "lockAngle": "", "resize": "", "rotate": "Можете да ограничите ъглите, като държите SHIFT, докато се въртите", "lineEditor_info": "", diff --git a/src/locales/ca-ES.json b/src/locales/ca-ES.json index c352d9f8f..e3efbaab1 100644 --- a/src/locales/ca-ES.json +++ b/src/locales/ca-ES.json @@ -37,7 +37,7 @@ "fontSize": "Mida de lletra", "fontFamily": "Tipus de lletra", "onlySelected": "Només seleccionats", - "withBackground": "Amb fons", + "withBackground": "", "exportEmbedScene": "", "exportEmbedScene_details": "", "addWatermark": "Afegir \"Fet amb Excalidraw\"", @@ -76,8 +76,7 @@ "group": "Agrupar la selecció", "ungroup": "Desagrupar la selecció", "collaborators": "Col·laboradors", - "toggleGridMode": "Commutar línies de graella", - "toggleStats": "", + "gridMode": "", "addToLibrary": "Afegir a la biblioteca", "removeFromLibrary": "Eliminar de la biblioteca", "libraryLoadingMessage": "Carregant la biblioteca...", @@ -118,9 +117,10 @@ "redo": "Refer", "roomDialog": "Començar col·laboració en directe", "createNewRoom": "Crear sala nova", - "toggleFullScreen": "Commutar pantalla completa", - "toggleDarkMode": "Commutar modo fosc", - "toggleZenMode": "Commutar modo zen", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "Sortir de modo zen" }, "alerts": { @@ -161,6 +161,7 @@ "freeDraw": "Fer clic i arrosegar, deixar anar al punt final", "text": "Consell: també pots afegir text fent doble clic a qualsevol lloc amb l'eina de selecció", "linearElementMulti": "Fer clic a l'ultim punt, o polsar Escape o Enter per acabar", + "lockAngle": "", "resize": "Per restringir les proporcions mentres es canvia la mida, mantenir premut el majúscul (SHIFT); per canviar la mida des del centre, mantenir premut ALT", "rotate": "Per restringir els angles mentre gira, mantenir premut el majúscul (SHIFT)", "lineEditor_info": "Fes doble clic o premi Enter per editar punts", diff --git a/src/locales/de-DE.json b/src/locales/de-DE.json index 34bbd3beb..6a75e31f5 100644 --- a/src/locales/de-DE.json +++ b/src/locales/de-DE.json @@ -76,8 +76,7 @@ "group": "Auswahl gruppieren", "ungroup": "Gruppierung aufheben", "collaborators": "Mitarbeitende", - "toggleGridMode": "Gitterlinien ein-/ausschalten", - "toggleStats": "Statistiken für Nerds ein-/ausschalten", + "gridMode": "Rastermodus", "addToLibrary": "Zur Bibliothek hinzufügen", "removeFromLibrary": "Aus Bibliothek entfernen", "libraryLoadingMessage": "Lade Bibliothek...", @@ -118,9 +117,10 @@ "redo": "Wiederholen", "roomDialog": "Live-Kollaborationssitzung starten", "createNewRoom": "Neuen Raum erstellen", - "toggleFullScreen": "Vollbild umschalten", - "toggleDarkMode": "Dunkles Design umschalten", - "toggleZenMode": "Zen-Modus umschalten", + "fullScreen": "Vollbildanzeige", + "darkMode": "Dunkles Design", + "lightMode": "Helles Design", + "zenMode": "Zen-Modus", "exitZenMode": "Zen-Modus verlassen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Das Laden der externen Zeichnung ersetzt den vorhandenen Inhalt. Möchtest Du fortfahren?", "errorLoadingLibrary": "Beim Laden der Drittanbieter-Bibliothek ist ein Fehler aufgetreten.", "confirmAddLibrary": "Dieses fügt {{numShapes}} Form(en) zu deiner Bibliothek hinzu. Bist du sicher?", - "imageDoesNotContainScene": "Bilddatei enthält keine Zeichnungsdaten. Hast du das Einbetten beim Export aktiviert?", + "imageDoesNotContainScene": "Das Importieren von Bildern wird derzeit nicht unterstützt.\n\nMöchtest du eine Szene importieren? Dieses Bild scheint keine Zeichnungsdaten zu enthalten. Hast du dies beim Exportieren aktiviert?", "cannotRestoreFromImage": "Die Zeichnung konnte aus dieser Bilddatei nicht wiederhergestellt werden" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Zum Beenden auf den letzten Punkt klicken oder Escape oder Eingabe drücken", + "lockAngle": "Du kannst Winkel einschränken, indem du SHIFT gedrückt hältst", "resize": "Du kannst die Proportionen einschränken, indem du SHIFT während der Größenänderung gedrückt hältst. Halte ALT gedrückt, um die Größe vom Zentrum aus zu ändern", "rotate": "Du kannst Winkel einschränken, indem du SHIFT während der Drehung gedrückt hältst", "lineEditor_info": "Doppelklicken oder Eingabetaste drücken, um Punkte zu bearbeiten", @@ -213,7 +214,7 @@ "textNewLine": "Neue Zeile hinzufügen (Text)", "textFinish": "Bearbeiten beenden (Text)", "zoomToFit": "Zoomen um alle Elemente einzupassen", - "zoomToSelection": "", + "zoomToSelection": "Zoomauswahl", "preventBinding": "Pfeil-Bindung verhindern" }, "encrypted": { diff --git a/src/locales/el-GR.json b/src/locales/el-GR.json index 3a0894a12..da7e68dee 100644 --- a/src/locales/el-GR.json +++ b/src/locales/el-GR.json @@ -37,7 +37,7 @@ "fontSize": "Μέγεθος γραμματοσειράς", "fontFamily": "Γραμματοσειρά", "onlySelected": "Μόνο τα Επιλεγμένα", - "withBackground": "Με Φόντο", + "withBackground": "Με φόντο", "exportEmbedScene": "Ενσωμάτωση της σκηνής στο αρχείο προς εξαγωγή", "exportEmbedScene_details": "Τα δεδομένα σκηνής θα αποθηκευτούν στο αρχείο PNG/SVG προς εξαγωγή ώστε η σκηνή να είναι δυνατό να αποκατασταθεί από αυτό.\nΘα αυξήσει το μέγεθος του αρχείου προς εξαγωγή.", "addWatermark": "Προσθήκη \"Φτιαγμένο με Excalidraw\"", @@ -76,8 +76,7 @@ "group": "Δημιουργία ομάδας από επιλογή", "ungroup": "Κατάργηση ομάδας από επιλογή", "collaborators": "Συνεργάτες", - "toggleGridMode": "Εναλλαγή λειτουργίας πλέγματος", - "toggleStats": "", + "gridMode": "Εμφάνιση σε πλέγμα", "addToLibrary": "Προσθήκη στη βιβλιοθήκη", "removeFromLibrary": "Αφαίρεση από τη βιβλιοθήκη", "libraryLoadingMessage": "Φόρτωση βιβλιοθήκης...", @@ -118,9 +117,10 @@ "redo": "Επαναφορά", "roomDialog": "Έναρξη ζωντανής συνεργασίας", "createNewRoom": "Δημιουργία νέου χώρου", - "toggleFullScreen": "Εναλλαγή πλήρους οθόνης", - "toggleDarkMode": "Εναλλαγή εμφάνισης σε dark", - "toggleZenMode": "Εναλλαγή λειτουργίας Zen", + "fullScreen": "Πλήρης οθόνη", + "darkMode": "Σκοτεινή λειτουργία", + "lightMode": "Φωτεινή λειτουργία", + "zenMode": "Λειτουργία Zεν", "exitZenMode": "Έξοδος απο την λειτουργία Zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Η φόρτωση εξωτερικού σχεδίου θα αντικαταστήσει το υπάρχον περιεχόμενο. Επιθυμείτε να συνεχίσετε;", "errorLoadingLibrary": "Υπήρξε ένα σφάλμα κατά τη φόρτωση της βιβλιοθήκης τρίτου μέρους.", "confirmAddLibrary": "Αυτό θα προσθέσει {{numShapes}} σχήμα(τα) στη βιβιλιοθήκη σας. Είστε σίγουροι;", - "imageDoesNotContainScene": "Το αρχείο εικόνας δεν έχει δεδομένα σκηνής. Το είχατε ενεργοποιήσει αυτό κατά την εξαγωγή;", + "imageDoesNotContainScene": "", "cannotRestoreFromImage": "Η σκηνή δεν ήταν δυνατό να αποκατασταθεί από αυτό το αρχείο εικόνας" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "Κάντε κλικ και σύρατε, απελευθερώσατε όταν έχετε τελειώσει", "text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών", "linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις", + "lockAngle": "", "resize": "Μπορείς να περιορίσεις τις αναλογίες κρατώντας το SHIFT ενώ αλλάζεις μέγεθος,\nκράτησε πατημένο το ALT για αλλαγή μεγέθους από το κέντρο", "rotate": "Μπορείς να περιορίσεις τις γωνίες κρατώντας πατημένο το πλήκτρο SHIFT κατά την περιστροφή", "lineEditor_info": "Διπλό-κλικ ή πιέστε Enter για να επεξεργαστείτε τα σημεία", @@ -169,7 +170,7 @@ }, "canvasError": { "cannotShowPreview": "", - "canvasTooBig": "", + "canvasTooBig": "Ο καμβάς μπορεί να είναι μεγάλος.", "canvasTooBigTip": "" }, "errorSplash": { @@ -224,10 +225,10 @@ "element": "Στοιχείο", "elements": "Στοιχεία", "height": "Ύψος", - "scene": "", + "scene": "Σκηνή", "selected": "Επιλεγμένα", "storage": "Χώρος", - "title": "", + "title": "Στατιστικά για σπασίκλες", "total": "Σύνολο ", "width": "Πλάτος" } diff --git a/src/locales/es-ES.json b/src/locales/es-ES.json index ae311c457..29e589f99 100644 --- a/src/locales/es-ES.json +++ b/src/locales/es-ES.json @@ -4,7 +4,7 @@ "selectAll": "Seleccionar todo", "multiSelect": "Añadir elemento a la selección", "moveCanvas": "Mover el lienzo", - "cut": "", + "cut": "Cortar", "copy": "Copiar", "copyAsPng": "Copiar al portapapeles como PNG", "copyAsSvg": "Copiar al portapapeles como SVG", @@ -29,17 +29,17 @@ "edges": "Bordes", "sharp": "Afilado", "round": "Redondo", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowheads": "Puntas de flecha", + "arrowhead_none": "Vacía", + "arrowhead_arrow": "Flecha", + "arrowhead_bar": "Barra", + "arrowhead_dot": "Punto", "fontSize": "Tamaño de la fuente", "fontFamily": "Tipo de fuente", "onlySelected": "Sólo seleccionados", "withBackground": "Con fondo", - "exportEmbedScene": "", - "exportEmbedScene_details": "", + "exportEmbedScene": "Insertar escena en el archivo exportado", + "exportEmbedScene_details": "Los datos de escena se guardarán en el archivo PNG/SVG exportado para que la escena pueda ser restaurada de ella.\nIncrementará el tamaño del archivo exportado.", "addWatermark": "Agregar \"Hecho con Excalidraw\"", "handDrawn": "Dibujado a mano", "normal": "Normal", @@ -60,7 +60,7 @@ "architect": "Arquitecto", "artist": "Artista", "cartoonist": "Caricatura", - "fileTitle": "", + "fileTitle": "Título del archivo", "colorPicker": "Selector de color", "canvasBackground": "Fondo del lienzo", "drawingCanvas": "Lienzo de dibujo", @@ -69,29 +69,28 @@ "language": "Idioma", "createRoom": "Compartir una sesión de colaboración en vivo", "duplicateSelection": "Duplicar", - "untitled": "", + "untitled": "Sin título", "name": "Nombre", "yourName": "Tu nombre", "madeWithExcalidraw": "Hecho con Excalidraw", "group": "Selección de grupo", "ungroup": "Desagrupar", "collaborators": "Colaboradores", - "toggleGridMode": "Alternar modo cuadrícula", - "toggleStats": "", + "gridMode": "Modo cuadrícula", "addToLibrary": "Añadir a la biblioteca", "removeFromLibrary": "Eliminar de la biblioteca", "libraryLoadingMessage": "Cargando biblioteca...", - "libraries": "", + "libraries": "Explorar librerías", "loadingScene": "Cargando escena...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "align": "Alinear", + "alignTop": "Alinear arriba", + "alignBottom": "Alinear abajo", + "alignLeft": "Alinear a la izquierda", + "alignRight": "Alinear a la derecha", + "centerVertically": "Centrar verticalmente", + "centerHorizontally": "Centrar horizontalmente", + "distributeHorizontally": "Distribuir horizontalmente", + "distributeVertically": "Distribuir verticalmente" }, "buttons": { "clearReset": "Limpiar lienzo y reiniciar el color de fondo", @@ -118,15 +117,16 @@ "redo": "Rehacer", "roomDialog": "Iniciar colaboración en vivo", "createNewRoom": "Crear nueva sala", - "toggleFullScreen": "Alternar pantalla completa", - "toggleDarkMode": "Cambiar a modo oscuro", - "toggleZenMode": "Alternar modo zen", + "fullScreen": "Pantalla completa", + "darkMode": "Modo oscuro", + "lightMode": "Modo claro", + "zenMode": "Modo Zen", "exitZenMode": "Salir del modo Zen" }, "alerts": { "clearReset": "Esto limpiará todo el lienzo. Estás seguro?", "couldNotCreateShareableLink": "No se pudo crear un enlace para compartir.", - "couldNotCreateShareableLinkTooBig": "", + "couldNotCreateShareableLinkTooBig": "No se pudo crear el enlace para compartir: la escena es demasiado grande", "couldNotLoadInvalidFile": "No se pudo cargar el archivo inválido", "importBackendFailed": "La importación falló.", "cannotExportEmptyCanvas": "No se puede exportar un lienzo vació", @@ -136,8 +136,8 @@ "loadSceneOverridePrompt": "Si carga este dibujo externo, reemplazará el que tiene. ¿Desea continuar?", "errorLoadingLibrary": "Se ha producido un error al cargar la biblioteca de terceros.", "confirmAddLibrary": "Esto añadirá {{numShapes}} forma(s) a tu biblioteca. ¿Estás seguro?", - "imageDoesNotContainScene": "", - "cannotRestoreFromImage": "" + "imageDoesNotContainScene": "La importación de imágenes no está soportada en este momento.\n\n¿Querías importar una escena? Esta imagen no parece contener ningún dato de escena. ¿Lo ha activado durante la exportación?", + "cannotRestoreFromImage": "No se pudo restaurar la escena desde este archivo de imagen" }, "toolBar": { "selection": "Selección", @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Haga clic en el último punto o pulse Escape o Enter para finalizar", + "lockAngle": "", "resize": "Para mantener las proporciones mantén SHIFT presionado mientras modificas el tamaño, \nmantén presionado ALT para modificar el tamaño desde el centro", "rotate": "Puede restringir los ángulos manteniendo presionado SHIFT mientras gira", "lineEditor_info": "haga doble clic o pulse Enter para editar puntos", @@ -168,9 +169,9 @@ "lineEditor_nothingSelected": "Seleccione un punto para mover o eliminar, o mantenga pulsado Alt y haga clic para añadir nuevos puntos" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "No se puede mostrar la vista previa", + "canvasTooBig": "El lienzo podría ser demasiado grande.", + "canvasTooBigTip": "Sugerencia: intenta acercar un poco los elementos más lejanos." }, "errorSplash": { "headingMain_pre": "Se encontró un error. Intente ", @@ -213,22 +214,22 @@ "textNewLine": "Añadir nueva línea (texto)", "textFinish": "Finalizar edición (texto)", "zoomToFit": "Ajustar para mostrar todos los elementos", - "zoomToSelection": "", + "zoomToSelection": "Hacer zoom a la selección", "preventBinding": "Evitar enlace de flecha" }, "encrypted": { "tooltip": "Tus dibujos están cifrados de punto a punto, por lo que los servidores de Excalidraw nunca los verán." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", - "scene": "", - "selected": "", - "storage": "", + "angle": "Ángulo", + "element": "Elemento", + "elements": "Elementos", + "height": "Alto", + "scene": "Escena", + "selected": "Seleccionado", + "storage": "Almacenamiento", "title": "", - "total": "", - "width": "" + "total": "Total", + "width": "Ancho" } } diff --git a/src/locales/fa-IR.json b/src/locales/fa-IR.json index 2d2362e23..d2d1f9b8e 100644 --- a/src/locales/fa-IR.json +++ b/src/locales/fa-IR.json @@ -37,7 +37,7 @@ "fontSize": "اندازه قلم", "fontFamily": "نوع قلم", "onlySelected": "فقط انتخاب شده ها", - "withBackground": "با پس زمینه", + "withBackground": "", "exportEmbedScene": "قرار دادن صحنه در فایل خروجی", "exportEmbedScene_details": "متحوای صحنه به فایل خروجی SVG/PNG اضافه خواهد شد برای بازیابی صحنه به آن اضافه خواهد شد.\nباعث افزایش حجم فایل خروجی میشود.", "addWatermark": "\"ساخته شده با Excalidraw\" را اضافه کن", @@ -76,8 +76,7 @@ "group": "گروهبندی انتخابها", "ungroup": "حذف گروهبندی انتخابها", "collaborators": "همکاران", - "toggleGridMode": "سويچ خطوط راهنما", - "toggleStats": "", + "gridMode": "", "addToLibrary": "افزودن به کتابخانه", "removeFromLibrary": "حذف از کتابخانه", "libraryLoadingMessage": "بارگذاری کتابخانه...", @@ -118,9 +117,10 @@ "redo": "از سر", "roomDialog": "همکاری آنلاین را شروع کنید", "createNewRoom": "ایجاد یک اتاق جدید", - "toggleFullScreen": "تغییر به حالت تمام صفحه", - "toggleDarkMode": "تغییر به حالت تاریک", - "toggleZenMode": "تغییر به حالت تمرکز", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "خروج از حالت تمرکز" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "بارگزاری یک طرح خارجی محتوای فعلی رو از بین میبرد. آیا میخواهید ادامه دهید؟", "errorLoadingLibrary": "خطایی در بارگذاری کتابخانه ثالث وجود داشت.", "confirmAddLibrary": "{{numShapes}} از اشکال به کتابخانه شما اضافه خواهد شد. مطمئن هستید؟", - "imageDoesNotContainScene": "فایل تصویر دارای محتوای صحنه نیست. آیا در هنگام خروجی گرفتن آن را فعال کرده‌اید؟", + "imageDoesNotContainScene": "", "cannotRestoreFromImage": "صحنه را نمی توان از این فایل تصویری بازیابی کرد" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "کلیک کنید و بکشید و وقتی کار تمام شد رها کنید", "text": "نکته: با برنامه انتخاب شده شما میتوانید با دوبار کلیک کردن هرکجا میخواید متن اظاف کنید", "linearElementMulti": "روی آخرین نقطه کلیک کنید یا کلید ESC را بزنید یا کلید Enter را بزنید برای اتمام کار", + "lockAngle": "", "resize": "می توانید با نگه داشتن SHIFT در هنگام تغییر اندازه، نسبت ها را محدود کنید،ALT را برای تغییر اندازه از مرکز نگه دارید", "rotate": "با نگه داشتن SHIFT هنگام چرخش می توانید زاویه ها را محدود کنید", "lineEditor_info": "دوبار کلیک کنید یا Enter را فشار دهید تا نقاط را ویرایش کنید", diff --git a/src/locales/fi-FI.json b/src/locales/fi-FI.json index 6f9437ed6..6910c21bf 100644 --- a/src/locales/fi-FI.json +++ b/src/locales/fi-FI.json @@ -76,8 +76,7 @@ "group": "Ryhmitä valinta", "ungroup": "Pura valittu ryhmä", "collaborators": "Yhteistyökumppanit", - "toggleGridMode": "Ruudukko päälle/pois", - "toggleStats": "Nörttien tilastot päälle/pois", + "gridMode": "Ruudukkotila", "addToLibrary": "Lisää kirjastoon", "removeFromLibrary": "Poista kirjastosta", "libraryLoadingMessage": "Ladataan kirjastoa...", @@ -118,9 +117,10 @@ "redo": "Tee uudelleen", "roomDialog": "Aloita live-yhteistyö", "createNewRoom": "Luo huone", - "toggleFullScreen": "Koko näytön tila päälle/pois", - "toggleDarkMode": "Pimeä tila päälle/pois", - "toggleZenMode": "Zen-tila päälle", + "fullScreen": "Koko näyttö", + "darkMode": "Tumma tila", + "lightMode": "Vaalea tila", + "zenMode": "Zen-tila", "exitZenMode": "Poistu zen-tilasta" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Ulkopuolisen piirroksen lataaminen korvaa nykyisen sisältösi. Haluatko jatkaa?", "errorLoadingLibrary": "Kolmannen osapuolen kirjastoa ladattaessa tapahtui virhe.", "confirmAddLibrary": "Tämä lisää {{numShapes}} muotoa kirjastoosi. Oletko varma?", - "imageDoesNotContainScene": "Kuvatiedosto ei sisällä teostietoja. Valitsitko sisällyttää ne tallennusvaiheessa?", + "imageDoesNotContainScene": "Kuvien lisääminen ei ole tällä hetkellä mahdollista.\n\nHaluatko tuoda piirroksen? Tämä kuva ei näytä sisältävän tarvittavia tietoja. Oletko ottanut piirrostietojen tallennuksen käyttöön viennin aikana?", "cannotRestoreFromImage": "Teosta ei voitu palauttaa tästä kuvatiedostosta" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "Paina ja raahaa, päästä irti kun olet valmis", "text": "Vinkki: voit myös lisätä tekstiä kaksoisnapsauttamalla mihin tahansa valintatyökalulla", "linearElementMulti": "Klikkaa viimeistä pistettä, paina Escape tai paina Enter lopettaaksesi", + "lockAngle": "Voit rajoittaa kulmaa pitämällä SHIFT pohjassa", "resize": "Voit rajoittaa mittasuhteet pitämällä SHIFT pohjassa kun muutat kokoa, pidä ALT pohjassa muuttaaksesi kokoa keskipisteen suhteen", "rotate": "Voit rajoittaa kulman pitämällä SHIFT pohjassa pyörittäessäsi", "lineEditor_info": "Kaksoisnapauta tai paina Enter muokataksesi pisteitä", diff --git a/src/locales/fr-FR.json b/src/locales/fr-FR.json index b46fe3160..40f1d7a88 100644 --- a/src/locales/fr-FR.json +++ b/src/locales/fr-FR.json @@ -76,22 +76,21 @@ "group": "Grouper la sélection", "ungroup": "Dégrouper la sélection", "collaborators": "Collaborateurs", - "toggleGridMode": "Basculer le mode grille", - "toggleStats": "Activer/désactiver les stats pour les nerds", + "gridMode": "Mode grille", "addToLibrary": "Ajouter à la bibliothèque", "removeFromLibrary": "Supprimer de la bibliothèque", "libraryLoadingMessage": "Chargement de la bibliothèque...", "libraries": "Explorer les bibliothèques", "loadingScene": "Chargement de la scène...", - "align": "Aligner", + "align": "Alignement", "alignTop": "Aligner en haut", "alignBottom": "Aligner en bas", "alignLeft": "Aligner à gauche", "alignRight": "Aligner à droite", "centerVertically": "Centrer verticalement", "centerHorizontally": "Centrer horizontalement", - "distributeHorizontally": "Répartir horizontalement", - "distributeVertically": "Répartir verticalement" + "distributeHorizontally": "Distribuer horizontalement", + "distributeVertically": "Distribuer verticalement" }, "buttons": { "clearReset": "Effacer le canvas & réinitialiser la couleur d'arrière-plan", @@ -118,9 +117,10 @@ "redo": "Rétablir", "roomDialog": "Démarrer le collaboration en temps réel", "createNewRoom": "Créer un nouveau salon", - "toggleFullScreen": "Activer/désactiver le mode plein écran", - "toggleDarkMode": "Activer/désactiver le mode sombre", - "toggleZenMode": "Activer/désactiver le mode zen", + "fullScreen": "Plein écran", + "darkMode": "Mode sombre", + "lightMode": "Mode Clair", + "zenMode": "Mode Zen", "exitZenMode": "Quitter le mode zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Le chargement d'un dessin externe remplacera votre contenu actuel. Souhaitez-vous continuer ?", "errorLoadingLibrary": "Une erreur s'est produite lors du chargement de la bibliothèque tierce.", "confirmAddLibrary": "Cela va ajouter {{numShapes}} forme(s) à votre bibliothèque. Êtes-vous sûr(e) ?", - "imageDoesNotContainScene": "Le fichier image ne contient pas de données de scène. L'avez-vous activé lors de l'export ?", + "imageDoesNotContainScene": "L'importation des images n'est pas prise en charge pour le moment.\n\nVoulez-vous importer une scène ? Cette image ne semble pas contenir de données de scène. Avez-vous activé cette option lors de l'exportation ?", "cannotRestoreFromImage": "Impossible de restaurer la scène depuis ce fichier image" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "Cliquez et faites glissez, relâchez quand vous avez terminé", "text": "Astuce : vous pouvez également ajouter du texte en double-cliquant n'importe où avec l'outil de sélection", "linearElementMulti": "Cliquez sur le dernier point ou appuyez sur Échap ou Entrée pour terminer", + "lockAngle": "Vous pouvez contraindre l'angle en maintenant SHIFT", "resize": "Vous pouvez conserver les proportions en maintenant la touche SHIFT pendant le redimensionnement,\nen maintenant la touche ALT pour redimensionner par rapport au centre", "rotate": "Vous pouvez contraindre les angles en maintenant MAJ enfoncé pendant la rotation", "lineEditor_info": "Double-cliquez ou appuyez sur Entrée pour éditer les points", @@ -169,8 +170,8 @@ }, "canvasError": { "cannotShowPreview": "Impossible d’afficher l’aperçu", - "canvasTooBig": "Le tableau peut être trop grand.", - "canvasTooBigTip": "Astuce : essayez de rapprocher un peu les éléments les plus éloignés ensemble." + "canvasTooBig": "Le dessin est peut-être trop grand.", + "canvasTooBigTip": "Conseil : essayez de rapprocher un peu plus les éléments les plus éloignés." }, "errorSplash": { "headingMain_pre": "Une erreur est survenue. Essayez ", @@ -227,7 +228,7 @@ "scene": "Scène", "selected": "Sélectionné", "storage": "Stockage", - "title": "Stats pour nerds", + "title": "Stats pour les nerds", "total": "Total", "width": "Largeur" } diff --git a/src/locales/he-IL.json b/src/locales/he-IL.json index a3b43ee23..18c6fbc39 100644 --- a/src/locales/he-IL.json +++ b/src/locales/he-IL.json @@ -2,9 +2,9 @@ "labels": { "paste": "הדבק", "selectAll": "בחר הכל", - "multiSelect": "", - "moveCanvas": "", - "cut": "", + "multiSelect": "הוסף אובייקט לבחירה", + "moveCanvas": "הזז את הקנבס", + "cut": "חתוך", "copy": "העתק", "copyAsPng": "העתק ללוח כ PNG", "copyAsSvg": "העתק ללוח כ SVG", @@ -26,20 +26,20 @@ "sloppiness": "סגנון", "opacity": "אטימות", "textAlign": "יישור טקסט", - "edges": "", - "sharp": "", - "round": "", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", + "edges": "קצוות", + "sharp": "חד", + "round": "עגול", + "arrowheads": "ראשי חצים", + "arrowhead_none": "ללא", + "arrowhead_arrow": "חץ", + "arrowhead_bar": "שורה", + "arrowhead_dot": "נקודה", "fontSize": "גודל גופן", "fontFamily": "סוג הגופן", "onlySelected": "רק מה שנבחר", "withBackground": "עם רקע", - "exportEmbedScene": "", - "exportEmbedScene_details": "", + "exportEmbedScene": "שלב את התצוגה בקובץ המיוצא", + "exportEmbedScene_details": "מידע התצוגה יישמר לקובץ המיוצא מסוג PNG/SVG כך שיהיה ניתן לשחזרה ממנו.\nהפעולה תגדיל את גודל הקובץ המיוצא.", "addWatermark": "הוסף \"נוצר באמצעות Excalidraw\"", "handDrawn": "כתב יד", "normal": "רגיל", @@ -60,7 +60,7 @@ "architect": "ארכיטקט", "artist": "אמן", "cartoonist": "קריקטוריסט", - "fileTitle": "", + "fileTitle": "כותרת הקובץ", "colorPicker": "בחירת צבע", "canvasBackground": "רקע הלוח", "drawingCanvas": "לוח ציור", @@ -69,29 +69,28 @@ "language": "שפה", "createRoom": "התחל שיתוף פעולה חי", "duplicateSelection": "שכפל", - "untitled": "", + "untitled": "ללא כותרת", "name": "שם", "yourName": "שם", "madeWithExcalidraw": "נוצר באמצעות Excalidraw", "group": "אחד לקבוצה", "ungroup": "פרק קבוצה", - "collaborators": "", - "toggleGridMode": "", - "toggleStats": "", - "addToLibrary": "", - "removeFromLibrary": "", - "libraryLoadingMessage": "", - "libraries": "", - "loadingScene": "", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "collaborators": "שותפים", + "gridMode": "", + "addToLibrary": "הוסף לספריה", + "removeFromLibrary": "הסר מספריה", + "libraryLoadingMessage": "טוען ספריה...", + "libraries": "דפדף בספריות", + "loadingScene": "טוען תצוגה...", + "align": "יישר", + "alignTop": "יישר למעלה", + "alignBottom": "יישר למטה", + "alignLeft": "יישר לשמאל", + "alignRight": "יישר לימין", + "centerVertically": "מרכז אנכית", + "centerHorizontally": "מרכז אופקית", + "distributeHorizontally": "חלוקה אופקית", + "distributeVertically": "חלוקה אנכית" }, "buttons": { "clearReset": "אפס את הלוח", @@ -100,9 +99,9 @@ "exportToSvg": "יצא ל SVG", "copyToClipboard": "העתק ללוח", "copyPngToClipboard": "העתק PNG ללוח", - "scale": "", + "scale": "קנה מידה", "save": "שמור", - "saveAs": "", + "saveAs": "שמירה בשם", "load": "טען", "getShareableLink": "קבל קישור לשיתוף", "close": "סגור", @@ -118,26 +117,27 @@ "redo": "בצע מחדש", "roomDialog": "התחל שיתוף חי", "createNewRoom": "צור חדר", - "toggleFullScreen": "הפעל/הפסק מסך מלא", - "toggleDarkMode": "", - "toggleZenMode": "התחל/הפסק מצב תפריט מרחף", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "צא ממצב תפריט מרחף" }, "alerts": { "clearReset": "פעולה זו תנקה את כל הלוח. אתה בטוח?", "couldNotCreateShareableLink": "לא ניתן לייצר לינק לשיתוף.", - "couldNotCreateShareableLinkTooBig": "", + "couldNotCreateShareableLinkTooBig": "לא הצלחנו לייצר קישור לשיתוף: התצוגה גדולה מדי", "couldNotLoadInvalidFile": "לא ניתן לטעון קובץ שאיננו תואם", "importBackendFailed": "ייבוא מהשרת נכשל.", "cannotExportEmptyCanvas": "לא ניתן לייצא לוח ריק.", "couldNotCopyToClipboard": "לא ניתן להעתיק ללוח. נסה להשתמש בדפדפן Chrome.", "decryptFailed": "לא ניתן לפענח מידע.", "uploadedSecurly": "ההעלאה הוצפנה מקצה לקצה, ולכן שרת Excalidraw וצד שלישי לא יכולים לקרוא את התוכן.", - "loadSceneOverridePrompt": "", - "errorLoadingLibrary": "", - "confirmAddLibrary": "", + "loadSceneOverridePrompt": "טעינה של ציור חיצוני תחליף את התוכן הקיים שלך. האם תרצה להמשיך?", + "errorLoadingLibrary": "קרתה שגיאה בטעינת הספריה החיצונית.", + "confirmAddLibrary": "הפעולה תוסיף {{numShapes}} צורה(ות) לספריה שלך. האם אתה בטוח?", "imageDoesNotContainScene": "", - "cannotRestoreFromImage": "" + "cannotRestoreFromImage": "לא הצלחנו לשחזר את התצוגה מקובץ התמונה" }, "toolBar": { "selection": "בחירה", @@ -148,7 +148,7 @@ "arrow": "חץ", "line": "קו", "text": "טקסט", - "library": "", + "library": "ספריה", "lock": "השאר את הכלי הנבחר פעיל גם לאחר סיום הציור" }, "headings": { @@ -159,18 +159,19 @@ "hints": { "linearElement": "הקלק בשביל לבחור נקודות מרובות, גרור בשביל קו בודד", "freeDraw": "לחץ וגרור, שחרר כשסיימת", - "text": "", + "text": "טיפ: אפשר להוסיף טקסט על ידי לחיצה כפולה בכל מקום עם כלי הבחירה", "linearElementMulti": "הקלק על הנקודה האחרונה או הקש Escape או Enter לסיום", + "lockAngle": "", "resize": "ניתן להגביל פרופורציות על ידי לחיצה על SHIFT תוך כדי שינוי גודל,\nהחזק ALT בשביל לשנות גודל ביחס למרכז", "rotate": "ניתן להגביל זוויות על ידי לחיצה על SHIFT תוך כדי סיבוב", - "lineEditor_info": "", - "lineEditor_pointSelected": "", - "lineEditor_nothingSelected": "" + "lineEditor_info": "לחץ לחיצה כפולה או אנטר לעריכת הנקודות", + "lineEditor_pointSelected": "לחץ על Delete להסרת נקודה, CtrlOrCmd+D לשכפל, או גרור להזזה", + "lineEditor_nothingSelected": "בחר נקודה להזזה או הסרה, או החזק את כפתור Alt והקלק להוספת נקודות חדשות" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "לא הצלחנו להציג את התצוגה המקדימה", + "canvasTooBig": "הקנבס עלול להיות גדול מדי.", + "canvasTooBigTip": "טיפ: נסה להזיז את האלמנטים הרחוקים ביותר מעט קרוב יותר יחד." }, "errorSplash": { "headingMain_pre": "אירעה שגיאה. נסה ", @@ -213,22 +214,22 @@ "textNewLine": "הוסף שורה חדשה (טקסט)", "textFinish": "סיים עריכה (טקסט)", "zoomToFit": "זום להתאמת כל האלמנטים למסך", - "zoomToSelection": "", - "preventBinding": "" + "zoomToSelection": "התמקד בבחירה", + "preventBinding": "מנע השתלבות חצים" }, "encrypted": { "tooltip": "הרישומים שלך מוצפנים מקצה לקצה כך שהשרתים של Excalidraw לא יראו אותם לעולם." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", - "scene": "", - "selected": "", - "storage": "", - "title": "", - "total": "", - "width": "" + "angle": "זווית", + "element": "אלמנט", + "elements": "אלמנטים", + "height": "גובה", + "scene": "תצוגה", + "selected": "נבחר/ים", + "storage": "אחסון", + "title": "סטטיסטיקות לחנונים", + "total": "סה״כ", + "width": "רוחב" } } diff --git a/src/locales/hi-IN.json b/src/locales/hi-IN.json index bce13e1ee..6b5a6c7c3 100644 --- a/src/locales/hi-IN.json +++ b/src/locales/hi-IN.json @@ -29,11 +29,11 @@ "edges": "किनारा", "sharp": "नुकीला", "round": "गोल", - "arrowheads": "", - "arrowhead_none": "", + "arrowheads": "तीर शीर्ष", + "arrowhead_none": "कोई भी नहीं", "arrowhead_arrow": "तीर", - "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowhead_bar": "बार", + "arrowhead_dot": "बिंदु", "fontSize": "फ़ॉन्ट का आकार", "fontFamily": "फ़ॉन्ट का परिवार", "onlySelected": "केवल चयनित", @@ -76,8 +76,7 @@ "group": "समूह चयन", "ungroup": "समूह चयन असमूहीकृत करें", "collaborators": "सहयोगी", - "toggleGridMode": "टॉगल ग्रिड मोड", - "toggleStats": "", + "gridMode": "", "addToLibrary": "लाइब्रेरी से जोड़ें", "removeFromLibrary": "लाइब्रेरी से निकालें", "libraryLoadingMessage": "लाइब्रेरी खुल रही है", @@ -118,9 +117,10 @@ "redo": "फिर से करें", "roomDialog": "लाइव सहयोग शुरू करें", "createNewRoom": "एक नया कमरा बनाएं", - "toggleFullScreen": "पूर्णस्क्रीन चालू करें", - "toggleDarkMode": "", - "toggleZenMode": "टॉगल ज़ेन मोड", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "जेन मोड से बाहर निकलें" }, "alerts": { @@ -161,6 +161,7 @@ "freeDraw": "क्लिक करें और खींचें। समाप्त करने के लिए, छोड़ो", "text": "", "linearElementMulti": "अंतिम बिंदु पर क्लिक करें या समाप्त होने के लिए एस्केप या एंटर दबाएं", + "lockAngle": "", "resize": "आकार बदलते समय आप SHIFT को पकड़ कर अनुपात में कमी कर सकते हैं,\nकेंद्र से आकार बदलने के लिए ALT दबाए रखें", "rotate": "आप घूर्णन करते समय SHIFT पकड़कर कोणों को विवश कर सकते हैं", "lineEditor_info": "बिंदुओं को संपादित करने के लिए Enter पर डबल-क्लिक करें या दबाएँ", diff --git a/src/locales/hu-HU.json b/src/locales/hu-HU.json index 20a643713..a7f958333 100644 --- a/src/locales/hu-HU.json +++ b/src/locales/hu-HU.json @@ -2,96 +2,95 @@ "labels": { "paste": "Beillesztés", "selectAll": "Összes kijelölése", - "multiSelect": "", - "moveCanvas": "", - "cut": "", + "multiSelect": "Elem hozzáadása a kiválasztáshoz", + "moveCanvas": "Vászon mozgatása", + "cut": "Kivágás", "copy": "Másolás", "copyAsPng": "Vágólapra másolás mint PNG", "copyAsSvg": "Vágólapra másolás mint SVG", "bringForward": "Előrébb hozás", - "sendToBack": "", - "bringToFront": "", - "sendBackward": "", + "sendToBack": "Hátraküldés", + "bringToFront": "Előrehozás", + "sendBackward": "Hátrébb küldés", "delete": "Törlés", - "copyStyles": "", - "pasteStyles": "", + "copyStyles": "Stílus másolása", + "pasteStyles": "Stílus beillesztése", "stroke": "Körvonal", "background": "Háttér", "fill": "Kitöltés", - "strokeWidth": "", - "strokeStyle": "", - "strokeStyle_solid": "", - "strokeStyle_dashed": "", - "strokeStyle_dotted": "", + "strokeWidth": "Körvonal vastagsága", + "strokeStyle": "Körvonal stílusa", + "strokeStyle_solid": "Kitöltött", + "strokeStyle_dashed": "Szaggatott", + "strokeStyle_dotted": "Pontozott", "sloppiness": "Stílus", "opacity": "Áttetszőség", - "textAlign": "", - "edges": "", - "sharp": "", - "round": "", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", - "fontSize": "", - "fontFamily": "", + "textAlign": "Szöveg igazítása", + "edges": "Szélek", + "sharp": "Éles", + "round": "Kerek", + "arrowheads": "Nyílhegyek", + "arrowhead_none": "Nincs", + "arrowhead_arrow": "Nyíl", + "arrowhead_bar": "Oszlop", + "arrowhead_dot": "Pont", + "fontSize": "Betűméret", + "fontFamily": "Betűkészlet család", "onlySelected": "Csak a kiválasztott", - "withBackground": "Háttérrel együtt", - "exportEmbedScene": "", + "withBackground": "", + "exportEmbedScene": "Jelenet beágyazása az exportált fájlba", "exportEmbedScene_details": "", - "addWatermark": "", - "handDrawn": "", + "addWatermark": "Add hozzá, hogy \"Excalidraw-val készült\"", + "handDrawn": "Kézzel rajzolt", "normal": "Normál", "code": "Code", "small": "Kicsi", "medium": "Közepes", "large": "Nagy", - "veryLarge": "", + "veryLarge": "Nagyon nagy", "solid": "Kitöltött", "hachure": "Vonalkázott", - "crossHatch": "", + "crossHatch": "Keresztcsíkozott", "thin": "Vékony", "bold": "Félkövér", "left": "Bal", - "center": "", - "right": "", - "extraBold": "", + "center": "Közép", + "right": "Jobb", + "extraBold": "Extra Félkövér", "architect": "Tervezői", "artist": "Művészi", "cartoonist": "Karikatúrás", - "fileTitle": "", + "fileTitle": "Fájl címe", "colorPicker": "Színválasztó", "canvasBackground": "Vászon háttérszíne", - "drawingCanvas": "", + "drawingCanvas": "Rajzvászon", "layers": "Rétegek", "actions": "Műveletek", "language": "Nyelv", "createRoom": "Élő együttmüködés megosztása", - "duplicateSelection": "", - "untitled": "", + "duplicateSelection": "Duplikálás", + "untitled": "Névtelen", "name": "Név", - "yourName": "", - "madeWithExcalidraw": "", - "group": "", - "ungroup": "", - "collaborators": "", - "toggleGridMode": "", - "toggleStats": "", - "addToLibrary": "", - "removeFromLibrary": "", - "libraryLoadingMessage": "", - "libraries": "", - "loadingScene": "", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "yourName": "Neved", + "madeWithExcalidraw": "Excalidraw-val készült", + "group": "Csoportosítás", + "ungroup": "Csoportbontás", + "collaborators": "Közreműködők", + "gridMode": "", + "addToLibrary": "Hozzáadás a könyvtárhoz", + "removeFromLibrary": "Eltávólítás a könyvtárból", + "libraryLoadingMessage": "Könyvtár betöltése...", + "libraries": "Könyvtárak böngészése", + "loadingScene": "Jelenet betöltése...", + "align": "Igazítás", + "alignTop": "Felülre igazítás", + "alignBottom": "Alulra igazítás", + "alignLeft": "Balra igazítás", + "alignRight": "Jobbra igazítás", + "centerVertically": "Függőlegesen középre igazított", + "centerHorizontally": "Vízszintesen középre igazított", + "distributeHorizontally": "Vízszintes elosztás", + "distributeVertically": "Függőleges elosztás" }, "buttons": { "clearReset": "Vászon törlése", @@ -100,13 +99,13 @@ "exportToSvg": "Exportálás SVG-be", "copyToClipboard": "Vágólapra másolás", "copyPngToClipboard": "PNG másolása a vágólapra", - "scale": "", + "scale": "Nagyítás", "save": "Mentés", - "saveAs": "", + "saveAs": "Mentés másként", "load": "Betöltés", "getShareableLink": "Megosztható link létrehozása", "close": "Bezárás", - "selectLanguage": "", + "selectLanguage": "Nyelv kiválasztása", "scrollBackToContent": "Visszagörgetés a tartalomhoz", "zoomIn": "Nagyítás", "zoomOut": "Kicsinyítés", @@ -118,37 +117,38 @@ "redo": "Újra végrehajtás", "roomDialog": "Élő együttműködés indítása", "createNewRoom": "Új szoba létrehozása", - "toggleFullScreen": "", - "toggleDarkMode": "", - "toggleZenMode": "", - "exitZenMode": "" + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", + "exitZenMode": "Zen mód elhagyása" }, "alerts": { "clearReset": "Ez a művelet törli a vászont. Biztos benne?", "couldNotCreateShareableLink": "Nem sikerült megosztható linket létrehozni.", - "couldNotCreateShareableLinkTooBig": "", - "couldNotLoadInvalidFile": "", + "couldNotCreateShareableLinkTooBig": "Nem sikerült megosztható linket látrehozni: túl nagy a jelenet", + "couldNotLoadInvalidFile": "Nem sikerült betölteni a helytelen fájlt", "importBackendFailed": "Nem sikerült betölteni a szerverről.", "cannotExportEmptyCanvas": "Üres vászont nem lehet exportálni.", "couldNotCopyToClipboard": "Nem sikerült vágólapra menteni. Próbálja meg Chrome böngészővel.", - "decryptFailed": "Nem sikerült dekódolni az adatot.", + "decryptFailed": "Nem sikerült visszafejteni a titkosított adatot.", "uploadedSecurly": "A feltöltést végpontok közötti titkosítással biztosítottuk, ami azt jelenti, hogy az Excalidraw szerver és harmadik felek nem tudják elolvasni a feltöltés tartalmát.", - "loadSceneOverridePrompt": "", - "errorLoadingLibrary": "", - "confirmAddLibrary": "", + "loadSceneOverridePrompt": "A betöltött külső rajz felül fogja írnia meglévőt. Szeretnéd folytatni?", + "errorLoadingLibrary": "Hibába ütközött a harmarmadik féltől származó könyvtár betöltése.", + "confirmAddLibrary": "Ez a művelet {{numShapes}} formát fog hozzáadni a könyvtáradhoz. Biztos vagy benne?", "imageDoesNotContainScene": "", "cannotRestoreFromImage": "" }, "toolBar": { "selection": "Kiválasztás", - "draw": "", + "draw": "Szabadkézi rajz", "rectangle": "Téglalap", "diamond": "Rombusz", "ellipse": "Ellipszis", "arrow": "Nyíl", "line": "Vonal", "text": "Szöveg", - "library": "", + "library": "Könyvtár", "lock": "Rajzolás után az aktív eszközt tartsa kiválasztva" }, "headings": { @@ -158,19 +158,20 @@ }, "hints": { "linearElement": "Kattintson a több pont elindításához, húzza az egyenes vonalhoz", - "freeDraw": "", - "text": "", + "freeDraw": "Kattints és húzd, majd engedd el, amikor végeztél", + "text": "Tipp: A kiválasztó eszközzel bárhol létrehozhatsz szöveget dupla kattintással", "linearElementMulti": "Kattintson az utolsó pontra, vagy nyomja meg az Escape vagy az Enter billentyűt a befejezéshez", + "lockAngle": "", "resize": "", "rotate": "A SHIFT billentyű lenyomva tartásával korlátozhatja a szögek illesztését", - "lineEditor_info": "", - "lineEditor_pointSelected": "", - "lineEditor_nothingSelected": "" + "lineEditor_info": "Kattints duplán, vagy nyomj entert a pontok szerkesztéséhez", + "lineEditor_pointSelected": "Nyomd meg a delete gombot a pont eltávolításához, Ctrl vagy Cmd + D-t a duplikáláshoz, vagy húzva mozgasd", + "lineEditor_nothingSelected": "Válassz ki egy pontot a mozgatáshoz vagy törtléshez, vagy az Alt lenyomása mellett kattintva hozz létre új pontokat" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "Előnézet nem jeleníthető meg", + "canvasTooBig": "A vászon talán túl nagy.", + "canvasTooBigTip": "Tipp: próbáld meg a legtávolabbi elemeket közelebb mozgazni egy máshoz." }, "errorSplash": { "headingMain_pre": "Hiba történt. Próbálja ", @@ -192,43 +193,43 @@ "button_stopSession": "Munkamenet leállítása", "desc_inProgressIntro": "Az élő együttműködési munkamenet folyamatban van.", "desc_shareLink": "Ossza meg ezt a linket bárkivel, akivel együtt szeretne működni:", - "desc_exitSession": "" + "desc_exitSession": "Az munkamenet leállítása kilépteti önt a szobából, de folytathatja a munkát a saját gépén. Vegye figyelembe, hogy ez nem érinti más emberek munkáját és ők továbbra is együttműködhetnek a saját változatukon." }, "errorDialog": { - "title": "" + "title": "Hiba" }, "shortcutsDialog": { - "title": "", - "shapes": "", - "or": "", - "click": "", - "drag": "", - "curvedArrow": "", - "curvedLine": "", - "editor": "", - "view": "", - "blog": "", - "howto": "", - "github": "", - "textNewLine": "", - "textFinish": "", + "title": "Gyorsbillentyűk", + "shapes": "Formák", + "or": "vagy", + "click": "klikk", + "drag": "húzd", + "curvedArrow": "Ívelt nyíl", + "curvedLine": "Ívelt vonal", + "editor": "Szerkesztő", + "view": "Nézet", + "blog": "Olvasd a blogunkat", + "howto": "Kövesd az útmutatóinkat", + "github": "Hibát találtál? Küld be", + "textNewLine": "Új sor hozzáadása (szöveg)", + "textFinish": "Szerkesztés befejezése (szöveg)", "zoomToFit": "", - "zoomToSelection": "", + "zoomToSelection": "Kijelölésre nagyítás", "preventBinding": "" }, "encrypted": { "tooltip": "" }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", + "angle": "Szög", + "element": "Elem", + "elements": "Elemek", + "height": "Magasság", "scene": "", - "selected": "", - "storage": "", + "selected": "Kiválasztott", + "storage": "Tárhely", "title": "", - "total": "", - "width": "" + "total": "Összesen", + "width": "Szélesség" } } diff --git a/src/locales/id-ID.json b/src/locales/id-ID.json index 60fb87846..91ec90fa6 100644 --- a/src/locales/id-ID.json +++ b/src/locales/id-ID.json @@ -37,7 +37,7 @@ "fontSize": "Ukuran font", "fontFamily": "Jenis font", "onlySelected": "Hanya yang Dipilih", - "withBackground": "Dengan Latar", + "withBackground": "Dengan latar", "exportEmbedScene": "Sematkan pemandangan ke dalam file yang diekspor", "exportEmbedScene_details": "Data pemandangan akan disimpan dalam file PNG/SVG yang diekspor, sehingga pemandangan itu dapat dipulihkan darinya.\nAkan membesarkan ukuran file yang diekspor.", "addWatermark": "Tambahkan \"Dibuat dengan Excalidraw\"", @@ -76,8 +76,7 @@ "group": "Kelompokan pilihan", "ungroup": "Pisahkan pilihan", "collaborators": "Kolaborator", - "toggleGridMode": "Aktifkan/Matikan mode kisi", - "toggleStats": "Aktifkan statistik untuk nerd", + "gridMode": "Mode grid", "addToLibrary": "Tambahkan ke pustaka", "removeFromLibrary": "Hapus dari pustaka", "libraryLoadingMessage": "Memuat pustaka...", @@ -118,9 +117,10 @@ "redo": "Ulangi", "roomDialog": "Mulai kolaborasi langsung", "createNewRoom": "Buat ruang baru", - "toggleFullScreen": "Beralih ke layar penuh", - "toggleDarkMode": "Aktifkan/Matikan mode gelap", - "toggleZenMode": "Aktifkan/Matikan mode zen", + "fullScreen": "Layar penuh", + "darkMode": "Mode gelap", + "lightMode": "Mode terang", + "zenMode": "Mode zen", "exitZenMode": "Keluar dari mode zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Memuat gambar external akan mengganti konten Anda yang ada. Apakah Anda ingin melanjutkan?", "errorLoadingLibrary": "Terdapat kesalahan dalam memuat pustaka pihak ketiga.", "confirmAddLibrary": "Ini akan menambahkan {{numShapes}} bentuk ke pustaka Anda. Anda yakin?", - "imageDoesNotContainScene": "File gambar tidak berisi data pemandangan. Apa Anda sudah aktifkan ini selama ekspor?", + "imageDoesNotContainScene": "Mengimpor gambar tidak didukung saat ini.\n\nApakah Anda ingin impor pemandangan? Gambar ini tidak berisi data pemandangan. Sudah ka Anda aktifkan ini ketika ekspor?", "cannotRestoreFromImage": "Pemandangan tidak dapat dipulihkan dari file gambar ini" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "Klik dan seret, lepaskan jika Anda selesai", "text": "Tip: Anda juga dapat menambahkan teks dengan klik ganda di mana saja dengan alat pemilihan", "linearElementMulti": "Klik pada titik akhir atau tekan Escape atau Enter untuk menyelesaikan", + "lockAngle": "Anda dapat menjaga sudut dengan menahan SHIFT", "resize": "Anda dapat menjaga proposi dengan menekan SHIFT sambil mengubah ukuran,\ntekan AlT untuk mengubah ukuran dari tengah", "rotate": "Anda dapat menjaga sudut dengan menahan SHIFT sambil memutar", "lineEditor_info": "Klik ganda atau tekan Enter untuk mengedit titik", @@ -213,7 +214,7 @@ "textNewLine": "Tambahkan baris baru (teks)", "textFinish": "Selesai mengedit (teks)", "zoomToFit": "Perbesar agar sesuai dengan semua elemen", - "zoomToSelection": "", + "zoomToSelection": "Perbesar ke seleksi", "preventBinding": "Cegah pengikatan panah" }, "encrypted": { diff --git a/src/locales/it-IT.json b/src/locales/it-IT.json index ab01d2210..1ae5426cf 100644 --- a/src/locales/it-IT.json +++ b/src/locales/it-IT.json @@ -37,7 +37,7 @@ "fontSize": "Dimensione carattere", "fontFamily": "Carattere", "onlySelected": "Solo selezionati", - "withBackground": "Con Sfondo", + "withBackground": "Con sfondo", "exportEmbedScene": "Incorpora la scena nel file esportato", "exportEmbedScene_details": "I dati della scena saranno salvati nel file PNG/SVG esportato in modo che la scena possa essere ripristinata da esso.\nQuesto aumenterà la dimensione del file esportato.", "addWatermark": "Aggiungi \"Creato con Excalidraw\"", @@ -76,8 +76,7 @@ "group": "Crea gruppo da selezione", "ungroup": "Dividi gruppo da selezione", "collaborators": "Collaboratori", - "toggleGridMode": "Attiva/disattiva modalità griglia", - "toggleStats": "Attiva/disattiva statistiche per nerd", + "gridMode": "Modalità griglia", "addToLibrary": "Aggiungi alla biblioteca", "removeFromLibrary": "Rimuovi dalla biblioteca", "libraryLoadingMessage": "Caricamento della biblioteca...", @@ -118,9 +117,10 @@ "redo": "Ripeti", "roomDialog": "Inizia collaborazione in diretta", "createNewRoom": "Crea nuova stanza", - "toggleFullScreen": "Attiva/Disattiva schermo intero", - "toggleDarkMode": "Attiva tema scuro", - "toggleZenMode": "Attiva/Disattiva modalità zen", + "fullScreen": "Schermo intero", + "darkMode": "Tema scuro", + "lightMode": "Tema chiaro", + "zenMode": "Modalità Zen", "exitZenMode": "Uscire dalla modalità zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Se carichi questo disegno esterno, sostituirà quello che hai. Vuoi continuare?", "errorLoadingLibrary": "Si è verificato un errore nel caricamento della libreria di terze parti.", "confirmAddLibrary": "Questo aggiungerà {{numShapes}} forma(e) alla tua biblioteca. Sei sicuro?", - "imageDoesNotContainScene": "Il file immagine non contiene dati di scena. È stato abilitato durante l'esportazione?", + "imageDoesNotContainScene": "L'importazione di immagini al momento non è supportata.\n\nVuoi importare una scena? Questa immagine non sembra contenere alcun dato di scena. Hai abilitato questa opzione durante l'esportazione?", "cannotRestoreFromImage": "Impossibile ripristinare la scena da questo file immagine" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "Clicca e trascina, rilascia quando avrai finito", "text": "Suggerimento: puoi anche aggiungere del testo facendo doppio clic ovunque con lo strumento di selezione", "linearElementMulti": "Clicca sull'ultimo punto o premi Esc o Invio per finire", + "lockAngle": "Puoi limitare l'angolo tenendo premuto SHIFT", "resize": "Per vincolare le proporzioni, tenir premuto MAIUSC durante il ridimensionamento;\nper ridimensionare dal centro, tenir premuto ALT", "rotate": "Puoi mantenere gli angoli tenendo premuto SHIFT durante la rotazione", "lineEditor_info": "Fai doppio click o premi invio per modificare i punti", diff --git a/src/locales/ja-JP.json b/src/locales/ja-JP.json index c7fd2c0e4..83d1da9fe 100644 --- a/src/locales/ja-JP.json +++ b/src/locales/ja-JP.json @@ -37,7 +37,7 @@ "fontSize": "フォントの大きさ", "fontFamily": "フォントの種類", "onlySelected": "選択中のみ", - "withBackground": "背景を含める", + "withBackground": "", "exportEmbedScene": "エクスポートされたファイルにシーンを埋め込みます", "exportEmbedScene_details": "シーンデータはエクスポートされたPNG/SVGファイルに保存され、シーンを復元することができます。\nエクスポートされたファイルのサイズは増加します。", "addWatermark": "\"Made with Excalidraw\"と表示", @@ -76,8 +76,7 @@ "group": "図形のグループ化", "ungroup": "グループ化を解除", "collaborators": "共同編集者", - "toggleGridMode": "グリッドモードに切り替える", - "toggleStats": "", + "gridMode": "", "addToLibrary": "ライブラリに追加", "removeFromLibrary": "ライブラリから削除", "libraryLoadingMessage": "ライブラリを読み込み中...", @@ -118,9 +117,10 @@ "redo": "やり直し", "roomDialog": "共同編集を開始する", "createNewRoom": "新しい部屋を作成する", - "toggleFullScreen": "全画面表示に切り替える", - "toggleDarkMode": "ダークモードに切り替える", - "toggleZenMode": "集中モードに切り替える", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "集中モードをやめる" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "外部図面を読み込むと、既存のコンテンツが置き換わります。続行しますか?", "errorLoadingLibrary": "サードパーティライブラリの読み込み中にエラーが発生しました。", "confirmAddLibrary": "{{numShapes}} 個の図形をライブラリに追加します。よろしいですか?", - "imageDoesNotContainScene": "画像ファイルにシーンデータが含まれていません。エクスポート中にこれを有効にしましたか?", + "imageDoesNotContainScene": "", "cannotRestoreFromImage": "このイメージファイルからシーンを復元できませんでした" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "クリックしてドラッグします。離すと終了します", "text": "ヒント: 選択ツールを使用して任意の場所をダブルクリックしてテキストを追加することもできます", "linearElementMulti": "最後のポイントをクリックするか、エスケープまたはEnterを押して終了します", + "lockAngle": "", "resize": "サイズを変更中にSHIFTを押しすと比率を制御できます。Altを押すと中央からサイズを変更できます。", "rotate": "回転中にSHIFT キーを押すと角度を制限することができます", "lineEditor_info": "ポイントを編集するには、ダブルクリックまたはEnterキーを押します", diff --git a/src/locales/ko-KR.json b/src/locales/ko-KR.json index 3d77e7f9d..6c292249f 100644 --- a/src/locales/ko-KR.json +++ b/src/locales/ko-KR.json @@ -4,7 +4,7 @@ "selectAll": "전체 선택", "multiSelect": "선택 영역에 추가하기", "moveCanvas": "캔버스 이동", - "cut": "", + "cut": "잘라내기", "copy": "복사하기", "copyAsPng": "클립보드로 PNG 이미지 복사", "copyAsSvg": "클립보드로 SVG 이미지 복사", @@ -29,15 +29,15 @@ "edges": "가장자리", "sharp": "선명하게", "round": "둥글게", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", + "arrowheads": "화살표 모양", + "arrowhead_none": "없음", + "arrowhead_arrow": "화살표", "arrowhead_bar": "", "arrowhead_dot": "", "fontSize": "폰트 크기", "fontFamily": "폰트 스타일", "onlySelected": "선택한 항목만", - "withBackground": "배경 포함", + "withBackground": "", "exportEmbedScene": "", "exportEmbedScene_details": "", "addWatermark": "\"Made with Excalidraw\" 추가", @@ -76,8 +76,7 @@ "group": "그룹 생성", "ungroup": "그룹 해제", "collaborators": "공동 작업자", - "toggleGridMode": "격자 모드 켜기/끄기", - "toggleStats": "", + "gridMode": "", "addToLibrary": "라이브러리에 추가", "removeFromLibrary": "라이브러리에서 제거", "libraryLoadingMessage": "라이브러리 불러오는 중...", @@ -118,9 +117,10 @@ "redo": "다시 실행", "roomDialog": "실시간 협업 시작하기", "createNewRoom": "방 만들기", - "toggleFullScreen": "전체화면", - "toggleDarkMode": "다크 모드 켜기/끄기", - "toggleZenMode": "젠 모드 켜기/끄기", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "젠 모드 종료하기" }, "alerts": { @@ -161,6 +161,7 @@ "freeDraw": "클릭 후 드래그하세요. 완료되면 놓으세요.", "text": "", "linearElementMulti": "마지막 지점을 클릭하거나 Esc 또는 Enter 키를 눌러 완료하세요.", + "lockAngle": "", "resize": "", "rotate": "SHIFT 키를 누르면서 회전하면 각도를 제한할 수 있습니다.", "lineEditor_info": "포인트를 수정하려면 두 번 클릭하거나 엔터 키를 누르세요.", diff --git a/src/locales/my-MM.json b/src/locales/my-MM.json index 06aa72464..3bc213d85 100644 --- a/src/locales/my-MM.json +++ b/src/locales/my-MM.json @@ -37,7 +37,7 @@ "fontSize": "စာလုံးအရွယ်", "fontFamily": "စာလုံးပုံစံ", "onlySelected": "ရွေးထားသလောက်", - "withBackground": "နောက်ခံပါထည့်", + "withBackground": "", "exportEmbedScene": "မြင်ကွင်းပါမြှုပ်နှံ၍ထုတ်ပါ", "exportEmbedScene_details": "ထုတ်ယူလိုက်သော PNG/SVG ထဲမြင်ကွင်းအချက်အလက်များပါဝင်သဖြင့် ပြန်လည်ရယူနိုင်သော်လည်း ဖိုင်အရွယ်အစားကြီးပါမည်။", "addWatermark": "\"Excalidraw ဖြင့်ဖန်တီးသည်။\" စာသားထည့်", @@ -76,8 +76,7 @@ "group": "အုပ်စုဖွဲ့", "ungroup": "အုပ်စုဖျက်သိမ်း", "collaborators": "ပူးပေါင်းပါဝင်သူများ", - "toggleGridMode": "ဇယားကွက်ဖော်/ဖျောက်", - "toggleStats": "", + "gridMode": "", "addToLibrary": "မှတ်တမ်းတင်", "removeFromLibrary": "မှတ်တမ်းမှထုတ်", "libraryLoadingMessage": "မှတ်တမ်းအား တင်သွင်းနေသည်...", @@ -118,9 +117,10 @@ "redo": "ထပ်လုပ်", "roomDialog": "တိုက်ရိုက်ပူးပေါင်းမှုစတင်", "createNewRoom": "အခန်းသစ်ဖွဲ့", - "toggleFullScreen": "မြင်ကွင်းကျယ်ဖွင့်/ပိတ်", - "toggleDarkMode": "အလင်း/အမှောင်", - "toggleZenMode": "ဇင်မြင်ကွင်းဖွင့်/ပိတ်", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "ဇင်မြင်ကွင်းမှထွက်" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "လက်ရှိရေးဆွဲထားသမျှအား ပြင်ပမှတင်သွင်းသောပုံနှင့်အစားထိုးပါမည်။ ဆက်လက်ဆောင်ရွက်လိုပါသလား။", "errorLoadingLibrary": "ပြင်ပမှမှတ်တမ်းအားတင်သွင်းရာတွင်အမှားအယွင်းရှိနေသည်။", "confirmAddLibrary": "{{numShapes}} ခုသောပုံသဏ္ဌာန်အားမှတ်တမ်းတင်ပါမည်။ အတည်ပြုပါ။", - "imageDoesNotContainScene": "ပုံတွင် မြင်ကွင်းအချက်အလက်များမပါဝင်ပါ။ ပုံထုတ်ယူချိန်တွင်ထည့်သွင်းခဲ့ပါသလား။", + "imageDoesNotContainScene": "", "cannotRestoreFromImage": "ဤပုံဖြင့်မြင်ကွင်းပြန်လည်မရယူနိုင်ပါ။" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "ကလစ်နှိပ်၍ တရွတ်ဆွဲပါ၊ ပြီးလျှင်လွှတ်ပါ။", "text": "မှတ်ချက်။ ။မည်သည့်ကိရိယာရွေးထားသည်ဖြစ်စေ ကလစ်နှစ်ချက်နှိပ်၍စာသားထည့်နိုင်သည်", "linearElementMulti": "နောက်ဆုံးအမှတ်ပေါ်တွင်ကလစ်နှိပ်ခြင်း၊ Escape (သို့) Enter နှိပ်ခြင်းတို့ဖြင့်အဆုံးသတ်နိုင်", + "lockAngle": "", "resize": "အချိုးအစားကန့်သတ်ရန် Shift နှင့် ဗဟိုမှချိန်ညှိရန် Alt တို့ကိုနှိပ်ထားနိုင်သည်", "rotate": "Shift ကိုနှိပ်ထားခြင်းဖြင့် ထောင့်အလိုက်လှည့်နိုင်သည်", "lineEditor_info": "အမှတ်များပြင်ဆင်သတ်မှတ်ရင် ကလစ်နှစ်ချက် (သို့) Enter ကိုနှိပ်ပါ", diff --git a/src/locales/nb-NO.json b/src/locales/nb-NO.json index 6bfe88f6a..61eca1e6b 100644 --- a/src/locales/nb-NO.json +++ b/src/locales/nb-NO.json @@ -37,7 +37,7 @@ "fontSize": "Skriftstørrelse", "fontFamily": "Fontfamilie", "onlySelected": "Kun valgte", - "withBackground": "Inkluder bakgrunn", + "withBackground": "Med bakgrunn", "exportEmbedScene": "Bygg inn scenen i den eksporterte filen", "exportEmbedScene_details": "Scenedata vil bli lagret i den eksporterte PNG/SVG-filen, slik at scenen kan gjenopprettes fra den.\nDet vil øke den eksporterte filstørrelsen.", "addWatermark": "Legg til \"Laget med Excalidraw\"", @@ -76,8 +76,7 @@ "group": "Gruppér utvalg", "ungroup": "Avgruppér utvalg", "collaborators": "Samarbeidspartnere", - "toggleGridMode": "Slå av/på rutenett", - "toggleStats": "Skru av/på statistikk for nerder", + "gridMode": "Rutevisning", "addToLibrary": "Legg til i bibliotek", "removeFromLibrary": "Fjern fra bibliotek", "libraryLoadingMessage": "Laster bibliotek...", @@ -118,9 +117,10 @@ "redo": "Gjør om", "roomDialog": "Start sanntids-samarbeid", "createNewRoom": "Opprett et nytt rom", - "toggleFullScreen": "Skru fullskjerm av/på", - "toggleDarkMode": "Skru mørk modus av/på", - "toggleZenMode": "Slå av/på zen-modus", + "fullScreen": "Fullskjerm", + "darkMode": "Mørk modus", + "lightMode": "Lys modus", + "zenMode": "Zen-modus", "exitZenMode": "Avslutt zen-modus" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Å laste inn ekstern tegning vil erstatte det eksisterende innholdet. Ønsker du å fortsette?", "errorLoadingLibrary": "Det oppstod en feil under lasting av tredjepartsbiblioteket.", "confirmAddLibrary": "Dette vil legge til {{numShapes}} figur(er) i biblioteket ditt. Er du sikker?", - "imageDoesNotContainScene": "Bildefilen inneholder ikke scenedata. Har du aktivert dette under eksport?", + "imageDoesNotContainScene": "Importering av bilder støttes ikke for øyeblikket.\n\nVil du importere en scene? Dette bildet ser ikke ut til å inneholde noen scene-data. Har du aktivert dette under eksporten?", "cannotRestoreFromImage": "Scenen kunne ikke gjenopprettes fra denne bildefilen" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre", + "lockAngle": "Du kan låse vinkelen ved å holde nede SHIFT", "resize": "Du kan beholde forholdet ved å trykke SHIFT mens du endrer størrelse,\ntrykk ALT for å endre størrelsen fra midten", "rotate": "Du kan låse vinklene ved å holde SHIFT mens du roterer", "lineEditor_info": "Dobbeltklikk eller trykk Enter for å redigere punkter", diff --git a/src/locales/nl-NL.json b/src/locales/nl-NL.json index e9df29cc4..febf136dc 100644 --- a/src/locales/nl-NL.json +++ b/src/locales/nl-NL.json @@ -4,12 +4,12 @@ "selectAll": "Alles selecteren", "multiSelect": "Voeg element toe aan selectie", "moveCanvas": "Canvas verplaatsen", - "cut": "", + "cut": "Knip", "copy": "Kopiëren", "copyAsPng": "Kopieer als PNG", - "copyAsSvg": "Kopieer als SVG", + "copyAsSvg": "Kopieer naar klembord als SVG", "bringForward": "Breng naar voren", - "sendToBack": "Breng naar achtergrond", + "sendToBack": "Stuur naar achtergrond", "bringToFront": "Breng naar voorgrond", "sendBackward": "Breng naar achter", "delete": "Verwijderen", @@ -29,17 +29,17 @@ "edges": "Randen", "sharp": "Hoekig", "round": "Rond", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowheads": "Pijlpunten", + "arrowhead_none": "Geen", + "arrowhead_arrow": "Pijl", + "arrowhead_bar": "Balk", + "arrowhead_dot": "Punt", "fontSize": "Tekstgrootte", "fontFamily": "Lettertype", "onlySelected": "Enkel geselecteerde", "withBackground": "Met achtergrond", - "exportEmbedScene": "", - "exportEmbedScene_details": "", + "exportEmbedScene": "Scène in geëxporteerd bestand invoegen", + "exportEmbedScene_details": "Scènegegevens worden in het geëxporteerde PNG/SVG-bestand opgeslagen zodat de scène kan worden hersteld.\nDe grootte van de geëxporteerde bestanden zal toenemen.", "addWatermark": "Voeg \"Gemaakt met Excalidraw\" toe", "handDrawn": "Handgetekend", "normal": "Normaal", @@ -60,7 +60,7 @@ "architect": "Architect", "artist": "Artiest", "cartoonist": "Cartoonist", - "fileTitle": "", + "fileTitle": "Bestandsnaam", "colorPicker": "Kleurenkiezer", "canvasBackground": "Canvas achtergrond", "drawingCanvas": "Canvas", @@ -69,29 +69,28 @@ "language": "Taal", "createRoom": "Deel een live-samenwerkingssessie", "duplicateSelection": "Dupliceer", - "untitled": "", + "untitled": "Naamloos", "name": "Naam", "yourName": "Jouw naam", "madeWithExcalidraw": "Gemaakt met Excalidraw", "group": "Groeperen", "ungroup": "Groep opheffen", "collaborators": "Deelnemers", - "toggleGridMode": "Rasterlijnen in-/uitschakelen", - "toggleStats": "", + "gridMode": "Rasterweergave", "addToLibrary": "Voeg toe aan bibliotheek", "removeFromLibrary": "Verwijder uit bibliotheek", "libraryLoadingMessage": "Bibliotheek laden...", - "libraries": "", + "libraries": "Blader door bibliotheken", "loadingScene": "Scène laden...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "align": "Uitlijnen", + "alignTop": "Boven uitlijnen", + "alignBottom": "Onder uitlijnen", + "alignLeft": "Links uitlijnen", + "alignRight": "Rechts uitlijnen", + "centerVertically": "Verticaal Centreren", + "centerHorizontally": "Horizontaal Centreren", + "distributeHorizontally": "Horizontaal verspreiden", + "distributeVertically": "Verticaal distribueren" }, "buttons": { "clearReset": "Canvas opnieuw instellen", @@ -118,15 +117,16 @@ "redo": "Herstel ongedaan maken", "roomDialog": "Live-samenwerkingssessie starten", "createNewRoom": "Creëer live-samenwerkingssessie", - "toggleFullScreen": "Volledig scherm in-/uitschakelen", - "toggleDarkMode": "Donkere modus in-/uitschakelen", - "toggleZenMode": "Zen modus in-/uitschakelen", + "fullScreen": "Volledig scherm", + "darkMode": "Donkere modus", + "lightMode": "Lichte modus", + "zenMode": "Zen modus", "exitZenMode": "Verlaat zen modus" }, "alerts": { "clearReset": "Dit zal het hele canvas verwijderen. Weet je het zeker?", "couldNotCreateShareableLink": "Kon geen deelbare link aanmaken.", - "couldNotCreateShareableLinkTooBig": "", + "couldNotCreateShareableLinkTooBig": "Kan geen deelbare link aanmaken: de scène is te groot", "couldNotLoadInvalidFile": "Kan ongeldig bestand niet laden", "importBackendFailed": "Importeren vanuit backend mislukt.", "cannotExportEmptyCanvas": "Kan geen leeg canvas exporteren.", @@ -136,8 +136,8 @@ "loadSceneOverridePrompt": "Het laden van externe tekening zal uw bestaande inhoud vervangen. Wil je doorgaan?", "errorLoadingLibrary": "Bij het laden van de externe bibliotheek is een fout opgetreden.", "confirmAddLibrary": "Hiermee worden {{numShapes}} vorm(n) aan uw bibliotheek toegevoegd. Ben je het zeker?", - "imageDoesNotContainScene": "", - "cannotRestoreFromImage": "" + "imageDoesNotContainScene": "Afbeeldingen importeren wordt op dit moment niet ondersteund.\n\nWil je een scène importeren? Deze afbeelding lijkt geen scène gegevens te bevatten. Heb je dit geactiveerd tijdens het exporteren?", + "cannotRestoreFromImage": "Scène kan niet worden hersteld vanuit dit afbeeldingsbestand" }, "toolBar": { "selection": "Selectie", @@ -161,6 +161,7 @@ "freeDraw": "Klik en sleep, laat los als je klaar bent", "text": "Tip: je kunt tekst toevoegen door ergens dubbel te klikken met de selectietool", "linearElementMulti": "Klik op het laatste punt of druk op Escape of Enter om te stoppen", + "lockAngle": "Je kunt de hoek beperken door SHIFT ingedrukt te houden", "resize": "Houd tijdens het vergroten SHIFT ingedrukt om verhoudingen te behouden,\ngebruik ALT om vanuit het midden te vergroten/verkleinen", "rotate": "Je kan hoeken beperken door SHIFT ingedrukt te houden wanneer je draait", "lineEditor_info": "Dubbelklik of druk op Enter om punten te bewerken", @@ -168,9 +169,9 @@ "lineEditor_nothingSelected": "Selecteer een punt om te verplaatsen of te verwijderen, of houd Alt ingedrukt en klik om nieuwe punten toe te voegen" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "Kan voorbeeld niet tonen", + "canvasTooBig": "Het canvas is mogelijk te groot.", + "canvasTooBigTip": "Tip: beweeg de verste elementen iets dichter bij elkaar." }, "errorSplash": { "headingMain_pre": "Fout opgetreden. Probeer ", @@ -192,7 +193,7 @@ "button_stopSession": "Sessie afbreken", "desc_inProgressIntro": "De live-samenwerkingssessie is nu gestart.", "desc_shareLink": "Deel deze link met iedereen waarmee je wil samenwerken:", - "desc_exitSession": "" + "desc_exitSession": "Het stoppen van de sessie zal je loskoppelen van de kamer, maar je kunt lokaal doorwerken met de scène.\nPas op: dit heeft geen invloed op andere mensen en dat zij nog steeds in staat zullen zijn om samen te werken aan hun versie." }, "errorDialog": { "title": "Fout" @@ -213,22 +214,22 @@ "textNewLine": "Nieuwe regel toevoegen (tekst)", "textFinish": "Voltooi bewerken (tekst)", "zoomToFit": "Zoom in op alle elementen", - "zoomToSelection": "", - "preventBinding": "" + "zoomToSelection": "Inzoomen op selectie", + "preventBinding": "Pijlbinding voorkomen" }, "encrypted": { "tooltip": "Je tekeningen zijn beveiligd met end-to-end encryptie, dus Excalidraw's servers zullen nooit zien wat je tekent." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", - "scene": "", - "selected": "", - "storage": "", - "title": "", - "total": "", - "width": "" + "angle": "Hoek", + "element": "Element", + "elements": "Elementen", + "height": "Hoogte", + "scene": "Scene", + "selected": "Geselecteerd", + "storage": "Opslag", + "title": "Statistieken voor nerds", + "total": "Totaal", + "width": "Breedte" } } diff --git a/src/locales/nn-NO.json b/src/locales/nn-NO.json index ead3e4c9d..8a4bc38b3 100644 --- a/src/locales/nn-NO.json +++ b/src/locales/nn-NO.json @@ -4,7 +4,7 @@ "selectAll": "Vel alt", "multiSelect": "Legg til element i utval", "moveCanvas": "Flytt lerretet", - "cut": "", + "cut": "Klipp ut", "copy": "Kopier", "copyAsPng": "Kopier til utklippstavla som PNG", "copyAsSvg": "Kopier til utklippstavla som SVG", @@ -29,17 +29,17 @@ "edges": "Kanter", "sharp": "Skarp", "round": "Rund", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowheads": "Pilhovud", + "arrowhead_none": "Ingen", + "arrowhead_arrow": "Pil", + "arrowhead_bar": "Stolpe", + "arrowhead_dot": "Prikk", "fontSize": "Skriftstorleik", "fontFamily": "Skrifttype", "onlySelected": "Kun valde", - "withBackground": "Inkluder bakgrunn", - "exportEmbedScene": "", - "exportEmbedScene_details": "", + "withBackground": "Med bakgrunn", + "exportEmbedScene": "Bygg scena inn i eksportert fil", + "exportEmbedScene_details": "Scenedataa vert lagra i den eksporterte PNG- eller SVG-fila slik at scena kan bli gjenopprettast frå den. Dette vil auke eksportert filstorleik.", "addWatermark": "Legg til «Laga med Excalidraw»", "handDrawn": "Handteikna", "normal": "Normal", @@ -60,7 +60,7 @@ "architect": "Arkitekt", "artist": "Kunstnar", "cartoonist": "Teiknar", - "fileTitle": "", + "fileTitle": "Filnamn", "colorPicker": "Fargeveljar", "canvasBackground": "Lerretsbakgrunn", "drawingCanvas": "Lerret", @@ -69,29 +69,28 @@ "language": "Språk", "createRoom": "Del ei sanntids-samarbeidsøkt", "duplicateSelection": "Dupliser", - "untitled": "", + "untitled": "Utan namn", "name": "Namn", "yourName": "Namnet ditt", "madeWithExcalidraw": "Laga med Excalidraw", "group": "Grupper utval", "ungroup": "Avgrupper utval", "collaborators": "Samarbeidarar", - "toggleGridMode": "Sla på/av rutenett", - "toggleStats": "", + "gridMode": "", "addToLibrary": "Legg til i bibliotek", "removeFromLibrary": "Fjern frå bibliotek", "libraryLoadingMessage": "Laster bibliotek...", - "libraries": "", + "libraries": "Blad gjennom bibliotek", "loadingScene": "Laster scene...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "align": "Juster", + "alignTop": "Juster til topp", + "alignBottom": "Juster til botn", + "alignLeft": "Juster til venstre", + "alignRight": "Juster til høgre", + "centerVertically": "Midtstill vertikalt", + "centerHorizontally": "Midtstill horisontalt", + "distributeHorizontally": "Sprei horisontalt", + "distributeVertically": "Sprei vertikalt" }, "buttons": { "clearReset": "Tilbakestill lerretet", @@ -100,7 +99,7 @@ "exportToSvg": "Eksporter til SVG", "copyToClipboard": "Kopier til utklippstavla", "copyPngToClipboard": "Kopier PNG til utklippstavla", - "scale": "", + "scale": "Skaler", "save": "Lagre", "saveAs": "Lagre som", "load": "Opne", @@ -118,15 +117,16 @@ "redo": "Gjer om", "roomDialog": "Start sanntids-samarbeid", "createNewRoom": "Lag nytt rom", - "toggleFullScreen": "Slå på/av fullskjerm", - "toggleDarkMode": "Skru av/på skumringsmodus", - "toggleZenMode": "Slå på/av zen-modus", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "Avslutt zen-modus" }, "alerts": { "clearReset": "Dette vil tømme lerretet. Er du sikker?", "couldNotCreateShareableLink": "Kunne ikkje lage delingslenke.", - "couldNotCreateShareableLinkTooBig": "", + "couldNotCreateShareableLinkTooBig": "Kunne ikkje opprette deleleg lenke: scena er for stor", "couldNotLoadInvalidFile": "Kunne ikkje laste inn ugyldig fil", "importBackendFailed": "Importering av backend feila.", "cannotExportEmptyCanvas": "Kan ikkje eksportere eit tomt lerret.", @@ -137,7 +137,7 @@ "errorLoadingLibrary": "Det oppstod ein feil under lastinga av tredjepartsbibliotek.", "confirmAddLibrary": "Dette vil legge til {{numShapes}} form(er) i biblioteket ditt. Er du sikker?", "imageDoesNotContainScene": "", - "cannotRestoreFromImage": "" + "cannotRestoreFromImage": "Scena kunne ikkje gjenopprettast frå denne biletfila" }, "toolBar": { "selection": "Vel", @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Klikk på siste punkt eller trykk Escape eller Enter for å fullføre", + "lockAngle": "", "resize": "Du kan halde fram med forholdet ved å trykke SHIFT medan du endrar storleik,\ntrykk ALT for å endre storleiken frå midten", "rotate": "Du kan låse vinklane ved å halde SHIFT medan du roterer", "lineEditor_info": "Dobbeltklikk eller trykk Enter for å redigere punkt", @@ -168,9 +169,9 @@ "lineEditor_nothingSelected": "Vel eit punkt å flytte eller fjerne, eller hald Alt og klikk for å legge til nye punkt" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "Kan ikkje vise førehandsvising", + "canvasTooBig": "Lerretet er mogleg for stort.", + "canvasTooBigTip": "Tips: prøv å flytte elementa som er lengst frå kvarandre, litt nærare kvarandre." }, "errorSplash": { "headingMain_pre": "Ein feil oppstod. Prøv ", @@ -213,22 +214,22 @@ "textNewLine": "Legg til ny linje (tekst)", "textFinish": "Fullfør redigering (tekst)", "zoomToFit": "Zoom for å sjå alle elementa", - "zoomToSelection": "", + "zoomToSelection": "Zoom til utval", "preventBinding": "Hindre pilkobling" }, "encrypted": { "tooltip": "Teikningane dine er ende-til-ende-krypterte slik at Excalidraw sine serverar aldri får sjå dei." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", - "scene": "", - "selected": "", - "storage": "", - "title": "", - "total": "", - "width": "" + "angle": "Vinkel", + "element": "Element", + "elements": "Element", + "height": "Høgde", + "scene": "Scene", + "selected": "Valde", + "storage": "Lagring", + "title": "Statistikk for nerdar", + "total": "Totalt", + "width": "Breidde" } } diff --git a/src/locales/percentages.json b/src/locales/percentages.json index 253a489ac..8a86d50fa 100644 --- a/src/locales/percentages.json +++ b/src/locales/percentages.json @@ -1,33 +1,34 @@ { - "ar-SA": 89, - "bg-BG": 61, - "ca-ES": 81, - "de-DE": 99, - "el-GR": 95, + "ar-SA": 86, + "bg-BG": 60, + "ca-ES": 78, + "de-DE": 100, + "el-GR": 96, "en": 100, - "es-ES": 81, - "fa-IR": 89, + "es-ES": 99, + "fa-IR": 86, "fi-FI": 100, "fr-FR": 100, - "he-IL": 69, + "he-IL": 96, "hi-IN": 82, - "hu-HU": 44, - "id-ID": 99, + "hu-HU": 92, + "id-ID": 100, "it-IT": 100, - "ja-JP": 89, - "ko-KR": 68, - "my-MM": 96, + "ja-JP": 85, + "ko-KR": 67, + "my-MM": 93, "nb-NO": 100, - "nl-NL": 80, - "nn-NO": 80, - "pl-PL": 79, - "pt-PT": 83, + "nl-NL": 100, + "nn-NO": 96, + "pl-PL": 95, + "pt-BR": 100, + "pt-PT": 100, "ro-RO": 100, - "ru-RU": 81, + "ru-RU": 97, "sk-SK": 100, "sv-SE": 100, - "tr-TR": 81, - "uk-UA": 98, - "zh-CN": 95, + "tr-TR": 87, + "uk-UA": 99, + "zh-CN": 100, "zh-TW": 99 } diff --git a/src/locales/pl-PL.json b/src/locales/pl-PL.json index 272f0f07e..e4945d832 100644 --- a/src/locales/pl-PL.json +++ b/src/locales/pl-PL.json @@ -4,7 +4,7 @@ "selectAll": "Zaznacz wszystko", "multiSelect": "Dodaj element do zaznaczenia", "moveCanvas": "Przesuń obszar roboczy", - "cut": "", + "cut": "Wytnij", "copy": "Kopiuj", "copyAsPng": "Skopiuj do schowka jako plik PNG", "copyAsSvg": "Skopiuj do schowka jako plik SVG", @@ -29,17 +29,17 @@ "edges": "Krawędzie", "sharp": "Ostry", "round": "Zaokrąglij", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", + "arrowheads": "Groty", + "arrowhead_none": "Brak", + "arrowhead_arrow": "Strzałka", "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowhead_dot": "Kropka", "fontSize": "Rozmiar tekstu", "fontFamily": "Krój pisma", "onlySelected": "Tylko wybrane", - "withBackground": "Z tłem dokumentu", - "exportEmbedScene": "", - "exportEmbedScene_details": "", + "withBackground": "", + "exportEmbedScene": "Osadź scenę w eksportowanym pliku", + "exportEmbedScene_details": "Dane sceny zostaną zapisane w eksportowanym pliku PNG/SVG tak, aby scena mogła zostać z niego przywrócona.\nZwiększy to rozmiar eksportowanego pliku.", "addWatermark": "Dodaj \"Zrobione w Excalidraw\"", "handDrawn": "Odręczny", "normal": "Normalny", @@ -60,7 +60,7 @@ "architect": "Dokładny", "artist": "Artystyczny", "cartoonist": "Rysunkowy", - "fileTitle": "", + "fileTitle": "Tytuł pliku", "colorPicker": "Paleta kolorów", "canvasBackground": "Kolor dokumentu", "drawingCanvas": "Obszar roboczy", @@ -69,29 +69,28 @@ "language": "Język", "createRoom": "Udostępnij sesję współpracy na żywo", "duplicateSelection": "Powiel", - "untitled": "", + "untitled": "Bez tytułu", "name": "Nazwa", "yourName": "Twoje imię", "madeWithExcalidraw": "Zrobione w Excalidraw", "group": "Zgrupuj wybrane", "ungroup": "Rozgrupuj wybrane", "collaborators": "Współtwórcy", - "toggleGridMode": "Włącz siatkę", - "toggleStats": "", + "gridMode": "Tryb siatki", "addToLibrary": "Dodaj do biblioteki", "removeFromLibrary": "Usuń z biblioteki", "libraryLoadingMessage": "Wczytywanie biblioteki...", - "libraries": "", + "libraries": "Przeglądaj biblioteki", "loadingScene": "Ładowanie sceny...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "align": "Wyrównaj", + "alignTop": "Wyrównaj do góry", + "alignBottom": "Wyrównaj do dołu", + "alignLeft": "Wyrównaj do lewej", + "alignRight": "Wyrównaj do prawej", + "centerVertically": "Wyśrodkuj w pionie", + "centerHorizontally": "Wyśrodkuj w poziomie", + "distributeHorizontally": "Rozłóż poziomo", + "distributeVertically": "Rozłóż pionowo" }, "buttons": { "clearReset": "Wyczyść dokument i zresetuj kolor dokumentu", @@ -118,15 +117,16 @@ "redo": "Przywróć", "roomDialog": "Utwórz nową sesję współpracy na żywo", "createNewRoom": "Utwórz nowy pokój", - "toggleFullScreen": "Włącz/wyłącz tryb pełnoekranowy", - "toggleDarkMode": "Włącz tryb ciemny", - "toggleZenMode": "Włącz tryb Zen", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "Wyjdź z trybu Zen" }, "alerts": { "clearReset": "To spowoduje usunięcie wszystkiego z dokumentu. Czy chcesz kontynuować?", "couldNotCreateShareableLink": "Wystąpił błąd przy generowaniu linka do udostępniania.", - "couldNotCreateShareableLinkTooBig": "", + "couldNotCreateShareableLinkTooBig": "Nie można utworzyć udostępnialnego linku: scena jest za duża", "couldNotLoadInvalidFile": "Nie udało się otworzyć pliku. Wybrany plik jest nieprawidłowy.", "importBackendFailed": "Wystąpił błąd podczas importowania pliku.", "cannotExportEmptyCanvas": "Najpierw musisz coś narysować, aby zapisać dokument.", @@ -134,10 +134,10 @@ "decryptFailed": "Nie udało się odszyfrować danych.", "uploadedSecurly": "By zapewnić Ci prywatność, udostępnianie projektu jest zabezpieczone szyfrowaniem end-to-end, co oznacza, że poza tobą i osobą z którą podzielisz się linkiem, nikt nie ma dostępu do tego co udostępniasz.", "loadSceneOverridePrompt": "Wczytanie zewnętrznego rysunku zastąpi istniejącą zawartość. Czy chcesz kontynuować?", - "errorLoadingLibrary": "", - "confirmAddLibrary": "", + "errorLoadingLibrary": "Wystąpił błąd podczas ładowania biblioteki stron trzecich.", + "confirmAddLibrary": "To doda {{numShapes}} kształtów do twojej biblioteki. Jesteś pewien?", "imageDoesNotContainScene": "", - "cannotRestoreFromImage": "" + "cannotRestoreFromImage": "Scena nie mogła zostać przywrócona z pliku obrazu" }, "toolBar": { "selection": "Zaznaczenie", @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Aby zakończyć krzywą, ponownie kliknij w ostatni punkt, bądź naciśnij Esc albo Enter", + "lockAngle": "", "resize": "Możesz zachować proporcję trzymająć wcisnięty SHIFT, przytrzymaj ALT by zmienić rozmiar względem środka", "rotate": "Możesz obracać element w równych odstępach trzymając wciśnięty SHIFT", "lineEditor_info": "Kliknij dwukrotnie lub naciśnij Enter, aby edytować punkty", @@ -168,9 +169,9 @@ "lineEditor_nothingSelected": "Naciśnij w punkt by go edytować, przytrzymaj Alt i naciśnij by dodać nowy punkt" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "Nie można pokazać podglądu", + "canvasTooBig": "Płótno może być za duże.", + "canvasTooBigTip": "Wskazówka: spróbuj nieco zbliżyć najdalej wysunięte elementy." }, "errorSplash": { "headingMain_pre": "Wystąpił błąd. Spróbuj ", @@ -213,22 +214,22 @@ "textNewLine": "Dodaj nową linię (tekst)", "textFinish": "Zakończ edycję (tekst)", "zoomToFit": "Powiększ, aby wyświetlić wszystkie elementy", - "zoomToSelection": "", + "zoomToSelection": "Przybliż zaznaczenie", "preventBinding": "Zablokuj przywiązanie strzałek do obiektu" }, "encrypted": { "tooltip": "Twoje rysunki są zabezpieczone szyfrowaniem end-to-end, tak więc nawet w Excalidraw nie jesteśmy w stanie zobaczyć tego co tworzysz." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", - "scene": "", - "selected": "", - "storage": "", - "title": "", - "total": "", - "width": "" + "angle": "Kąt", + "element": "Element", + "elements": "Elementy", + "height": "Wysokość", + "scene": "Scena", + "selected": "Zaznaczenie", + "storage": "Pamięć", + "title": "Statystyki dla nerdów", + "total": "Suma", + "width": "Szerokość" } } diff --git a/src/locales/pt-BR.json b/src/locales/pt-BR.json new file mode 100644 index 000000000..e382924c2 --- /dev/null +++ b/src/locales/pt-BR.json @@ -0,0 +1,235 @@ +{ + "labels": { + "paste": "Colar", + "selectAll": "Selecionar tudo", + "multiSelect": "Adicionar elemento à seleção", + "moveCanvas": "Mover tela", + "cut": "Cortar", + "copy": "Copiar", + "copyAsPng": "Copiar para a área de transferência como PNG", + "copyAsSvg": "Copiar para a área de transferência como SVG", + "bringForward": "Trazer para a frente", + "sendToBack": "Enviar para o fundo", + "bringToFront": "Trazer para o primeiro plano", + "sendBackward": "Enviar para trás", + "delete": "Apagar", + "copyStyles": "Copiar os estilos", + "pasteStyles": "Colar os estilos", + "stroke": "Contorno", + "background": "Fundo", + "fill": "Preenchimento", + "strokeWidth": "Espessura do traço", + "strokeStyle": "Estilo de traço", + "strokeStyle_solid": "Sólido", + "strokeStyle_dashed": "Tracejado", + "strokeStyle_dotted": "Pontilhado", + "sloppiness": "Precisão do traço", + "opacity": "Opacidade", + "textAlign": "Alinhamento do texto", + "edges": "Arestas", + "sharp": "Pontudo", + "round": "Arredondado", + "arrowheads": "Pontas", + "arrowhead_none": "Nenhuma", + "arrowhead_arrow": "Flecha", + "arrowhead_bar": "Barra", + "arrowhead_dot": "Ponto", + "fontSize": "Tamanho da fonte", + "fontFamily": "Família da fonte", + "onlySelected": "Somente a seleção", + "withBackground": "Com fundo", + "exportEmbedScene": "Incorporar a cena no arquivo exportado", + "exportEmbedScene_details": "Os dados da cena serão salvos no arquivo PNG/SVG exportado para que a cena possa ser restaurada.\nIrá aumentar o tamanho do arquivo exportado.", + "addWatermark": "Adicionar \"Feito com Excalidraw\"", + "handDrawn": "Manuscrito", + "normal": "Normal", + "code": "Código", + "small": "Pequeno", + "medium": "Médio", + "large": "Grande", + "veryLarge": "Muito grande", + "solid": "Sólido", + "hachure": "Hachura", + "crossHatch": "Hachura cruzada", + "thin": "Fino", + "bold": "Espesso", + "left": "Esquerda", + "center": "Centralizar", + "right": "Direita", + "extraBold": "Muito espesso", + "architect": "Arquiteto", + "artist": "Artista", + "cartoonist": "Cartunista", + "fileTitle": "Título do arquivo", + "colorPicker": "Seletor de cores", + "canvasBackground": "Fundo da tela", + "drawingCanvas": "Tela de desenho", + "layers": "Camadas", + "actions": "Ações", + "language": "Idioma", + "createRoom": "Compartilhar uma sessão de colaboração ao vivo", + "duplicateSelection": "Duplicar", + "untitled": "Sem título", + "name": "Nome", + "yourName": "Seu nome", + "madeWithExcalidraw": "Feito com Excalidraw", + "group": "Agrupar seleção", + "ungroup": "Desagrupar seleção", + "collaborators": "Colaboradores", + "gridMode": "Modo grade", + "addToLibrary": "Adicionar à biblioteca", + "removeFromLibrary": "Remover da biblioteca", + "libraryLoadingMessage": "Carregando biblioteca...", + "libraries": "Procurar bibliotecas", + "loadingScene": "Carregando cena...", + "align": "Alinhamento", + "alignTop": "Alinhar ao topo", + "alignBottom": "Alinhar embaixo", + "alignLeft": "Alinhar à esquerda", + "alignRight": "Alinhar à direita", + "centerVertically": "Centralizar verticalmente", + "centerHorizontally": "Centralizar horizontalmente", + "distributeHorizontally": "Distribuir horizontalmente", + "distributeVertically": "Distribuir verticalmente" + }, + "buttons": { + "clearReset": "Limpar o canvas e redefinir a cor de fundo", + "export": "Exportar", + "exportToPng": "Exportar em PNG", + "exportToSvg": "Exportar em SVG", + "copyToClipboard": "Copiar para o clipboard", + "copyPngToClipboard": "Copiar PNG para área de transferência", + "scale": "Escala", + "save": "Salvar", + "saveAs": "Salvar como", + "load": "Carregar", + "getShareableLink": "Obter um link de compartilhamento", + "close": "Fechar", + "selectLanguage": "Selecionar idioma", + "scrollBackToContent": "Voltar para o conteúdo", + "zoomIn": "Aumentar zoom", + "zoomOut": "Diminuir zoom", + "resetZoom": "Redefinir zoom", + "menu": "Menu", + "done": "Concluído", + "edit": "Editar", + "undo": "Desfazer", + "redo": "Refazer", + "roomDialog": "Iniciar colaboração ao vivo", + "createNewRoom": "Criar nova sala", + "fullScreen": "Tela cheia", + "darkMode": "Modo escuro", + "lightMode": "Modo claro", + "zenMode": "Modo Zen", + "exitZenMode": "Sair do modo zen" + }, + "alerts": { + "clearReset": "Isto irá limpar toda a tela. Você tem certeza?", + "couldNotCreateShareableLink": "Não foi possível criar um link de compartilhamento.", + "couldNotCreateShareableLinkTooBig": "Não foi possível criar um link compartilhável: a cena é muito grande", + "couldNotLoadInvalidFile": "Não foi possível carregar o arquivo inválido", + "importBackendFailed": "A importação do servidor falhou.", + "cannotExportEmptyCanvas": "Não é possível exportar um canvas vazio.", + "couldNotCopyToClipboard": "Não foi possível copiar para a área de transferência. Experimente usando o navegador Chrome.", + "decryptFailed": "Não foi possível descriptografar os dados.", + "uploadedSecurly": "O upload foi protegido com criptografia de ponta a ponta, o que significa que o servidor do Excalidraw e terceiros não podem ler o conteúdo.", + "loadSceneOverridePrompt": "Carregar um desenho externo substituirá o seu conteúdo existente. Deseja continuar?", + "errorLoadingLibrary": "Houve um erro ao carregar a biblioteca de terceiros.", + "confirmAddLibrary": "Isso adicionará {{numShapes}} forma(s) à sua biblioteca. Tem certeza?", + "imageDoesNotContainScene": "A importação de imagens não é suportada no momento.\n\nVocê deseja importar uma cena? Esta imagem parece não conter dados de cena. Você ativou isto durante a exportação?", + "cannotRestoreFromImage": "Não foi possível restaurar a cena deste arquivo de imagem" + }, + "toolBar": { + "selection": "Seleção", + "draw": "Desenho livre", + "rectangle": "Retângulo", + "diamond": "Losango", + "ellipse": "Elipse", + "arrow": "Flecha", + "line": "Linha", + "text": "Texto", + "library": "Biblioteca", + "lock": "Manter ativa a ferramenta selecionada após desenhar" + }, + "headings": { + "canvasActions": "Ações da tela", + "selectedShapeActions": "Ações das formas selecionadas", + "shapes": "Formas" + }, + "hints": { + "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", + "linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar", + "lockAngle": "Você pode restringir o ângulo segurando o SHIFT", + "resize": "Você pode restringir proporções segurando SHIFT enquanto redimensiona,\nsegure ALT para redimensionar do centro", + "rotate": "Você pode restringir os ângulos segurando SHIFT enquanto gira", + "lineEditor_info": "Clique duas vezes ou pressione Enter para editar os pontos", + "lineEditor_pointSelected": "Pressione Deletar para remover o ponto, CtrlOuCmd+D para duplicar ou arraste para mover", + "lineEditor_nothingSelected": "Selecione um ponto para mover ou remover, ou segure Alt e clique para adicionar novos pontos" + }, + "canvasError": { + "cannotShowPreview": "Não é possível mostrar pré-visualização", + "canvasTooBig": "A tela pode ser muito grande.", + "canvasTooBigTip": "Dica: tente aproximar um pouco os elementos mais distantes." + }, + "errorSplash": { + "headingMain_pre": "Foi encontrado um erro. Tente ", + "headingMain_button": "recarregar a página.", + "clearCanvasMessage": "Se recarregar a página não funcionar, tente ", + "clearCanvasMessage_button": "limpando a tela.", + "clearCanvasCaveat": " Isso resultará em perda de trabalho ", + "trackedToSentry_pre": "O erro com o identificador ", + "trackedToSentry_post": " foi rastreado no nosso sistema.", + "openIssueMessage_pre": "Fomos muito cautelosos para não incluir suas informações de cena no erro. Se sua cena não for privada, por favor, considere seguir nosso ", + "openIssueMessage_button": "rastreador de bugs.", + "openIssueMessage_post": " Por favor, inclua informações abaixo, copiando e colando para a issue do GitHub.", + "sceneContent": "Conteúdo da cena:" + }, + "roomDialog": { + "desc_intro": "Você pode convidar pessoas para sua cena atual para colaborar com você.", + "desc_privacy": "Não se preocupe, a sessão usa criptografia de ponta a ponta; portanto, o que você desenhar permanecerá privado. Nem mesmo nosso servidor poderá ver o que você cria.", + "button_startSession": "Iniciar sessão", + "button_stopSession": "Parar sessão", + "desc_inProgressIntro": "A sessão de colaboração ao vivo está agora em andamento.", + "desc_shareLink": "Compartilhe este link com qualquer pessoa com quem você queira colaborar:", + "desc_exitSession": "Interrompendo a sessão você irá se desconectar da sala, mas você poderá continuar trabalhando com a cena localmente. Observe que isso não afetará outras pessoas, e elas ainda poderão colaborar em suas versões." + }, + "errorDialog": { + "title": "Erro" + }, + "shortcutsDialog": { + "title": "Atalhos de teclado", + "shapes": "Formas", + "or": "ou", + "click": "clicar", + "drag": "arrastar", + "curvedArrow": "Seta curva", + "curvedLine": "Linha curva", + "editor": "Editor", + "view": "Visualizar", + "blog": "Leia o nosso blog", + "howto": "Siga os nossos guias", + "github": "Encontrou algum problema? Nos informe", + "textNewLine": "Adicionar nova linha (texto)", + "textFinish": "Finalizar edição (texto)", + "zoomToFit": "Ajustar para caber todos os elementos", + "zoomToSelection": "Ampliar a seleção", + "preventBinding": "Prevenir fixação de seta" + }, + "encrypted": { + "tooltip": "Seus desenhos são criptografados de ponta a ponta, então os servidores do Excalidraw nunca os verão." + }, + "stats": { + "angle": "Ângulo", + "element": "Elemento", + "elements": "Elementos", + "height": "Altura", + "scene": "Cena", + "selected": "Selecionado", + "storage": "Armazenamento", + "title": "Estatísticas para nerds", + "total": "Total", + "width": "Largura" + } +} diff --git a/src/locales/pt-PT.json b/src/locales/pt-PT.json index a76e04c39..16e59466f 100644 --- a/src/locales/pt-PT.json +++ b/src/locales/pt-PT.json @@ -4,7 +4,7 @@ "selectAll": "Selecionar tudo", "multiSelect": "Adicionar elemento à seleção", "moveCanvas": "Mover tela", - "cut": "", + "cut": "Cortar", "copy": "Copiar", "copyAsPng": "Copiar para a área de transferência como PNG", "copyAsSvg": "Copiar para a área de transferência como SVG", @@ -29,11 +29,11 @@ "edges": "Arestas", "sharp": "Aguçado", "round": "Redondo", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowheads": "Pontas", + "arrowhead_none": "Nenhuma", + "arrowhead_arrow": "Seta", + "arrowhead_bar": "Barra", + "arrowhead_dot": "Ponto", "fontSize": "Tamanho da fonte", "fontFamily": "Família da fontes", "onlySelected": "Somente a seleção", @@ -60,7 +60,7 @@ "architect": "Arquitecto", "artist": "Artista", "cartoonist": "Caricaturista", - "fileTitle": "", + "fileTitle": "Título do ficheiro", "colorPicker": "Seletor de cores", "canvasBackground": "Fundo da tela", "drawingCanvas": "Tela de desenho", @@ -69,29 +69,28 @@ "language": "Idioma", "createRoom": "Compartilhar uma sessão de colaboração ao vivo", "duplicateSelection": "Duplicar", - "untitled": "", + "untitled": "Sem título", "name": "Nome", "yourName": "Seu nome", "madeWithExcalidraw": "Feito com Excalidraw", "group": "Agrupar seleção", "ungroup": "Desagrupar seleção", "collaborators": "Colaboradores", - "toggleGridMode": "Alternar modo de grade", - "toggleStats": "", + "gridMode": "Modo grade", "addToLibrary": "Adicionar à biblioteca", "removeFromLibrary": "Remover da biblioteca", "libraryLoadingMessage": "Carregando biblioteca...", - "libraries": "", + "libraries": "Procurar bibliotecas", "loadingScene": "Carregando cena...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "align": "Alinhamento", + "alignTop": "Alinhar ao topo", + "alignBottom": "Alinhar ao fundo", + "alignLeft": "Alinhar à esquerda", + "alignRight": "Alinhar à direita", + "centerVertically": "Centralizar verticalmente", + "centerHorizontally": "Centralizar horizontalmente", + "distributeHorizontally": "Distribuir horizontalmente", + "distributeVertically": "Distribuir verticalmente" }, "buttons": { "clearReset": "Limpar o canvas e redefinir a cor de fundo", @@ -118,9 +117,10 @@ "redo": "Refazer", "roomDialog": "Iniciar colaboração ao vivo", "createNewRoom": "Criar nova sala", - "toggleFullScreen": "Alternar tela cheia", - "toggleDarkMode": "Alternar modo escuro", - "toggleZenMode": "Alternar modo zen", + "fullScreen": "Tela cheia", + "darkMode": "Modo escuro", + "lightMode": "Modo claro", + "zenMode": "Modo Zen", "exitZenMode": "Sair do modo zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Carregar um desenho externo substituirá o seu conteúdo existente. Deseja continuar?", "errorLoadingLibrary": "Houve um erro ao carregar a biblioteca de terceiros.", "confirmAddLibrary": "Isso adicionará {{numShapes}} forma(s) à sua biblioteca. Tem certeza?", - "imageDoesNotContainScene": "O arquivo de imagem não contém dados de cena. Você ativou durante a exportação?", + "imageDoesNotContainScene": "A importação de imagens não é suportada no momento.\n\nVocê deseja importar uma cena? Esta imagem parece não conter dados de cena. Você ativou isto durante a exportação?", "cannotRestoreFromImage": "Não foi possível restaurar a cena deste arquivo de imagem" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Clique no último ponto ou pressione Escape ou Enter para terminar", + "lockAngle": "Você pode restringir o ângulo segurando SHIFT", "resize": "Você pode restringir proporções segurando SHIFT enquanto redimensiona,\nsegure ALT para redimensionar do centro", "rotate": "Você pode restringir os ângulos segurando SHIFT enquanto gira", "lineEditor_info": "Clique duas vezes ou pressione Enter para editar os pontos", @@ -168,9 +169,9 @@ "lineEditor_nothingSelected": "Selecione um ponto para mover ou remover, ou segure Alt e clique para adicionar novos pontos" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "Não é possível mostrar pré-visualização", + "canvasTooBig": "A tela pode ser muito grande.", + "canvasTooBigTip": "Dica: tente aproximar um pouco os elementos mais distantes." }, "errorSplash": { "headingMain_pre": "Foi encontrado um erro. Tente ", @@ -213,22 +214,22 @@ "textNewLine": "Adicionar nova linha (texto)", "textFinish": "Finalizar edição (texto)", "zoomToFit": "Ajustar para caber todos os elementos", - "zoomToSelection": "", + "zoomToSelection": "Ampliar a seleção", "preventBinding": "Prevenir fixação de seta" }, "encrypted": { "tooltip": "Seus desenhos são criptografados de ponta a ponta, então os servidores do Excalidraw nunca os verão." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", - "scene": "", - "selected": "", - "storage": "", - "title": "", - "total": "", - "width": "" + "angle": "Ângulo", + "element": "Elemento", + "elements": "Elementos", + "height": "Altura", + "scene": "Cena", + "selected": "Selecionado", + "storage": "Armazenamento", + "title": "Estatísticas para nerds", + "total": "Total", + "width": "Largura" } } diff --git a/src/locales/ro-RO.json b/src/locales/ro-RO.json index becf2ac8c..be99c84a7 100644 --- a/src/locales/ro-RO.json +++ b/src/locales/ro-RO.json @@ -76,8 +76,7 @@ "group": "Grupare selecție", "ungroup": "Degrupare selecție", "collaborators": "Colaboratori", - "toggleGridMode": "Comută modul grilă", - "toggleStats": "Comută statisticile pentru pasionați", + "gridMode": "Mod grilă", "addToLibrary": "Adăugare la bibliotecă", "removeFromLibrary": "Eliminare din bibliotecă", "libraryLoadingMessage": "Se încarcă biblioteca...", @@ -118,9 +117,10 @@ "redo": "Refacere", "roomDialog": "Colaborare în direct", "createNewRoom": "Creare cameră nouă", - "toggleFullScreen": "Comută modul ecran complet", - "toggleDarkMode": "Comută modul întunecat", - "toggleZenMode": "Comută modul zen", + "fullScreen": "Ecran complet", + "darkMode": "Mod întunecat", + "lightMode": "Mod luminos", + "zenMode": "Mod zen", "exitZenMode": "Ieșire din modul zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Încărcarea desenului extern va înlocui conținutul existent. Dorești să continui?", "errorLoadingLibrary": "A apărut o eroare la încărcarea bibliotecii terțe.", "confirmAddLibrary": "Această acțiune va adăuga {{numShapes}} formă(e) la biblioteca ta. Confirmi?", - "imageDoesNotContainScene": "Fișierul de imagine nu conține date de scenă. Ai activat această opțiune pe durata exportării?", + "imageDoesNotContainScene": "Importarea imaginilor nu este acceptată în acest moment.\n\nVoiai să imporți o scenă? Această imagine nu pare să conțină date de scenă. Ai activat această opțiune pe durata exportării?", "cannotRestoreFromImage": "Scena nu a putut fi restaurată din acest fișier de imagine" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Dă clic pe ultimul punct sau apasă tasta Escape sau tasta Enter pentru a termina", + "lockAngle": "Poți constrânge unghiul prin ținerea apăsată a tastei SHIFT", "resize": "Poți constrânge proporțiile, ținând apăsată tasta SHIFT în timp ce redimensionezi,\nține apăsată tasta ALT pentru a redimensiona de la centru", "rotate": "Poți constrânge unghiurile, ținând apăsată tasta SHIFT în timp ce rotești", "lineEditor_info": "Dă dublu clic sau apasă tasta Enter pentru a edita punctele", diff --git a/src/locales/ru-RU.json b/src/locales/ru-RU.json index d51b074b8..2c4e7be3d 100644 --- a/src/locales/ru-RU.json +++ b/src/locales/ru-RU.json @@ -2,9 +2,9 @@ "labels": { "paste": "Вставить", "selectAll": "Выбрать все", - "multiSelect": "Добавить элемент к выбору", + "multiSelect": "Добавить элемент в выделенный фрагмент", "moveCanvas": "Переместить холст", - "cut": "", + "cut": "Вырезать", "copy": "Копировать", "copyAsPng": "Скопировать в буфер обмена как PNG", "copyAsSvg": "Скопировать в буфер обмена как SVG", @@ -29,17 +29,17 @@ "edges": "Края", "sharp": "Острые", "round": "Скругленные", - "arrowheads": "", - "arrowhead_none": "", + "arrowheads": "Стрелка", + "arrowhead_none": "Без стрелки", "arrowhead_arrow": "Cтрелка", - "arrowhead_bar": "", + "arrowhead_bar": "Столбец", "arrowhead_dot": "Точка", "fontSize": "Размер шрифта", "fontFamily": "Семейство шрифтов", "onlySelected": "Только выбранные", "withBackground": "С фоном", - "exportEmbedScene": "", - "exportEmbedScene_details": "", + "exportEmbedScene": "Встроить информацию о сцене в экспортируемый файл", + "exportEmbedScene_details": "Сцена будет сохранена в PNG/SVG файл так, чтобы всю сцену можно будет восстановить из этого файла. Это увеличит размер файла.", "addWatermark": "Добавить \"Сделано с Excalidraw\"", "handDrawn": "Нарисованный от руки", "normal": "Обычный", @@ -75,23 +75,22 @@ "madeWithExcalidraw": "Сделано в Excalidraw", "group": "Сгруппировать выделение", "ungroup": "Разделить выделение", - "collaborators": "Сотрудники", - "toggleGridMode": "Переключить режим сетки", - "toggleStats": "", + "collaborators": "Участники", + "gridMode": "", "addToLibrary": "Добавить в библиотеку", "removeFromLibrary": "Удалить из библиотеки", "libraryLoadingMessage": "Загрузка библиотеки...", - "libraries": "", + "libraries": "Просмотреть библиотеки", "loadingScene": "Загрузка сцены...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", - "distributeHorizontally": "", - "distributeVertically": "" + "align": "Выровнять", + "alignTop": "Выровнять по верхнему краю", + "alignBottom": "Выровнять по нижнему краю", + "alignLeft": "Выровнять по левому краю", + "alignRight": "Выровнять по правому краю", + "centerVertically": "Центрировать по вертикали", + "centerHorizontally": "Центрировать по горизонтали", + "distributeHorizontally": "Распределить по горизонтали", + "distributeVertically": "Распределить по вертикали" }, "buttons": { "clearReset": "Очистить холст и сбросить цвет фона", @@ -100,7 +99,7 @@ "exportToSvg": "Экспорт в SVG", "copyToClipboard": "Скопировать в буфер обмена", "copyPngToClipboard": "Скопировать PNG в буфер обмена", - "scale": "Шкала", + "scale": "Масштаб", "save": "Сохранить", "saveAs": "Сохранить как", "load": "Загрузить", @@ -118,26 +117,27 @@ "redo": "Шаг вперед", "roomDialog": "Начать совместную работу", "createNewRoom": "Создать новую комнату", - "toggleFullScreen": "Переключить полноэкранный режим", - "toggleDarkMode": "Переключить тёмную тему", - "toggleZenMode": "Переключить режим концентрации внимания", + "fullScreen": "Полный экран", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "Выключить режим концентрации внимания" }, "alerts": { "clearReset": "Это очистит весь холст. Вы уверены?", "couldNotCreateShareableLink": "Не удалось создать общедоступную ссылку.", - "couldNotCreateShareableLinkTooBig": "", + "couldNotCreateShareableLinkTooBig": "Нельзя создать ссылку, чтобы поделиться. Сцена слишком большая", "couldNotLoadInvalidFile": "Не удалось загрузить недопустимый файл", "importBackendFailed": "Не удалось импортировать из бэкэнда.", "cannotExportEmptyCanvas": "Не может экспортировать пустой холст.", "couldNotCopyToClipboard": "Не удалось скопировать в буфер обмена. Попробуйте использовать веб-браузер Chrome.", - "decryptFailed": "Не удалось декодировать данные.", + "decryptFailed": "Не удалось расшифровать данные.", "uploadedSecurly": "Загружаемые данные защищена сквозным шифрованием, что означает, что сервер Excalidraw и третьи стороны не могут прочитать содержимое.", - "loadSceneOverridePrompt": "", - "errorLoadingLibrary": "", - "confirmAddLibrary": "", + "loadSceneOverridePrompt": "Загрузка рисунка приведёт к замене имеющегося содержимого. Вы хотите продолжить?", + "errorLoadingLibrary": "Произошла ошибка при загрузке сторонней библиотеки.", + "confirmAddLibrary": "Будет добавлено {{numShapes}} фигур в вашу библиотеку. Продолжить?", "imageDoesNotContainScene": "", - "cannotRestoreFromImage": "" + "cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения" }, "toolBar": { "selection": "Выделение области", @@ -159,18 +159,19 @@ "hints": { "linearElement": "Нажмите, чтобы начать несколько точек, перетащите для одной линии", "freeDraw": "Нажмите и перетаскивайте, отпустите по завершении", - "text": "", + "text": "Совет: при выбранном инструменте выделения дважды щёлкните в любом месте, чтобы добавить текст", "linearElementMulti": "Кликните на последней точке или нажмите Escape или Enter чтобы закончить", + "lockAngle": "", "resize": "Вы можете ограничить пропорции, удерживая SHIFT во время изменения размеров,\nудерживайте ALT чтобы изменить размер из центра", "rotate": "Вы можете ограничить углы, удерживая SHIFT во время вращения", "lineEditor_info": "Дважды кликните или нажмите Enter, чтобы редактировать точки", - "lineEditor_pointSelected": "", - "lineEditor_nothingSelected": "" + "lineEditor_pointSelected": "Нажмите Delete для удаления точки, Ctrl или Cmd + D для дублирования, перетащите для перемещения", + "lineEditor_nothingSelected": "Выберите точку для перемещения или удаления. Alt + клик чтобы добавить новые точки" }, "canvasError": { - "cannotShowPreview": "", - "canvasTooBig": "", - "canvasTooBigTip": "" + "cannotShowPreview": "Не удается отобразить предпросмотр", + "canvasTooBig": "Сцена слишком большая.", + "canvasTooBigTip": "Совет: попробуйте сблизить элементы рисунка." }, "errorSplash": { "headingMain_pre": "Возникла ошибка. Попробуйте ", @@ -188,11 +189,11 @@ "roomDialog": { "desc_intro": "Вы можете пригласить людей в текущую сцену для совместной работы.", "desc_privacy": "Не беспокойтесь, сессия использует сквозное шифрование, поэтому всё что вы нарисуете останется приватным. Ваша информация не будет доступна даже на наших серверах.", - "button_startSession": "Начать сессию", - "button_stopSession": "Закончить сессию", + "button_startSession": "Начать сеанс", + "button_stopSession": "Завершить сеанс", "desc_inProgressIntro": "Совместная сессия теперь активна.", "desc_shareLink": "Поделитесь этой ссылкой со всеми участниками:", - "desc_exitSession": "" + "desc_exitSession": "Завершив сеанс, вы выйдете из комнаты, но сможете продолжить работать с документом локально. Это не повлияет на работу других пользователей — они смогут продолжить совместную работу с их версией документа." }, "errorDialog": { "title": "Ошибка" @@ -212,23 +213,23 @@ "github": "Нашли проблему? Отправьте", "textNewLine": "Добавить новую строку (текст)", "textFinish": "Закончить редактирование (текст)", - "zoomToFit": "", - "zoomToSelection": "", + "zoomToFit": "Отмастштабировать, чтобы поместились все элементы", + "zoomToSelection": "Перейти к выделенному", "preventBinding": "Предотвратить привязку стрелок" }, "encrypted": { - "tooltip": "" + "tooltip": "Ваши данные защищены сквозным (End-to-end) шифрованием. Серверы Excalidraw никогда не получат доступ к ним." }, "stats": { "angle": "Угол", "element": "Элемент", "elements": "Элементы", "height": "Высота", - "scene": "", - "selected": "", - "storage": "", - "title": "", - "total": "", + "scene": "Сцены", + "selected": "Выбран", + "storage": "Хранилище", + "title": "Статистика для ботаников", + "total": "Всего", "width": "Ширина" } } diff --git a/src/locales/sk-SK.json b/src/locales/sk-SK.json index 2cedc8b30..5c379c0e4 100644 --- a/src/locales/sk-SK.json +++ b/src/locales/sk-SK.json @@ -76,8 +76,7 @@ "group": "Zoskupiť", "ungroup": "Zrušiť zoskupenie", "collaborators": "Spolupracovníci", - "toggleGridMode": "Prepnúť mriežku", - "toggleStats": "Prepnúť štatistiky", + "gridMode": "Režim mriežky", "addToLibrary": "Pridať do knižnice", "removeFromLibrary": "Odstrániť z knižnice", "libraryLoadingMessage": "Načítavanie knižnice...", @@ -118,9 +117,10 @@ "redo": "Znova", "roomDialog": "Začať živú spoluprácu", "createNewRoom": "Vytvoriť novú miestnosť", - "toggleFullScreen": "Prepnúť režim celej obrazovky", - "toggleDarkMode": "Prepnúť tmavý režim", - "toggleZenMode": "Prepnúť režim zen", + "fullScreen": "Celá obrazovka", + "darkMode": "Tmavý režim", + "lightMode": "Svetlý režim", + "zenMode": "Režim zen", "exitZenMode": "Zrušiť režim zen" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Nahratie externej kresby nahradí existujúci obsah. Prajete si pokračovať?", "errorLoadingLibrary": "Nepodarilo sa načítať externú knižnicu.", "confirmAddLibrary": "Týmto sa pridá {{numShapes}} tvar(ov) do vašej knižnice. Ste si istí?", - "imageDoesNotContainScene": "Obrázkový súbor neobsahuje údaje scény. Povolili ste ich pri exportovaní?", + "imageDoesNotContainScene": "Importovanie obrázku v tomto momente nie je možné.\n\nChceli ste importovať scénu? Tento obrázok neobsahuje žiadne údaje scény. Povolili ste túto možnosť počas exportovania?", "cannotRestoreFromImage": "Nepodarilo sa obnoviť scénu z tohto obrázkového súboru" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Kliknite na počiatočný bod alebo stlačte Escape alebo Enter na ukončenie", + "lockAngle": "Počas rotácie obmedzíte uhol podržaním SHIFT", "resize": "Počas zmeny veľkosti zachováte proporcie podržaním SHIFT,\\npodržaním ALT meníte veľkosť so zachovaním stredu", "rotate": "Počas rotácie obmedzíte uhol podržaním SHIFT", "lineEditor_info": "Použite dvojklik alebo stlačte Enter na editáciu bodov", diff --git a/src/locales/sv-SE.json b/src/locales/sv-SE.json index d5db1198a..d655682b0 100644 --- a/src/locales/sv-SE.json +++ b/src/locales/sv-SE.json @@ -76,8 +76,7 @@ "group": "Gruppera markering", "ungroup": "Avgruppera markering", "collaborators": "Medarbetare", - "toggleGridMode": "Växla rutnätsläge", - "toggleStats": "Visa/dölj statistik för nördar", + "gridMode": "Rutnätsläge", "addToLibrary": "Lägg till i biblioteket", "removeFromLibrary": "Ta bort från bibliotek", "libraryLoadingMessage": "Laddar bibliotek...", @@ -118,9 +117,10 @@ "redo": "Gör om", "roomDialog": "Starta live-samarbete", "createNewRoom": "Skapa ett nytt rum", - "toggleFullScreen": "Växla fullskärmsläge", - "toggleDarkMode": "Växla mörkt läge", - "toggleZenMode": "Växla zen-läge", + "fullScreen": "Helskärm", + "darkMode": "Mörkt läge", + "lightMode": "Ljust läge", + "zenMode": "Zen-läge", "exitZenMode": "Gå ur zen-läge" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Laddning av extern skiss kommer att ersätta ditt befintliga innehåll. Vill du fortsätta?", "errorLoadingLibrary": "Fel vid inläsning av tredjeparts bibliotek.", "confirmAddLibrary": "Detta kommer att lägga till {{numShapes}} form(er) till ditt bibliotek. Är du säker?", - "imageDoesNotContainScene": "Bildfilen innehåller inte skissdata. Har du aktiverat detta under export?", + "imageDoesNotContainScene": "Importering av bilder stöds inte just nu.\n\nVill du importera en skiss? Den här bilden verkar inte innehålla någon skissdata. Har du aktiverat detta under export?", "cannotRestoreFromImage": "Skiss kunde inte återställas från denna bildfil" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Klicka på sista punkten eller tryck Escape eller Enter för att avsluta", + "lockAngle": "Du kan begränsa vinkeln genom att hålla SKIFT", "resize": "Du kan behålla proportioner genom att hålla SHIFT medan du ändrar storlek,\nhåller du ALT ändras storlek relativt mitten", "rotate": "Du kan begränsa vinklar genom att hålla SHIFT medan du roterar", "lineEditor_info": "Dubbelklicka eller tryck på Enter för att redigera punkter", diff --git a/src/locales/tr-TR.json b/src/locales/tr-TR.json index 3babf71b1..9c65b900c 100644 --- a/src/locales/tr-TR.json +++ b/src/locales/tr-TR.json @@ -4,7 +4,7 @@ "selectAll": "Tümünü seç", "multiSelect": "Seçime öge ekle", "moveCanvas": "Tuvali taşı", - "cut": "", + "cut": "Kes", "copy": "Kopyala", "copyAsPng": "Panoya PNG olarak kopyala", "copyAsSvg": "Panoya SVG olarak kopyala", @@ -37,7 +37,7 @@ "fontSize": "Yazı tipi boyutu", "fontFamily": "Yazı tipi ailesi", "onlySelected": "Sadece seçilen", - "withBackground": "Arka Plan İle Beraber", + "withBackground": "", "exportEmbedScene": "", "exportEmbedScene_details": "", "addWatermark": "\"Excalidraw ile yapıldı\" yazısını ekle", @@ -60,7 +60,7 @@ "architect": "Mimar", "artist": "Sanatçı", "cartoonist": "Karikatürist", - "fileTitle": "", + "fileTitle": "Dosya adı", "colorPicker": "Renk seçici", "canvasBackground": "Tuval arka planı", "drawingCanvas": "Çizim tuvali", @@ -69,27 +69,26 @@ "language": "Dil", "createRoom": "Ortak çalışma ortamını paylaş", "duplicateSelection": "Çoğalt", - "untitled": "", + "untitled": "Adsız", "name": "İsim", "yourName": "İsminiz", "madeWithExcalidraw": "Excalidraw ile yapıldı", "group": "Seçimi grup yap", "ungroup": "Seçilen grubu dağıt", "collaborators": "Ortaklar", - "toggleGridMode": "Izgara modunu aç", - "toggleStats": "", + "gridMode": "", "addToLibrary": "Kütüphaneye ekle", "removeFromLibrary": "Kütüphaneden kaldır", "libraryLoadingMessage": "Kütüphane yükleniyor...", "libraries": "", "loadingScene": "Çalışma alanı yükleniyor...", - "align": "", - "alignTop": "", - "alignBottom": "", - "alignLeft": "", - "alignRight": "", - "centerVertically": "", - "centerHorizontally": "", + "align": "Hizala", + "alignTop": "Yukarı hizala", + "alignBottom": "Aşağı hizala", + "alignLeft": "Sola yasla", + "alignRight": "Sağa yasla", + "centerVertically": "Dikeyde ortala", + "centerHorizontally": "Yatayda ortala", "distributeHorizontally": "", "distributeVertically": "" }, @@ -118,9 +117,10 @@ "redo": "Yeniden yap", "roomDialog": "Ortak çalışma ortamı yarat", "createNewRoom": "Yeni oda oluştur", - "toggleFullScreen": "Tam ekranı aç/kapa", - "toggleDarkMode": "Karanlık modu aç/kapa", - "toggleZenMode": "Zen modunu aç/kapa", + "fullScreen": "", + "darkMode": "", + "lightMode": "", + "zenMode": "", "exitZenMode": "Zen modundan çık" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Harici çizimler yüklemek mevcut olan içeriği değiştirecektir. Devam etmek istiyor musunuz?", "errorLoadingLibrary": "Üçüncü taraf kitaplığı yüklerken bir hata oluştu.", "confirmAddLibrary": "Bu, kitaplığınıza {{numShapes}} tane şekil ekleyecek. Emin misiniz?", - "imageDoesNotContainScene": "Görsel dosyası herhangi bir sahne verisi bulundurmuyor. Dışa aktarırken bunu etkinleştirdiniz mi?", + "imageDoesNotContainScene": "", "cannotRestoreFromImage": "Bu görsel dosyasından sahne onarılamıyor" }, "toolBar": { @@ -161,6 +161,7 @@ "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", "linearElementMulti": "Tamamlamak için son noktayı seçin veya Escape ve Enter'dan birine basın", + "lockAngle": "", "resize": "Yeniden boyutlandırırken SHIFT'e basılı tutarak oranları kısıtlayabilirsiniz, merkezden yeniden boyutlandırmak için ALT'a basılı tutun", "rotate": "Döndürürken SHIFT tuşuna basılı tutarak açıları koruyabilirsiniz", "lineEditor_info": "Noktaları düzenlemek için çift-tıklayın veya Enter'a basın", @@ -168,7 +169,7 @@ "lineEditor_nothingSelected": "Kaldırmak veya oynatmak için bir nokta seç, veya yeni noktalar eklemek için Alt'a basılı tut" }, "canvasError": { - "cannotShowPreview": "", + "cannotShowPreview": "Önizleme gösterilemiyor", "canvasTooBig": "", "canvasTooBigTip": "" }, @@ -220,15 +221,15 @@ "tooltip": "Çizimleriniz uçtan-uca şifrelenmiştir, Excalidraw'ın sunucuları bile onları göremez." }, "stats": { - "angle": "", - "element": "", - "elements": "", - "height": "", + "angle": "Açı", + "element": "Bileşen", + "elements": "Bileşenler", + "height": "Yükseklik", "scene": "", - "selected": "", - "storage": "", + "selected": "Seçili", + "storage": "Depolama", "title": "", - "total": "", + "total": "Toplam", "width": "" } } diff --git a/src/locales/uk-UA.json b/src/locales/uk-UA.json index 8237fb0f1..cfcc697e6 100644 --- a/src/locales/uk-UA.json +++ b/src/locales/uk-UA.json @@ -29,7 +29,7 @@ "edges": "Краї", "sharp": "Гострі", "round": "Круглі", - "arrowheads": "", + "arrowheads": "Закінчення стрілки", "arrowhead_none": "Жоден", "arrowhead_arrow": "Стрілка", "arrowhead_bar": "Колона", @@ -37,7 +37,7 @@ "fontSize": "Розмір шрифту", "fontFamily": "Шрифт", "onlySelected": "Тільки вибране", - "withBackground": "З тлом", + "withBackground": "З фоном", "exportEmbedScene": "Вставити сцену в експортований файл", "exportEmbedScene_details": "Дані сцени будуть збережені в експортований файл PNG/SVG. Ця сцена може бути відновленна з нього, однак це збільшить розмір експортованого файлу.", "addWatermark": "Додати «Накреслене в Excalidraw»", @@ -76,8 +76,7 @@ "group": "Групувати виділене", "ungroup": "Розгрупувати виділене", "collaborators": "Співавтори", - "toggleGridMode": "Режим сітки", - "toggleStats": "", + "gridMode": "Режим сітки", "addToLibrary": "Додати до бібліотеки", "removeFromLibrary": "Видалити з бібліотеки", "libraryLoadingMessage": "Завантажити бібліотеку...", @@ -118,9 +117,10 @@ "redo": "Повторити", "roomDialog": "Відкрити сесію спільної роботи", "createNewRoom": "Створити нову кімнату", - "toggleFullScreen": "Повноекранний режим", - "toggleDarkMode": "Переключити темний режим", - "toggleZenMode": "Дзен-режим", + "fullScreen": "Повноекранний режим", + "darkMode": "Темний режим", + "lightMode": "Світлий режим", + "zenMode": "Режим Дзен", "exitZenMode": "Вийти з дзен-режиму" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "Завантаження зовнішнього креслення замінить ваш наявний контент. Продовжити?", "errorLoadingLibrary": "Помилка при завантаженні сторонньої бібліотеки.", "confirmAddLibrary": "Це призведе до додавання {{numShapes}} фігур до вашої бібліотеки. Ви впевнені?", - "imageDoesNotContainScene": "Файл зображення не містить даних сцени. Ви увімкнули це під час експорту?", + "imageDoesNotContainScene": "Імпортування зображень на даний момент не підтримується.\n\nЧи хочете ви імпортувати сцену? Це зображення не містить ніяких даних сцен. Ви увімкнули це під час експорту?", "cannotRestoreFromImage": "Сцена не може бути відновлена з цього файлу зображення" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "Натисніть і потягніть, відпустіть коли завершите", "text": "Порада: можна також додати текст, двічі клацнувши по будь-якому місці інструментом вибору", "linearElementMulti": "Натисніть на останню точку, клацніть Esc або Enter щоб завершити", + "lockAngle": "", "resize": "Ви можете зберегти пропорції, утримуючи SHIFT під час зміни розміру,\nутримуйте ALT для змінення розміру від центру", "rotate": "Ви можете обмежити кути, утримуючи SHIFT під час обертання", "lineEditor_info": "Двічі клацніть або натисніть Enter щоб редагувати точки", @@ -227,7 +228,7 @@ "scene": "Сцена", "selected": "Вибраний", "storage": "Сховище", - "title": "", + "title": "Статистика", "total": "Всього", "width": "Ширина" } diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json index bf38e4a25..220ed9952 100644 --- a/src/locales/zh-CN.json +++ b/src/locales/zh-CN.json @@ -4,7 +4,7 @@ "selectAll": "全部选中", "multiSelect": "添加元素到选区", "moveCanvas": "移动画布", - "cut": "", + "cut": "剪切", "copy": "复制", "copyAsPng": "复制为 PNG 到剪贴板", "copyAsSvg": "复制为 SVG 到剪贴板", @@ -29,15 +29,15 @@ "edges": "边角", "sharp": "尖锐", "round": "圆润", - "arrowheads": "", - "arrowhead_none": "", - "arrowhead_arrow": "", - "arrowhead_bar": "", - "arrowhead_dot": "", + "arrowheads": "箭头", + "arrowhead_none": "无", + "arrowhead_arrow": "箭头", + "arrowhead_bar": "条", + "arrowhead_dot": "圆点", "fontSize": "字体大小", "fontFamily": "字体", "onlySelected": "仅被选中", - "withBackground": "添加背景", + "withBackground": "使用背景", "exportEmbedScene": "将场景嵌入到导出的文件", "exportEmbedScene_details": "场景数据将被保存到导出的 PNG/SVG 文件,以便恢复。\n将会增加导出的文件大小。", "addWatermark": "添加 “使用 Excalidraw 创建” 水印", @@ -76,12 +76,11 @@ "group": "组选", "ungroup": "取消组选", "collaborators": "协作者", - "toggleGridMode": "切换网格模式", - "toggleStats": "", + "gridMode": "网格模式", "addToLibrary": "添加到库中", "removeFromLibrary": "从库中移除", "libraryLoadingMessage": "正在加载库...", - "libraries": "", + "libraries": "浏览库", "loadingScene": "正在加载绘图...", "align": "对齐", "alignTop": "顶部对齐", @@ -118,9 +117,10 @@ "redo": "重做", "roomDialog": "开始实时协作", "createNewRoom": "新建会议室", - "toggleFullScreen": "切换全屏显示", - "toggleDarkMode": "切换暗黑模式", - "toggleZenMode": "切换禅模式", + "fullScreen": "全屏", + "darkMode": "暗色主题", + "lightMode": "浅色模式", + "zenMode": "禅意模式", "exitZenMode": "退出禅模式" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "加载外部绘图将取代您现有的内容。您想要继续吗?", "errorLoadingLibrary": "加载第三方库时出错。", "confirmAddLibrary": "这将添加 {{numShapes}} 个形状到您的库。您确定吗?", - "imageDoesNotContainScene": "图像文件不包含场景数据。您是否在导出过程中启用了此选项?", + "imageDoesNotContainScene": "当前不支持导入图片。\n\n您想要导入场景吗?此图像似乎不包含任何场景数据。您是否在导出过程中启用了这个数据?", "cannotRestoreFromImage": "无法从此图像文件恢复场景" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "点击并拖动,完成后发布", "text": "提示:您也可以使用选择工具双击任意位置来添加文字", "linearElementMulti": "点击最后一个点或按下 Esc/Enter 来完成", + "lockAngle": "可以按住 Shift 来约束角度", "resize": "您可以按住SHIFT来限制比例大小,\n按住ALT来调整中心大小", "rotate": "旋转时可以按住 Shift 来约束角度", "lineEditor_info": "双击或按回车键编辑", @@ -227,7 +228,7 @@ "scene": "场景", "selected": "选中", "storage": "存储", - "title": "", + "title": "玩家统计", "total": "总计", "width": "宽度" } diff --git a/src/locales/zh-TW.json b/src/locales/zh-TW.json index a567cc199..a21aa49bc 100644 --- a/src/locales/zh-TW.json +++ b/src/locales/zh-TW.json @@ -76,8 +76,7 @@ "group": "建立群組", "ungroup": "取消群組", "collaborators": "協作者", - "toggleGridMode": "切換格線模式", - "toggleStats": "切換詳細統計", + "gridMode": "網格模式", "addToLibrary": "加入資料庫", "removeFromLibrary": "從資料庫中移除", "libraryLoadingMessage": "資料庫讀取中…", @@ -118,9 +117,10 @@ "redo": "重做", "roomDialog": "開始即時協作", "createNewRoom": "建立新協作會議室", - "toggleFullScreen": "切換全螢幕", - "toggleDarkMode": "切換深色模式", - "toggleZenMode": "切換專注模式", + "fullScreen": "全螢幕", + "darkMode": "深色模式", + "lightMode": "淺色模式", + "zenMode": "專注模式", "exitZenMode": "離開專注模式" }, "alerts": { @@ -136,7 +136,7 @@ "loadSceneOverridePrompt": "讀取外部圖樣將取代目前的內容。是否要繼續?", "errorLoadingLibrary": "載入第三方套件時出現錯誤。", "confirmAddLibrary": "這將會將 {{numShapes}} 個圖形加入你的資料庫,你確定嗎?", - "imageDoesNotContainScene": "圖檔中未包含場景資料。輸出檔案時是否有包含此資料?", + "imageDoesNotContainScene": "目前尚不支援載入圖片。\n您是否要載入場景?此圖片中並無任何場景資料,輸出時是否有選擇包含?", "cannotRestoreFromImage": "無法由此檔案回復場景。" }, "toolBar": { @@ -161,6 +161,7 @@ "freeDraw": "點擊並拖曳來繪圖,放開即結束", "text": "提示:亦可使用選取工具在任何地方雙擊來加入文字", "linearElementMulti": "按下 Escape 或 Enter 以結束繪製", + "lockAngle": "按住 SHIFT 可限制旋轉角度", "resize": "縮放時按住 Shift 可保持原比例縮放;\\n按住 Alt 可由中心點進行縮放", "rotate": "旋轉時按住 Shift 可限制旋轉角度", "lineEditor_info": "雙擊滑鼠左鍵或按 Enter 來編輯控制點", From 0cf5f1ac1f775f7e33912d24ea7e77b5ee93221b Mon Sep 17 00:00:00 2001 From: Kostas Bariotis Date: Fri, 25 Dec 2020 20:02:12 +0200 Subject: [PATCH 03/45] chore: update Sentry (#2669) --- package-lock.json | 70 +++++++++++++++++++++++------------------------ package.json | 4 +-- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b6254386..0f4a7e2bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2663,70 +2663,70 @@ } }, "@sentry/browser": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.29.0.tgz", - "integrity": "sha512-kRlt1mE2wrYjspnIupNnPxqsUrRuy02SuXhbpP7J6uu8QasoEmJ78hk0hHz4jOZRmuWwfs2zIXD4tLGgWOKq8A==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.29.2.tgz", + "integrity": "sha512-uxZ7y7rp85tJll+RZtXRhXPbnFnOaxZqJEv05vJlXBtBNLQtlczV5iCtU9mZRLVHDtmZ5VVKUV8IKXntEqqDpQ==", "requires": { - "@sentry/core": "5.29.0", - "@sentry/types": "5.29.0", - "@sentry/utils": "5.29.0", + "@sentry/core": "5.29.2", + "@sentry/types": "5.29.2", + "@sentry/utils": "5.29.2", "tslib": "^1.9.3" } }, "@sentry/core": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.29.0.tgz", - "integrity": "sha512-a1sZBJ2u3NG0YDlGvOTwUCWiNjhfmDtAQiKK1o6RIIbcrWy9TlSps7CYDkBP239Y3A4pnvohjEEKEP3v3L3LZQ==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.29.2.tgz", + "integrity": "sha512-7WYkoxB5IdlNEbwOwqSU64erUKH4laavPsM0/yQ+jojM76ErxlgEF0u//p5WaLPRzh3iDSt6BH+9TL45oNZeZw==", "requires": { - "@sentry/hub": "5.29.0", - "@sentry/minimal": "5.29.0", - "@sentry/types": "5.29.0", - "@sentry/utils": "5.29.0", + "@sentry/hub": "5.29.2", + "@sentry/minimal": "5.29.2", + "@sentry/types": "5.29.2", + "@sentry/utils": "5.29.2", "tslib": "^1.9.3" } }, "@sentry/hub": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.29.0.tgz", - "integrity": "sha512-kcDPQsRG4cFdmqDh+TzjeO7lWYxU8s1dZYAbbl1J4uGKmhNB0J7I4ak4SGwTsXLY6fhbierxr6PRaoNojCxjPw==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.29.2.tgz", + "integrity": "sha512-LaAIo2hwUk9ykeh9RF0cwLy6IRw+DjEee8l1HfEaDFUM6TPGlNNGObMJNXb9/95jzWp7jWwOpQjoIE3jepdQJQ==", "requires": { - "@sentry/types": "5.29.0", - "@sentry/utils": "5.29.0", + "@sentry/types": "5.29.2", + "@sentry/utils": "5.29.2", "tslib": "^1.9.3" } }, "@sentry/integrations": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-5.29.0.tgz", - "integrity": "sha512-SGqpi1Qd1a7gGL6aYrJnKqU/DNJcHvnhD3qOgow23ivEpaJv1BtQSKxv17IbO/CIFn3A0o1a18wY6xef9isKEQ==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-5.29.2.tgz", + "integrity": "sha512-bH50B0xubbHrJFq8xZRxOc5BgXe1PXKfC0OqQkhhSd+Bu2WDLCHcn0CEzV+8thZTYkipAoFAFJNdEWcsM2Wcew==", "requires": { - "@sentry/types": "5.29.0", - "@sentry/utils": "5.29.0", + "@sentry/types": "5.29.2", + "@sentry/utils": "5.29.2", "localforage": "1.8.1", "tslib": "^1.9.3" } }, "@sentry/minimal": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.29.0.tgz", - "integrity": "sha512-nhXofdjtO41/caiF1wk1oT3p/QuhOZDYdF/b29DoD2MiAMK9IjhhOXI/gqaRpDKkXlDvd95fDTcx4t/MqqcKXA==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.29.2.tgz", + "integrity": "sha512-0aINSm8fGA1KyM7PavOBe1GDZDxrvnKt+oFnU0L+bTcw8Lr+of+v6Kwd97rkLRNOLw621xP076dL/7LSIzMuhw==", "requires": { - "@sentry/hub": "5.29.0", - "@sentry/types": "5.29.0", + "@sentry/hub": "5.29.2", + "@sentry/types": "5.29.2", "tslib": "^1.9.3" } }, "@sentry/types": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.29.0.tgz", - "integrity": "sha512-iDkxT/9sT3UF+Xb+JyLjZ5caMXsgLfRyV9VXQEiR2J6mgpMielj184d9jeF3bm/VMuAf/VFFqrHlcVsVgmrrMw==" + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.29.2.tgz", + "integrity": "sha512-dM9wgt8wy4WRty75QkqQgrw9FV9F+BOMfmc0iaX13Qos7i6Qs2Q0dxtJ83SoR4YGtW8URaHzlDtWlGs5egBiMA==" }, "@sentry/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-b2B1gshw2u3EHlAi84PuI5sfmLKXW1z9enMMhNuuNT/CoRp+g5kMAcUv/qYTws7UNnYSvTuVGuZG30v1e0hP9A==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.29.2.tgz", + "integrity": "sha512-nEwQIDjtFkeE4k6yIk4Ka5XjGRklNLThWLs2xfXlL7uwrYOH2B9UBBOOIRUraBm/g/Xrra3xsam/kRxuiwtXZQ==", "requires": { - "@sentry/types": "5.29.0", + "@sentry/types": "5.29.2", "tslib": "^1.9.3" } }, diff --git a/package.json b/package.json index b75d7bedb..2c5b7fd6b 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ ] }, "dependencies": { - "@sentry/browser": "5.29.0", - "@sentry/integrations": "5.29.0", + "@sentry/browser": "5.29.2", + "@sentry/integrations": "5.29.2", "@testing-library/jest-dom": "5.11.6", "@testing-library/react": "11.2.2", "@types/jest": "26.0.19", From bc414ccaaf731264b22c628f8f7c512cc9f2bff4 Mon Sep 17 00:00:00 2001 From: Luo Date: Sat, 26 Dec 2020 02:34:47 +0800 Subject: [PATCH 04/45] feat: tweak editing behavior (#2668) * feat: tweak editing behavior * fix tests Co-authored-by: dwelle --- src/components/App.tsx | 4 +- .../regressionTests.test.tsx.snap | 174 +++++++++--------- src/tests/helpers/ui.ts | 56 +++++- src/tests/move.test.tsx | 6 +- src/tests/regressionTests.test.tsx | 54 ++---- 5 files changed, 161 insertions(+), 133 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index e312cf316..5599b9515 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -2462,8 +2462,7 @@ class App extends React.Component { // otherwise, it will trigger selection based on current // state of the box if (!this.state.selectedElementIds[hitElement.id]) { - // if we are currently editing a group, treat all selections outside of the group - // as exiting editing mode. + // if we are currently editing a group, exiting editing mode and deselect the group. if ( this.state.editingGroupId && !isElementInGroup(hitElement, this.state.editingGroupId) @@ -2473,7 +2472,6 @@ class App extends React.Component { selectedGroupIds: {}, editingGroupId: null, }); - return true; } // Add hit element to selection. At this point if we're not holding diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap index f9cee43f3..0f5db1c95 100644 --- a/src/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap @@ -18537,7 +18537,9 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, - "previousSelectedElementIds": Object {}, + "previousSelectedElementIds": Object { + "id0": true, + }, "resizingElement": null, "scrollX": 0, "scrollY": 0, @@ -18575,7 +18577,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -18588,9 +18590,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, } `; @@ -18604,7 +18606,7 @@ Object { "id5", "id3", ], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -18617,9 +18619,9 @@ Object { "type": "rectangle", "version": 4, "versionNonce": 400692809, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, } `; @@ -18633,7 +18635,7 @@ Object { "id5", "id3", ], - "height": 10, + "height": 50, "id": "id2", "isDeleted": false, "opacity": 100, @@ -18646,9 +18648,9 @@ Object { "type": "rectangle", "version": 4, "versionNonce": 1604849351, - "width": 10, - "x": 50, - "y": 10, + "width": 50, + "x": 200, + "y": 200, } `; @@ -18684,7 +18686,7 @@ Object { "boundElementIds": null, "fillStyle": "hachure", "groupIds": Array [], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -18697,9 +18699,9 @@ Object { "type": "rectangle", "version": 2, "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, ], }, @@ -18720,7 +18722,7 @@ Object { "boundElementIds": null, "fillStyle": "hachure", "groupIds": Array [], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -18733,9 +18735,9 @@ Object { "type": "rectangle", "version": 2, "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, Object { "angle": 0, @@ -18743,7 +18745,7 @@ Object { "boundElementIds": null, "fillStyle": "hachure", "groupIds": Array [], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -18756,9 +18758,9 @@ Object { "type": "rectangle", "version": 2, "versionNonce": 453191, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, }, ], }, @@ -18779,7 +18781,7 @@ Object { "boundElementIds": null, "fillStyle": "hachure", "groupIds": Array [], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -18792,9 +18794,9 @@ Object { "type": "rectangle", "version": 2, "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, Object { "angle": 0, @@ -18802,7 +18804,7 @@ Object { "boundElementIds": null, "fillStyle": "hachure", "groupIds": Array [], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -18815,9 +18817,9 @@ Object { "type": "rectangle", "version": 2, "versionNonce": 453191, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, }, Object { "angle": 0, @@ -18825,7 +18827,7 @@ Object { "boundElementIds": null, "fillStyle": "hachure", "groupIds": Array [], - "height": 10, + "height": 50, "id": "id2", "isDeleted": false, "opacity": 100, @@ -18838,9 +18840,9 @@ Object { "type": "rectangle", "version": 2, "versionNonce": 2019559783, - "width": 10, - "x": 50, - "y": 10, + "width": 50, + "x": 200, + "y": 200, }, ], }, @@ -18865,7 +18867,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -18878,9 +18880,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1150084233, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, Object { "angle": 0, @@ -18890,7 +18892,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -18903,9 +18905,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, }, Object { "angle": 0, @@ -18915,7 +18917,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id2", "isDeleted": false, "opacity": 100, @@ -18928,9 +18930,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1014066025, - "width": 10, - "x": 50, - "y": 10, + "width": 50, + "x": 200, + "y": 200, }, ], }, @@ -18955,7 +18957,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -18968,9 +18970,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1150084233, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, Object { "angle": 0, @@ -18980,7 +18982,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -18993,9 +18995,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, }, Object { "angle": 0, @@ -19005,7 +19007,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id2", "isDeleted": false, "opacity": 100, @@ -19018,9 +19020,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1014066025, - "width": 10, - "x": 50, - "y": 10, + "width": 50, + "x": 200, + "y": 200, }, ], }, @@ -19045,7 +19047,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -19058,9 +19060,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, }, Object { "angle": 0, @@ -19071,7 +19073,7 @@ Object { "id5", "id3", ], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -19084,9 +19086,9 @@ Object { "type": "rectangle", "version": 4, "versionNonce": 400692809, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, Object { "angle": 0, @@ -19097,7 +19099,7 @@ Object { "id5", "id3", ], - "height": 10, + "height": 50, "id": "id2", "isDeleted": false, "opacity": 100, @@ -19110,9 +19112,9 @@ Object { "type": "rectangle", "version": 4, "versionNonce": 1604849351, - "width": 10, - "x": 50, - "y": 10, + "width": 50, + "x": 200, + "y": 200, }, ], }, @@ -19138,7 +19140,7 @@ Object { "groupIds": Array [ "id3", ], - "height": 10, + "height": 50, "id": "id1", "isDeleted": false, "opacity": 100, @@ -19151,9 +19153,9 @@ Object { "type": "rectangle", "version": 3, "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, + "width": 50, + "x": 100, + "y": 100, }, Object { "angle": 0, @@ -19164,7 +19166,7 @@ Object { "id5", "id3", ], - "height": 10, + "height": 50, "id": "id0", "isDeleted": false, "opacity": 100, @@ -19177,9 +19179,9 @@ Object { "type": "rectangle", "version": 4, "versionNonce": 400692809, - "width": 10, - "x": 10, - "y": 10, + "width": 50, + "x": 0, + "y": 0, }, Object { "angle": 0, @@ -19190,7 +19192,7 @@ Object { "id5", "id3", ], - "height": 10, + "height": 50, "id": "id2", "isDeleted": false, "opacity": 100, @@ -19203,9 +19205,9 @@ Object { "type": "rectangle", "version": 4, "versionNonce": 1604849351, - "width": 10, - "x": 50, - "y": 10, + "width": 50, + "x": 200, + "y": 200, }, ], }, @@ -19215,7 +19217,7 @@ Object { exports[`regression tests supports nested groups: [end of test] number of elements 1`] = `3`; -exports[`regression tests supports nested groups: [end of test] number of renders 1`] = `29`; +exports[`regression tests supports nested groups: [end of test] number of renders 1`] = `28`; exports[`regression tests switches from group of selected elements to another element on pointer down: [end of test] appState 1`] = ` Object { diff --git a/src/tests/helpers/ui.ts b/src/tests/helpers/ui.ts index 1ae572044..5f8f23c76 100644 --- a/src/tests/helpers/ui.ts +++ b/src/tests/helpers/ui.ts @@ -169,6 +169,12 @@ export class Pointer { this.click(element.x, element.y); this.reset(); } + + doubleClickOn(element: ExcalidrawElement) { + this.reset(); + this.doubleClick(element.x, element.y); + this.reset(); + } } const mouse = new Pointer("mouse"); @@ -178,32 +184,72 @@ export class UI { fireEvent.click(GlobalTestState.renderResult.getByToolName(toolName)); }; + /** + * 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 + * the app's elements array. This is because across the app lifecycle we tend + * to recreate element objects and the returned reference will become stale. + * + * If you need to get the actual element, not the proxy, call `get()` method + * on the proxy object. + */ static createElement( type: T, { - x = 0, - y = 0, + position = 0, + x = position, + y = position, size = 10, width = size, height = width, }: { + position?: number; x?: number; y?: number; size?: number; width?: number; height?: number; } = {}, - ): T extends "arrow" | "line" | "draw" + ): (T extends "arrow" | "line" | "draw" ? ExcalidrawLinearElement : T extends "text" ? ExcalidrawTextElement - : ExcalidrawElement { + : ExcalidrawElement) & { + /** Returns the actual, current element from the elements array, instead + of the proxy */ + get(): T extends "arrow" | "line" | "draw" + ? ExcalidrawLinearElement + : T extends "text" + ? ExcalidrawTextElement + : ExcalidrawElement; + } { UI.clickTool(type); mouse.reset(); mouse.down(x, y); mouse.reset(); mouse.up(x + (width ?? height ?? size), y + (height ?? size)); - return h.elements[h.elements.length - 1] as any; + + const origElement = h.elements[h.elements.length - 1] as any; + + 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; } static group(elements: ExcalidrawElement[]) { diff --git a/src/tests/move.test.tsx b/src/tests/move.test.tsx index 9d58b0873..e97ace31f 100644 --- a/src/tests/move.test.tsx +++ b/src/tests/move.test.tsx @@ -69,9 +69,9 @@ describe("move element", () => { // bind line to two rectangles bindOrUnbindLinearElement( - line as NonDeleted, - rectA as ExcalidrawRectangleElement, - rectB as ExcalidrawRectangleElement, + line.get() as NonDeleted, + rectA.get() as ExcalidrawRectangleElement, + rectB.get() as ExcalidrawRectangleElement, ); // select the second rectangles diff --git a/src/tests/regressionTests.test.tsx b/src/tests/regressionTests.test.tsx index 1a2aaa6a8..eb3edbdfb 100644 --- a/src/tests/regressionTests.test.tsx +++ b/src/tests/regressionTests.test.tsx @@ -558,64 +558,46 @@ describe("regression tests", () => { }); it("supports nested groups", () => { - const positions: number[][] = []; - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(10, 10); - positions.push(mouse.getPosition()); - - UI.clickTool("rectangle"); - mouse.down(10, -10); - mouse.up(10, 10); - positions.push(mouse.getPosition()); - - UI.clickTool("rectangle"); - mouse.down(10, -10); - mouse.up(10, 10); - positions.push(mouse.getPosition()); + const rectA = UI.createElement("rectangle", { position: 0, size: 50 }); + const rectB = UI.createElement("rectangle", { position: 100, size: 50 }); + const rectC = UI.createElement("rectangle", { position: 200, size: 50 }); Keyboard.withModifierKeys({ ctrl: true }, () => { Keyboard.keyPress(KEYS.A); Keyboard.codePress(CODES.G); }); - mouse.doubleClick(); + mouse.doubleClickOn(rectC); Keyboard.withModifierKeys({ shift: true }, () => { - mouse.restorePosition(...positions[0]); - mouse.click(); + mouse.clickOn(rectA); }); Keyboard.withModifierKeys({ ctrl: true }, () => { Keyboard.codePress(CODES.G); }); - const groupIds = h.elements[2].groupIds; - expect(groupIds.length).toBe(2); - expect(h.elements[1].groupIds).toEqual(groupIds); - expect(h.elements[0].groupIds).toEqual(groupIds.slice(1)); + expect(rectC.groupIds.length).toBe(2); + expect(rectA.groupIds).toEqual(rectC.groupIds); + expect(rectB.groupIds).toEqual(rectA.groupIds.slice(1)); - mouse.click(50, 50); + mouse.click(0, 100); expect(API.getSelectedElements().length).toBe(0); - mouse.restorePosition(...positions[0]); - mouse.click(); + + mouse.clickOn(rectA); expect(API.getSelectedElements().length).toBe(3); expect(h.state.editingGroupId).toBe(null); - mouse.doubleClick(); + mouse.doubleClickOn(rectA); expect(API.getSelectedElements().length).toBe(2); - expect(h.state.editingGroupId).toBe(groupIds[1]); + expect(h.state.editingGroupId).toBe(rectA.groupIds[1]); - mouse.doubleClick(); + mouse.doubleClickOn(rectA); expect(API.getSelectedElements().length).toBe(1); - expect(h.state.editingGroupId).toBe(groupIds[0]); + expect(h.state.editingGroupId).toBe(rectA.groupIds[0]); - // click out of the group - mouse.restorePosition(...positions[1]); - mouse.click(); - expect(API.getSelectedElements().length).toBe(0); - mouse.click(); + // click outside current (sub)group + mouse.clickOn(rectB); expect(API.getSelectedElements().length).toBe(3); - mouse.doubleClick(); + mouse.doubleClickOn(rectB); expect(API.getSelectedElements().length).toBe(1); }); From 8091ac6c088f4aaf8bdc91faa0756c848cf394a9 Mon Sep 17 00:00:00 2001 From: Harshil Parmar Date: Sun, 27 Dec 2020 00:53:51 +0530 Subject: [PATCH 05/45] style: media query for hiding shortcuts for mobile view (#2667) Co-authored-by: Lipis --- src/components/ContextMenu.scss | 24 +++++++++++++++++++----- src/components/ContextMenu.tsx | 4 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/components/ContextMenu.scss b/src/components/ContextMenu.scss index f2acaaad3..089c9013b 100644 --- a/src/components/ContextMenu.scss +++ b/src/components/ContextMenu.scss @@ -1,4 +1,4 @@ -@import "open-color/open-color.scss"; +@import "../css/_variables"; .excalidraw { .context-menu { @@ -42,16 +42,16 @@ } &.dangerous { - div:nth-child(1) { + .context-menu-option__label { color: $oc-red-7; } } - div:nth-child(1) { + .context-menu-option__label { justify-self: start; margin-inline-end: 20px; } - div:nth-child(2) { + .context-menu-option__shortcut { justify-self: end; opacity: 0.6; font-size: 0.7rem; @@ -63,7 +63,7 @@ background-color: var(--select-highlight-color); &.dangerous { - div:nth-child(1) { + .context-menu-option__label { color: var(--popup-background-color); } background-color: $oc-red-6; @@ -73,4 +73,18 @@ .context-menu-option:focus { z-index: 1; } + + @media #{$media-query} { + .context-menu-option { + display: block; + + .context-menu-option__label { + margin-inline-end: 0; + } + + .context-menu-option__shortcut { + display: none; + } + } + } } diff --git a/src/components/ContextMenu.tsx b/src/components/ContextMenu.tsx index 390673821..27d14d880 100644 --- a/src/components/ContextMenu.tsx +++ b/src/components/ContextMenu.tsx @@ -51,8 +51,8 @@ const ContextMenu = ({ options, onCloseRequest, top, left }: Props) => { ${checked ? "checkmark" : ""}`} onClick={action} > -
{label}
-
+
{label}
+
{shortcutName ? getShortcutFromShortcutName(shortcutName) : ""} From c1e2146d78662ce9d234da82884c5963395aff2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 27 Dec 2020 13:51:54 +0200 Subject: [PATCH 06/45] chore(deps-dev): bump firebase-tools from 9.0.1 to 9.1.0 (#2676) Bumps [firebase-tools](https://github.com/firebase/firebase-tools) from 9.0.1 to 9.1.0. - [Release notes](https://github.com/firebase/firebase-tools/releases) - [Commits](https://github.com/firebase/firebase-tools/compare/v9.0.1...v9.1.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f4a7e2bb..0dcf1e7ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9039,9 +9039,9 @@ } }, "firebase-tools": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/firebase-tools/-/firebase-tools-9.0.1.tgz", - "integrity": "sha512-OktyHgjIBJR/JPNU4Xv4NsRLWu5gDnTmYd88VUsMwzUMCkbao2NNpeBi6+0rn6U1zNhwP2WW9PngccJWg/wvSA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/firebase-tools/-/firebase-tools-9.1.0.tgz", + "integrity": "sha512-hTfxL2meJSl5WuwAS6bEJ5nay7tu3MNYb4ZL2KmPL7yLM3IeT+Qd2z1evHhW1VvbDXKR6RTwlBxzdWPs4l75kA==", "dev": true, "requires": { "@google-cloud/pubsub": "^2.7.0", @@ -10085,9 +10085,9 @@ } }, "@types/node": { - "version": "12.19.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.9.tgz", - "integrity": "sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q==", + "version": "12.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.11.tgz", + "integrity": "sha512-bwVfNTFZOrGXyiQ6t4B9sZerMSShWNsGRw8tC5DY1qImUNczS9SjT4G6PnzjCnxsu5Ubj6xjL2lgwddkxtQl5w==", "dev": true }, "ansi-styles": { diff --git a/package.json b/package.json index 2c5b7fd6b..e78309da2 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@types/pako": "1.0.1", "eslint-config-prettier": "7.1.0", "eslint-plugin-prettier": "3.3.0", - "firebase-tools": "9.0.1", + "firebase-tools": "9.1.0", "husky": "4.3.6", "jest-canvas-mock": "2.3.0", "lint-staged": "10.5.3", From 022f349dc67b35169d4815cff724331e8476b5bc Mon Sep 17 00:00:00 2001 From: Lipis Date: Sun, 27 Dec 2020 18:26:30 +0200 Subject: [PATCH 07/45] feat: Add line chart and paste dialog selection (#2670) Co-authored-by: dwelle Co-authored-by: Jed Fox --- src/actions/actionCanvas.tsx | 28 +- src/appState.ts | 117 ++--- src/charts.ts | 431 +++++++++++++----- src/components/App.tsx | 331 +++++++------- src/components/Dialog.tsx | 14 +- src/components/LayerUI.tsx | 58 ++- src/components/LibraryUnit.tsx | 12 +- src/components/MobileMenu.tsx | 2 - src/components/PasteChartDialog.scss | 46 ++ src/components/PasteChartDialog.tsx | 121 +++++ src/components/Stats.tsx | 1 - src/element/types.ts | 1 + src/locales/en.json | 6 +- .../regressionTests.test.tsx.snap | 335 ++++++++++++++ src/types.ts | 12 + 15 files changed, 1122 insertions(+), 393 deletions(-) create mode 100644 src/components/PasteChartDialog.scss create mode 100644 src/components/PasteChartDialog.tsx diff --git a/src/actions/actionCanvas.tsx b/src/actions/actionCanvas.tsx index 5435aab34..aff1a7f66 100644 --- a/src/actions/actionCanvas.tsx +++ b/src/actions/actionCanvas.tsx @@ -1,23 +1,22 @@ import React from "react"; -import { ColorPicker } from "../components/ColorPicker"; +import { EVENT_ACTION, EVENT_CHANGE, trackEvent } from "../analytics"; import { getDefaultAppState } from "../appState"; -import { trash, zoomIn, zoomOut, resetZoom } from "../components/icons"; +import colors from "../colors"; +import { ColorPicker } from "../components/ColorPicker"; +import { resetZoom, trash, zoomIn, zoomOut } from "../components/icons"; import { ToolButton } from "../components/ToolButton"; -import { t } from "../i18n"; -import { getNormalizedZoom, getSelectedElements } from "../scene"; -import { getNonDeletedElements } from "../element"; -import { CODES, KEYS } from "../keys"; -import { getShortcutKey } from "../utils"; -import useIsMobile from "../is-mobile"; -import { register } from "./register"; +import { getCommonBounds, getNonDeletedElements } from "../element"; import { newElementWith } from "../element/mutateElement"; import { ExcalidrawElement } from "../element/types"; -import { AppState, NormalizedZoomValue } from "../types"; -import { getCommonBounds } from "../element"; -import { getNewZoom } from "../scene/zoom"; +import { t } from "../i18n"; +import useIsMobile from "../is-mobile"; +import { CODES, KEYS } from "../keys"; +import { getNormalizedZoom, getSelectedElements } from "../scene"; import { centerScrollOn } from "../scene/scroll"; -import { EVENT_ACTION, EVENT_CHANGE, trackEvent } from "../analytics"; -import colors from "../colors"; +import { getNewZoom } from "../scene/zoom"; +import { AppState, NormalizedZoomValue } from "../types"; +import { getShortcutKey } from "../utils"; +import { register } from "./register"; export const actionChangeViewBackgroundColor = register({ name: "changeViewBackgroundColor", @@ -67,6 +66,7 @@ export const actionClearCanvas = register({ gridSize: appState.gridSize, shouldAddWatermark: appState.shouldAddWatermark, showStats: appState.showStats, + pasteDialog: appState.pasteDialog, }, commitToHistory: true, }; diff --git a/src/appState.ts b/src/appState.ts index 7b8eba034..02036a43e 100644 --- a/src/appState.ts +++ b/src/appState.ts @@ -1,12 +1,12 @@ import oc from "open-color"; -import { AppState, FlooredNumber, NormalizedZoomValue } from "./types"; -import { getDateTime } from "./utils"; -import { t } from "./i18n"; import { - DEFAULT_FONT_SIZE, DEFAULT_FONT_FAMILY, + DEFAULT_FONT_SIZE, DEFAULT_TEXT_ALIGN, } from "./constants"; +import { t } from "./i18n"; +import { AppState, FlooredNumber, NormalizedZoomValue } from "./types"; +import { getDateTime } from "./utils"; export const getDefaultAppState = (): Omit< AppState, @@ -14,64 +14,63 @@ export const getDefaultAppState = (): Omit< > => { return { appearance: "light", - isLoading: false, - errorMessage: null, + collaborators: new Map(), + currentChartType: "bar", + currentItemBackgroundColor: "transparent", + currentItemEndArrowhead: "arrow", + currentItemFillStyle: "hachure", + currentItemFontFamily: DEFAULT_FONT_FAMILY, + currentItemFontSize: DEFAULT_FONT_SIZE, + currentItemLinearStrokeSharpness: "round", + currentItemOpacity: 100, + currentItemRoughness: 1, + currentItemStartArrowhead: null, + currentItemStrokeColor: oc.black, + currentItemStrokeSharpness: "sharp", + currentItemStrokeStyle: "solid", + currentItemStrokeWidth: 1, + currentItemTextAlign: DEFAULT_TEXT_ALIGN, + cursorButton: "up", draggingElement: null, - resizingElement: null, - multiElement: null, editingElement: null, - startBoundElement: null, + editingGroupId: null, editingLinearElement: null, - elementType: "selection", elementLocked: false, + elementType: "selection", + errorMessage: null, exportBackground: true, exportEmbedScene: false, - shouldAddWatermark: false, - currentItemStrokeColor: oc.black, - currentItemBackgroundColor: "transparent", - currentItemFillStyle: "hachure", - currentItemStrokeWidth: 1, - currentItemStrokeStyle: "solid", - currentItemRoughness: 1, - currentItemOpacity: 100, - currentItemFontSize: DEFAULT_FONT_SIZE, - currentItemFontFamily: DEFAULT_FONT_FAMILY, - currentItemTextAlign: DEFAULT_TEXT_ALIGN, - currentItemStrokeSharpness: "sharp", - currentItemLinearStrokeSharpness: "round", - currentItemStartArrowhead: null, - currentItemEndArrowhead: "arrow", - viewBackgroundColor: oc.white, - scrollX: 0 as FlooredNumber, - scrollY: 0 as FlooredNumber, - cursorButton: "up", - scrolledOutside: false, - name: `${t("labels.untitled")}-${getDateTime()}`, + fileHandle: null, + gridSize: null, + height: window.innerHeight, isBindingEnabled: true, + isLibraryOpen: false, + isLoading: false, isResizing: false, isRotating: false, - selectionElement: null, - zoom: { - value: 1 as NormalizedZoomValue, - translation: { x: 0, y: 0 }, - }, - openMenu: null, lastPointerDownWith: "mouse", - selectedElementIds: {}, + multiElement: null, + name: `${t("labels.untitled")}-${getDateTime()}`, + openMenu: null, + pasteDialog: { shown: false, data: null }, previousSelectedElementIds: {}, + resizingElement: null, + scrolledOutside: false, + scrollX: 0 as FlooredNumber, + scrollY: 0 as FlooredNumber, + selectedElementIds: {}, + selectedGroupIds: {}, + selectionElement: null, + shouldAddWatermark: false, shouldCacheIgnoreZoom: false, showShortcutsDialog: false, - suggestedBindings: [], - zenModeEnabled: false, - gridSize: null, - editingGroupId: null, - selectedGroupIds: {}, - width: window.innerWidth, - height: window.innerHeight, - isLibraryOpen: false, - fileHandle: null, - collaborators: new Map(), showStats: false, + startBoundElement: null, + suggestedBindings: [], + viewBackgroundColor: oc.white, + width: window.innerWidth, + zenModeEnabled: false, + zoom: { value: 1 as NormalizedZoomValue, translation: { x: 0, y: 0 } }, }; }; @@ -91,24 +90,25 @@ const APP_STATE_STORAGE_CONF = (< config: { [K in keyof T]: K extends keyof AppState ? T[K] : never }, ) => config)({ appearance: { browser: true, export: false }, + collaborators: { browser: false, export: false }, + currentChartType: { browser: true, export: false }, currentItemBackgroundColor: { browser: true, export: false }, + currentItemEndArrowhead: { browser: true, export: false }, currentItemFillStyle: { browser: true, export: false }, currentItemFontFamily: { browser: true, export: false }, currentItemFontSize: { browser: true, export: false }, + currentItemLinearStrokeSharpness: { browser: true, export: false }, currentItemOpacity: { browser: true, export: false }, currentItemRoughness: { browser: true, export: false }, + currentItemStartArrowhead: { browser: true, export: false }, currentItemStrokeColor: { browser: true, export: false }, + currentItemStrokeSharpness: { browser: true, export: false }, currentItemStrokeStyle: { browser: true, export: false }, currentItemStrokeWidth: { browser: true, export: false }, currentItemTextAlign: { browser: true, export: false }, - currentItemStrokeSharpness: { browser: true, export: false }, - currentItemLinearStrokeSharpness: { browser: true, export: false }, - currentItemStartArrowhead: { browser: true, export: false }, - currentItemEndArrowhead: { browser: true, export: false }, cursorButton: { browser: true, export: false }, draggingElement: { browser: false, export: false }, editingElement: { browser: false, export: false }, - startBoundElement: { browser: false, export: false }, editingGroupId: { browser: true, export: false }, editingLinearElement: { browser: false, export: false }, elementLocked: { browser: true, export: false }, @@ -116,6 +116,7 @@ const APP_STATE_STORAGE_CONF = (< errorMessage: { browser: false, export: false }, exportBackground: { browser: true, export: false }, exportEmbedScene: { browser: true, export: false }, + fileHandle: { browser: false, export: false }, gridSize: { browser: true, export: true }, height: { browser: false, export: false }, isBindingEnabled: { browser: false, export: false }, @@ -126,7 +127,10 @@ const APP_STATE_STORAGE_CONF = (< lastPointerDownWith: { browser: true, export: false }, multiElement: { browser: false, export: false }, name: { browser: true, export: false }, + offsetLeft: { browser: false, export: false }, + offsetTop: { browser: false, export: false }, openMenu: { browser: true, export: false }, + pasteDialog: { browser: false, export: false }, previousSelectedElementIds: { browser: true, export: false }, resizingElement: { browser: false, export: false }, scrolledOutside: { browser: true, export: false }, @@ -138,16 +142,13 @@ const APP_STATE_STORAGE_CONF = (< shouldAddWatermark: { browser: true, export: false }, shouldCacheIgnoreZoom: { browser: true, export: false }, showShortcutsDialog: { browser: false, export: false }, + showStats: { browser: true, export: false }, + startBoundElement: { browser: false, export: false }, suggestedBindings: { browser: false, export: false }, viewBackgroundColor: { browser: true, export: true }, width: { browser: false, export: false }, zenModeEnabled: { browser: true, export: false }, zoom: { browser: true, export: false }, - offsetTop: { browser: false, export: false }, - offsetLeft: { browser: false, export: false }, - fileHandle: { browser: false, export: false }, - collaborators: { browser: false, export: false }, - showStats: { browser: true, export: false }, }); const _clearAppStateForStorage = ( diff --git a/src/charts.ts b/src/charts.ts index 5e49e936e..81d27f319 100644 --- a/src/charts.ts +++ b/src/charts.ts @@ -1,13 +1,21 @@ import { EVENT_MAGIC, trackEvent } from "./analytics"; import colors from "./colors"; -import { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE } from "./constants"; -import { newElement, newTextElement, newLinearElement } from "./element"; -import { ExcalidrawElement } from "./element/types"; +import { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, ENV } from "./constants"; +import { newElement, newLinearElement, newTextElement } from "./element"; +import { NonDeletedExcalidrawElement } from "./element/types"; import { randomId } from "./random"; +export type ChartElements = readonly NonDeletedExcalidrawElement[]; + const BAR_WIDTH = 32; const BAR_GAP = 12; const BAR_HEIGHT = 256; +const GRID_OPACITY = 50; + +export const CHART_LABELS = { + bar: "labels.chartTypeBar", + line: "labels.chartTypeLine", +}; export interface Spreadsheet { title: string | null; @@ -139,114 +147,48 @@ export const tryParseSpreadsheet = (text: string): ParseSpreadsheetResult => { return transposedResults; } } - return result; }; -// For the maths behind it https://excalidraw.com/#json=6320864370884608,O_5xfD-Agh32tytHpRJx1g -export const renderSpreadsheet = ( +const bgColors = colors.elementBackground.slice( + 2, + colors.elementBackground.length, +); + +// Put all the common properties here so when the whole chart is selected +// the properties dialog shows the correct selected values +const commonProps = { + fillStyle: "hachure", + fontFamily: DEFAULT_FONT_FAMILY, + fontSize: DEFAULT_FONT_SIZE, + opacity: 100, + roughness: 1, + strokeColor: colors.elementStroke[0], + strokeSharpness: "sharp", + strokeStyle: "solid", + strokeWidth: 1, + verticalAlign: "middle", +} as const; + +const getChartDimentions = (spreadsheet: Spreadsheet) => { + const chartWidth = + (BAR_WIDTH + BAR_GAP) * spreadsheet.values.length + BAR_GAP; + const chartHeight = BAR_HEIGHT + BAR_GAP * 2; + return { chartWidth, chartHeight }; +}; + +const chartXLabels = ( spreadsheet: Spreadsheet, x: number, y: number, -): ExcalidrawElement[] => { - const values = spreadsheet.values; - const max = Math.max(...values); - const chartHeight = BAR_HEIGHT + BAR_GAP * 2; - const chartWidth = (BAR_WIDTH + BAR_GAP) * values.length + BAR_GAP; - const maxColors = colors.elementBackground.length; - const bgColors = colors.elementBackground.slice(2, maxColors); - - // Put all the common properties here so when the whole chart is selected - // the properties dialog shows the correct selected values - const commonProps = { - backgroundColor: bgColors[Math.floor(Math.random() * bgColors.length)], - fillStyle: "hachure", - fontFamily: DEFAULT_FONT_FAMILY, - fontSize: DEFAULT_FONT_SIZE, - groupIds: [randomId()], - opacity: 100, - roughness: 1, - strokeColor: colors.elementStroke[0], - strokeSharpness: "sharp", - strokeStyle: "solid", - strokeWidth: 1, - verticalAlign: "middle", - } as const; - - const minYLabel = newTextElement({ - ...commonProps, - x: x - BAR_GAP, - y: y - BAR_GAP, - text: "0", - textAlign: "right", - }); - - const maxYLabel = newTextElement({ - ...commonProps, - x: x - BAR_GAP, - y: y - BAR_HEIGHT - minYLabel.height / 2, - text: max.toLocaleString(), - textAlign: "right", - }); - - const xAxisLine = newLinearElement({ - type: "line", - x, - y, - startArrowhead: null, - endArrowhead: null, - width: chartWidth, - points: [ - [0, 0], - [chartWidth, 0], - ], - ...commonProps, - }); - - const yAxisLine = newLinearElement({ - type: "line", - x, - y, - startArrowhead: null, - endArrowhead: null, - height: chartHeight, - points: [ - [0, 0], - [0, -chartHeight], - ], - ...commonProps, - }); - - const maxValueLine = newLinearElement({ - type: "line", - x, - y: y - BAR_HEIGHT - BAR_GAP, - startArrowhead: null, - endArrowhead: null, - ...commonProps, - strokeStyle: "dotted", - width: chartWidth, - points: [ - [0, 0], - [chartWidth, 0], - ], - }); - - const bars = values.map((value, index) => { - const barHeight = (value / max) * BAR_HEIGHT; - return newElement({ - ...commonProps, - type: "rectangle", - x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP, - y: y - barHeight - BAR_GAP, - width: BAR_WIDTH, - height: barHeight, - }); - }); - - const xLabels = + groupId: string, + backgroundColor: string, +): ChartElements => { + return ( spreadsheet.labels?.map((label, index) => { return newTextElement({ + groupIds: [groupId], + backgroundColor, ...commonProps, text: label.length > 8 ? `${label.slice(0, 5)}...` : label, x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP * 2, @@ -257,29 +199,288 @@ export const renderSpreadsheet = ( textAlign: "center", verticalAlign: "top", }); - }) || []; + }) || [] + ); +}; + +const chartYLabels = ( + spreadsheet: Spreadsheet, + x: number, + y: number, + groupId: string, + backgroundColor: string, +): ChartElements => { + const minYLabel = newTextElement({ + groupIds: [groupId], + backgroundColor, + ...commonProps, + x: x - BAR_GAP, + y: y - BAR_GAP, + text: "0", + textAlign: "right", + }); + + const maxYLabel = newTextElement({ + groupIds: [groupId], + backgroundColor, + ...commonProps, + x: x - BAR_GAP, + y: y - BAR_HEIGHT - minYLabel.height / 2, + text: Math.max(...spreadsheet.values).toLocaleString(), + textAlign: "right", + }); + + return [minYLabel, maxYLabel]; +}; + +const chartLines = ( + spreadsheet: Spreadsheet, + x: number, + y: number, + groupId: string, + backgroundColor: string, +): ChartElements => { + const { chartWidth, chartHeight } = getChartDimentions(spreadsheet); + const xLine = newLinearElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "line", + x, + y, + startArrowhead: null, + endArrowhead: null, + width: chartWidth, + points: [ + [0, 0], + [chartWidth, 0], + ], + }); + + const yLine = newLinearElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "line", + x, + y, + startArrowhead: null, + endArrowhead: null, + height: chartHeight, + points: [ + [0, 0], + [0, -chartHeight], + ], + }); + + const maxLine = newLinearElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "line", + x, + y: y - BAR_HEIGHT - BAR_GAP, + startArrowhead: null, + endArrowhead: null, + strokeStyle: "dotted", + width: chartWidth, + opacity: GRID_OPACITY, + points: [ + [0, 0], + [chartWidth, 0], + ], + }); + + return [xLine, yLine, maxLine]; +}; + +// For the maths behind it https://excalidraw.com/#json=6320864370884608,O_5xfD-Agh32tytHpRJx1g +const chartBaseElements = ( + spreadsheet: Spreadsheet, + x: number, + y: number, + groupId: string, + backgroundColor: string, + debug?: boolean, +): ChartElements => { + const { chartWidth, chartHeight } = getChartDimentions(spreadsheet); const title = spreadsheet.title ? newTextElement({ + backgroundColor, + groupIds: [groupId], ...commonProps, text: spreadsheet.title, x: x + chartWidth / 2, - y: y - BAR_HEIGHT - BAR_GAP * 2 - maxYLabel.height, + y: y - BAR_HEIGHT - BAR_GAP * 2 - DEFAULT_FONT_SIZE, strokeSharpness: "sharp", strokeStyle: "solid", textAlign: "center", }) : null; - trackEvent(EVENT_MAGIC, "chart", "bars", bars.length); + const debugRect = debug + ? newElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "rectangle", + x, + y: y - chartHeight, + width: chartWidth, + height: chartHeight, + strokeColor: colors.elementStroke[0], + fillStyle: "solid", + opacity: 6, + }) + : null; + return [ - title, - ...bars, - ...xLabels, - xAxisLine, - yAxisLine, - maxValueLine, - minYLabel, - maxYLabel, - ].filter((element) => element !== null) as ExcalidrawElement[]; + ...(debugRect ? [debugRect] : []), + ...(title ? [title] : []), + ...chartXLabels(spreadsheet, x, y, groupId, backgroundColor), + ...chartYLabels(spreadsheet, x, y, groupId, backgroundColor), + ...chartLines(spreadsheet, x, y, groupId, backgroundColor), + ]; +}; + +const chartTypeBar = ( + spreadsheet: Spreadsheet, + x: number, + y: number, +): ChartElements => { + const max = Math.max(...spreadsheet.values); + const groupId = randomId(); + const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)]; + + const bars = spreadsheet.values.map((value, index) => { + const barHeight = (value / max) * BAR_HEIGHT; + return newElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "rectangle", + x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP, + y: y - barHeight - BAR_GAP, + width: BAR_WIDTH, + height: barHeight, + }); + }); + + return [ + ...bars, + ...chartBaseElements( + spreadsheet, + x, + y, + groupId, + backgroundColor, + process.env.NODE_ENV === ENV.DEVELOPMENT, + ), + ]; +}; + +const chartTypeLine = ( + spreadsheet: Spreadsheet, + x: number, + y: number, +): ChartElements => { + const max = Math.max(...spreadsheet.values); + const groupId = randomId(); + const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)]; + + let index = 0; + const points = []; + for (const value of spreadsheet.values) { + const cx = index * (BAR_WIDTH + BAR_GAP); + const cy = -(value / max) * BAR_HEIGHT; + points.push([cx, cy]); + index++; + } + + const maxX = Math.max(...points.map((element) => element[0])); + const maxY = Math.max(...points.map((element) => element[1])); + const minX = Math.min(...points.map((element) => element[0])); + const minY = Math.min(...points.map((element) => element[1])); + + const line = newLinearElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "line", + x: x + BAR_GAP + BAR_WIDTH / 2, + y: y - BAR_GAP, + startArrowhead: null, + endArrowhead: null, + height: maxY - minY, + width: maxX - minX, + strokeWidth: 2, + points: points as any, + }); + + const dots = spreadsheet.values.map((value, index) => { + const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2; + const cy = -(value / max) * BAR_HEIGHT + BAR_GAP / 2; + return newElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + fillStyle: "solid", + strokeWidth: 2, + type: "ellipse", + x: x + cx + BAR_WIDTH / 2, + y: y + cy - BAR_GAP * 2, + width: BAR_GAP, + height: BAR_GAP, + }); + }); + + const lines = spreadsheet.values.map((value, index) => { + const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2; + const cy = (value / max) * BAR_HEIGHT + BAR_GAP / 2 + BAR_GAP; + return newLinearElement({ + backgroundColor, + groupIds: [groupId], + ...commonProps, + type: "line", + x: x + cx + BAR_WIDTH / 2 + BAR_GAP / 2, + y: y - cy, + startArrowhead: null, + endArrowhead: null, + height: cy, + strokeStyle: "dotted", + opacity: GRID_OPACITY, + points: [ + [0, 0], + [0, cy], + ], + }); + }); + + return [ + ...chartBaseElements( + spreadsheet, + x, + y, + groupId, + backgroundColor, + process.env.NODE_ENV === ENV.DEVELOPMENT, + ), + line, + ...lines, + ...dots, + ]; +}; + +export const renderSpreadsheet = ( + chartType: string, + spreadsheet: Spreadsheet, + x: number, + y: number, +): ChartElements => { + trackEvent(EVENT_MAGIC, "chart", chartType, spreadsheet.values.length); + if (chartType === "line") { + return chartTypeLine(spreadsheet, x, y); + } + return chartTypeBar(spreadsheet, x, y); }; diff --git a/src/components/App.tsx b/src/components/App.tsx index 5599b9515..e60c27bf1 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1,181 +1,167 @@ +import { Point, simplify } from "points-on-curve"; import React from "react"; - -import rough from "roughjs/bin/rough"; import { RoughCanvas } from "roughjs/bin/canvas"; -import { simplify, Point } from "points-on-curve"; - -import { - newElement, - newTextElement, - duplicateElement, - isInvisiblySmallElement, - isTextElement, - textWysiwyg, - getCommonBounds, - getCursorForResizingElement, - getPerfectElementSize, - getNormalizedDimensions, - newLinearElement, - transformElements, - getElementWithTransformHandleType, - getResizeOffsetXY, - getResizeArrowDirection, - getTransformHandleTypeFromCoords, - isNonDeletedElement, - updateTextElement, - dragSelectedElements, - getDragOffsetXY, - dragNewElement, - hitTest, - isHittingElementBoundingBoxWithoutHittingElement, - getNonDeletedElements, -} from "../element"; -import { - getElementsWithinSelection, - isOverScrollBars, - getElementsAtPosition, - getElementContainingPosition, - getNormalizedZoom, - getSelectedElements, - isSomeElementSelected, - calculateScrollCenter, -} from "../scene"; -import { loadFromBlob, exportCanvas } from "../data"; - -import { renderScene } from "../renderer"; -import { - AppState, - GestureEvent, - Gesture, - ExcalidrawProps, - SceneData, -} from "../types"; -import { - ExcalidrawElement, - ExcalidrawTextElement, - NonDeleted, - ExcalidrawGenericElement, - ExcalidrawLinearElement, - ExcalidrawBindableElement, -} from "../element/types"; - -import { distance2d, isPathALoop, getGridPoint } from "../math"; - -import { - isWritableElement, - isInputLike, - isToolIcon, - debounce, - distance, - resetCursor, - viewportCoordsToSceneCoords, - sceneCoordsToViewportCoords, - setCursorForShape, - tupleToCoors, - ResolvablePromise, - resolvablePromise, - withBatchedUpdates, -} from "../utils"; -import { - KEYS, - isArrowKey, - getResizeCenterPointKey, - getResizeWithSidesSameLengthKey, - getRotateWithDiscreteAngleKey, - CODES, -} from "../keys"; - -import { findShapeByKey } from "../shapes"; -import { createHistory, SceneHistory } from "../history"; - -import ContextMenu from "./ContextMenu"; - -import { ActionManager } from "../actions/manager"; +import rough from "roughjs/bin/rough"; import "../actions"; +import { actionDeleteSelected, actionFinalize } from "../actions"; +import { createRedoAction, createUndoAction } from "../actions/actionHistory"; +import { ActionManager } from "../actions/manager"; import { actions } from "../actions/register"; - import { ActionResult } from "../actions/types"; -import { getDefaultAppState } from "../appState"; -import { t, getLanguage } from "../i18n"; - -import { - copyToClipboard, - parseClipboard, - probablySupportsClipboardBlob, - probablySupportsClipboardWriteText, -} from "../clipboard"; -import { normalizeScroll } from "../scene"; -import { getCenter, getDistance } from "../gesture"; -import { createUndoAction, createRedoAction } from "../actions/actionHistory"; - -import { - CURSOR_TYPE, - ELEMENT_SHIFT_TRANSLATE_AMOUNT, - ELEMENT_TRANSLATE_AMOUNT, - POINTER_BUTTON, - DRAGGING_THRESHOLD, - TEXT_TO_CENTER_SNAP_THRESHOLD, - LINE_CONFIRM_THRESHOLD, - EVENT, - ENV, - CANVAS_ONLY_ACTIONS, - DEFAULT_VERTICAL_ALIGN, - GRID_SIZE, - MIME_TYPES, - TAP_TWICE_TIMEOUT, - TOUCH_CTX_MENU_TIMEOUT, - APP_NAME, -} from "../constants"; - -import LayerUI from "./LayerUI"; -import { ScrollBars, SceneState } from "../scene/types"; -import { mutateElement } from "../element/mutateElement"; -import { invalidateShapeForElement } from "../renderer/renderElement"; -import { - isLinearElement, - isLinearElementType, - isBindingElement, - isBindingElementType, -} from "../element/typeChecks"; -import { actionFinalize, actionDeleteSelected } from "../actions"; - -import { LinearElementEditor } from "../element/linearElementEditor"; -import { - getSelectedGroupIds, - isSelectedViaGroup, - selectGroupsForSelectedElements, - isElementInGroup, - getSelectedGroupIdForElement, - getElementsInGroup, - editGroupForSelectedElement, -} from "../groups"; -import { Library } from "../data/library"; -import Scene from "../scene/Scene"; -import { - getHoveredElementForBinding, - maybeBindLinearElement, - getEligibleElementsForBinding, - bindOrUnbindSelectedElements, - unbindLinearElements, - fixBindingsAfterDuplication, - fixBindingsAfterDeletion, - isLinearElementSimpleAndAlreadyBound, - isBindingEnabled, - updateBoundElements, - shouldEnableBindingForPointerEvent, -} from "../element/binding"; -import { MaybeTransformHandleType } from "../element/transformHandles"; -import { deepCopyElement } from "../element/newElement"; -import { renderSpreadsheet } from "../charts"; -import { isValidLibrary } from "../data/json"; -import { getNewZoom } from "../scene/zoom"; -import { restore } from "../data/restore"; import { EVENT_DIALOG, EVENT_LIBRARY, EVENT_SHAPE, trackEvent, } from "../analytics"; +import { getDefaultAppState } from "../appState"; +import { + copyToClipboard, + parseClipboard, + probablySupportsClipboardBlob, + probablySupportsClipboardWriteText, +} from "../clipboard"; +import { + APP_NAME, + CANVAS_ONLY_ACTIONS, + CURSOR_TYPE, + DEFAULT_VERTICAL_ALIGN, + DRAGGING_THRESHOLD, + ELEMENT_SHIFT_TRANSLATE_AMOUNT, + ELEMENT_TRANSLATE_AMOUNT, + ENV, + EVENT, + GRID_SIZE, + LINE_CONFIRM_THRESHOLD, + MIME_TYPES, + POINTER_BUTTON, + TAP_TWICE_TIMEOUT, + TEXT_TO_CENTER_SNAP_THRESHOLD, + TOUCH_CTX_MENU_TIMEOUT, +} from "../constants"; +import { exportCanvas, loadFromBlob } from "../data"; +import { isValidLibrary } from "../data/json"; +import { Library } from "../data/library"; +import { restore } from "../data/restore"; +import { + dragNewElement, + dragSelectedElements, + duplicateElement, + getCommonBounds, + getCursorForResizingElement, + getDragOffsetXY, + getElementWithTransformHandleType, + getNonDeletedElements, + getNormalizedDimensions, + getPerfectElementSize, + getResizeArrowDirection, + getResizeOffsetXY, + getTransformHandleTypeFromCoords, + hitTest, + isHittingElementBoundingBoxWithoutHittingElement, + isInvisiblySmallElement, + isNonDeletedElement, + isTextElement, + newElement, + newLinearElement, + newTextElement, + textWysiwyg, + transformElements, + updateTextElement, +} from "../element"; +import { + bindOrUnbindSelectedElements, + fixBindingsAfterDeletion, + fixBindingsAfterDuplication, + getEligibleElementsForBinding, + getHoveredElementForBinding, + isBindingEnabled, + isLinearElementSimpleAndAlreadyBound, + maybeBindLinearElement, + shouldEnableBindingForPointerEvent, + unbindLinearElements, + updateBoundElements, +} from "../element/binding"; +import { LinearElementEditor } from "../element/linearElementEditor"; +import { mutateElement } from "../element/mutateElement"; +import { deepCopyElement } from "../element/newElement"; +import { MaybeTransformHandleType } from "../element/transformHandles"; +import { + isBindingElement, + isBindingElementType, + isLinearElement, + isLinearElementType, +} from "../element/typeChecks"; +import { + ExcalidrawBindableElement, + ExcalidrawElement, + ExcalidrawGenericElement, + ExcalidrawLinearElement, + ExcalidrawTextElement, + NonDeleted, +} from "../element/types"; +import { getCenter, getDistance } from "../gesture"; +import { + editGroupForSelectedElement, + getElementsInGroup, + getSelectedGroupIdForElement, + getSelectedGroupIds, + isElementInGroup, + isSelectedViaGroup, + selectGroupsForSelectedElements, +} from "../groups"; +import { createHistory, SceneHistory } from "../history"; +import { getLanguage, t } from "../i18n"; +import { + CODES, + getResizeCenterPointKey, + getResizeWithSidesSameLengthKey, + getRotateWithDiscreteAngleKey, + isArrowKey, + KEYS, +} from "../keys"; +import { distance2d, getGridPoint, isPathALoop } from "../math"; +import { renderScene } from "../renderer"; +import { invalidateShapeForElement } from "../renderer/renderElement"; +import { + calculateScrollCenter, + getElementContainingPosition, + getElementsAtPosition, + getElementsWithinSelection, + getNormalizedZoom, + getSelectedElements, + isOverScrollBars, + isSomeElementSelected, + normalizeScroll, +} from "../scene"; +import Scene from "../scene/Scene"; +import { SceneState, ScrollBars } from "../scene/types"; +import { getNewZoom } from "../scene/zoom"; +import { findShapeByKey } from "../shapes"; +import { + AppState, + ExcalidrawProps, + Gesture, + GestureEvent, + SceneData, +} from "../types"; +import { + debounce, + distance, + isInputLike, + isToolIcon, + isWritableElement, + resetCursor, + ResolvablePromise, + resolvablePromise, + sceneCoordsToViewportCoords, + setCursorForShape, + tupleToCoors, + viewportCoordsToSceneCoords, + withBatchedUpdates, +} from "../utils"; +import ContextMenu from "./ContextMenu"; +import LayerUI from "./LayerUI"; import { Stats } from "./Stats"; const { history } = createHistory(); @@ -374,7 +360,7 @@ class App extends React.Component { elements={this.scene.getElements()} onCollabButtonClick={onCollabButtonClick} onLockToggle={this.toggleLock} - onInsertShape={(elements) => + onInsertElements={(elements) => this.addElementsFromPasteOrLibrary( elements, DEFAULT_PASTE_X, @@ -1004,9 +990,12 @@ class App extends React.Component { if (data.errorMessage) { this.setState({ errorMessage: data.errorMessage }); } else if (data.spreadsheet) { - this.addElementsFromPasteOrLibrary( - renderSpreadsheet(data.spreadsheet, cursorX, cursorY), - ); + this.setState({ + pasteDialog: { + data: data.spreadsheet, + shown: true, + }, + }); } else if (data.elements) { this.addElementsFromPasteOrLibrary(data.elements); } else if (data.text) { diff --git a/src/components/Dialog.tsx b/src/components/Dialog.tsx index f1b83b4ea..90c3d030d 100644 --- a/src/components/Dialog.tsx +++ b/src/components/Dialog.tsx @@ -1,13 +1,12 @@ -import React, { useCallback, useEffect, useState } from "react"; import clsx from "clsx"; -import { Modal } from "./Modal"; -import { Island } from "./Island"; +import React, { useCallback, useEffect, useState } from "react"; import { t } from "../i18n"; import useIsMobile from "../is-mobile"; -import { back, close } from "./icons"; import { KEYS } from "../keys"; - import "./Dialog.scss"; +import { back, close } from "./icons"; +import { Island } from "./Island"; +import { Modal } from "./Modal"; const useRefState = () => { const [refValue, setRefValue] = useState(null); @@ -23,6 +22,7 @@ export const Dialog = (props: { maxWidth?: number; onCloseRequest(): void; title: React.ReactNode; + autofocus?: boolean; }) => { const [islandNode, setIslandNode] = useRefState(); @@ -33,7 +33,7 @@ export const Dialog = (props: { const focusableElements = queryFocusableElements(islandNode); - if (focusableElements.length > 0) { + if (focusableElements.length > 0 && props.autofocus !== false) { // If there's an element other than close, focus it. (focusableElements[1] || focusableElements[0]).focus(); } @@ -62,7 +62,7 @@ export const Dialog = (props: { islandNode.addEventListener("keydown", handleKeyDown); return () => islandNode.removeEventListener("keydown", handleKeyDown); - }, [islandNode]); + }, [islandNode, props.autofocus]); const queryFocusableElements = (node: HTMLElement) => { const focusableElements = node.querySelectorAll( diff --git a/src/components/LayerUI.tsx b/src/components/LayerUI.tsx index 767b3e8ff..ec3b17e91 100644 --- a/src/components/LayerUI.tsx +++ b/src/components/LayerUI.tsx @@ -51,6 +51,7 @@ import { EVENT_LIBRARY, trackEvent, } from "../analytics"; +import { PasteChartDialog } from "./PasteChartDialog"; interface LayerUIProps { actionManager: ActionManager; @@ -60,7 +61,7 @@ interface LayerUIProps { elements: readonly NonDeletedExcalidrawElement[]; onCollabButtonClick?: () => void; onLockToggle: () => void; - onInsertShape: (elements: LibraryItem) => void; + onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void; zenModeEnabled: boolean; toggleZenMode: () => void; lng: string; @@ -318,7 +319,7 @@ const LayerUI = ({ elements, onCollabButtonClick, onLockToggle, - onInsertShape, + onInsertElements, zenModeEnabled, toggleZenMode, isCollaborating, @@ -456,7 +457,7 @@ const LayerUI = ({ @@ -592,21 +593,8 @@ const LayerUI = ({ ); - return isMobile ? ( - - ) : ( -
+ const dialogs = ( + <> {appState.isLoading && } {appState.errorMessage && ( setAppState({ showShortcutsDialog: false })} /> )} + {appState.pasteDialog.shown && ( + + setAppState({ + pasteDialog: { shown: false, data: null }, + }) + } + /> + )} + + ); + + return isMobile ? ( + <> + {dialogs} + + + ) : ( +
+ {dialogs} {renderFixedSideContainer()} {renderBottomAppMenu()} { diff --git a/src/components/LibraryUnit.tsx b/src/components/LibraryUnit.tsx index 397eecfe5..c4dd280a2 100644 --- a/src/components/LibraryUnit.tsx +++ b/src/components/LibraryUnit.tsx @@ -1,13 +1,13 @@ -import React, { useRef, useEffect, useState } from "react"; import clsx from "clsx"; -import { exportToSvg } from "../scene/export"; +import oc from "open-color"; +import React, { useEffect, useRef, useState } from "react"; import { close } from "../components/icons"; - -import "./LibraryUnit.scss"; +import { MIME_TYPES } from "../constants"; import { t } from "../i18n"; import useIsMobile from "../is-mobile"; +import { exportToSvg } from "../scene/export"; import { LibraryItem } from "../types"; -import { MIME_TYPES } from "../constants"; +import "./LibraryUnit.scss"; // fa-plus const PLUS_ICON = ( @@ -38,7 +38,7 @@ export const LibraryUnit = ({ } const svg = exportToSvg(elementsToRender, { exportBackground: false, - viewBackgroundColor: "#fff", + viewBackgroundColor: oc.white, shouldAddWatermark: false, }); for (const child of ref.current!.children) { diff --git a/src/components/MobileMenu.tsx b/src/components/MobileMenu.tsx index bf6b2093d..bf5425ffb 100644 --- a/src/components/MobileMenu.tsx +++ b/src/components/MobileMenu.tsx @@ -15,7 +15,6 @@ import { Section } from "./Section"; import CollabButton from "./CollabButton"; import { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from "../scene/scrollbars"; import { LockIcon } from "./LockIcon"; -import { LoadingMessage } from "./LoadingMessage"; import { UserList } from "./UserList"; import { BackgroundPickerAndDarkModeToggle } from "./BackgroundPickerAndDarkModeToggle"; import { EVENT_ACTION, trackEvent } from "../analytics"; @@ -46,7 +45,6 @@ export const MobileMenu = ({ isCollaborating, }: MobileMenuProps) => ( <> - {appState.isLoading && }
{(heading) => ( diff --git a/src/components/PasteChartDialog.scss b/src/components/PasteChartDialog.scss new file mode 100644 index 000000000..6d28f8a32 --- /dev/null +++ b/src/components/PasteChartDialog.scss @@ -0,0 +1,46 @@ +@import "../css/_variables"; + +.excalidraw { + .PasteChartDialog { + @media #{$media-query} { + .Island { + display: flex; + flex-direction: column; + } + } + .container { + display: flex; + align-items: center; + justify-content: space-around; + flex-wrap: wrap; + @media #{$media-query} { + flex-direction: column; + justify-content: center; + } + } + .ChartPreview { + margin: 8px; + text-align: center; + width: 192px; + height: 128px; + border-radius: 2px; + padding: 1px; + border: 1px solid $oc-gray-4; + display: flex; + align-items: center; + justify-content: center; + background: transparent; + div { + display: inline-block; + } + svg { + max-height: 120px; + max-width: 186px; + } + &:hover { + padding: 0; + border: 2px solid $oc-blue-5; + } + } + } +} diff --git a/src/components/PasteChartDialog.tsx b/src/components/PasteChartDialog.tsx new file mode 100644 index 000000000..5b82e4d41 --- /dev/null +++ b/src/components/PasteChartDialog.tsx @@ -0,0 +1,121 @@ +import oc from "open-color"; +import React, { useLayoutEffect, useRef, useState } from "react"; +import { ChartElements, renderSpreadsheet, Spreadsheet } from "../charts"; +import { ChartType } from "../element/types"; +import { exportToSvg } from "../scene/export"; +import { AppState, LibraryItem } from "../types"; +import { Dialog } from "./Dialog"; +import "./PasteChartDialog.scss"; + +type OnInsertChart = (chartType: ChartType, elements: ChartElements) => void; + +const ChartPreviewBtn = (props: { + spreadsheet: Spreadsheet | null; + chartType: ChartType; + selected: boolean; + onClick: OnInsertChart; +}) => { + const previewRef = useRef(null); + const [chartElements, setChartElements] = useState( + null, + ); + + useLayoutEffect(() => { + if (!props.spreadsheet) { + return; + } + + const elements = renderSpreadsheet( + props.chartType, + props.spreadsheet, + 0, + 0, + ); + setChartElements(elements); + + const svg = exportToSvg(elements, { + exportBackground: false, + viewBackgroundColor: oc.white, + shouldAddWatermark: false, + }); + + const previewNode = previewRef.current!; + + previewNode.appendChild(svg); + + if (props.selected) { + (previewNode.parentNode as HTMLDivElement).focus(); + } + + return () => { + previewNode.removeChild(svg); + }; + }, [props.spreadsheet, props.chartType, props.selected]); + + return ( + + ); +}; + +export const PasteChartDialog = ({ + setAppState, + appState, + onClose, + onInsertChart, +}: { + appState: AppState; + onClose: () => void; + setAppState: React.Component["setState"]; + onInsertChart: (elements: LibraryItem) => void; +}) => { + const handleClose = React.useCallback(() => { + if (onClose) { + onClose(); + } + }, [onClose]); + + const handleChartClick = (chartType: ChartType, elements: ChartElements) => { + onInsertChart(elements); + setAppState({ + currentChartType: chartType, + pasteDialog: { + shown: false, + data: null, + }, + }); + }; + + return ( + +
+ + +
+
+ ); +}; diff --git a/src/components/Stats.tsx b/src/components/Stats.tsx index c8acdd07d..3780691ec 100644 --- a/src/components/Stats.tsx +++ b/src/components/Stats.tsx @@ -85,7 +85,6 @@ export const Stats = (props: { {t("stats.total")} {nFormatter(storageSizes.total, 1)} - {selectedElements.length === 1 && ( {t("stats.element")} diff --git a/src/element/types.ts b/src/element/types.ts index 2980263bf..8a7b26ecc 100644 --- a/src/element/types.ts +++ b/src/element/types.ts @@ -1,6 +1,7 @@ import { Point } from "../types"; import { FONT_FAMILY } from "../constants"; +export type ChartType = "bar" | "line"; export type FillStyle = "hachure" | "cross-hatch" | "solid"; export type FontFamily = keyof typeof FONT_FAMILY; export type FontString = string & { _brand: "fontString" }; diff --git a/src/locales/en.json b/src/locales/en.json index 6f16fc986..497113149 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -90,7 +90,9 @@ "centerVertically": "Center vertically", "centerHorizontally": "Center horizontally", "distributeHorizontally": "Distribute horizontally", - "distributeVertically": "Distribute vertically" + "distributeVertically": "Distribute vertically", + "chartTypeBar": "Bar", + "chartTypeLine": "Line" }, "buttons": { "clearReset": "Reset the canvas", @@ -222,6 +224,8 @@ }, "stats": { "angle": "Angle", + "charts": "Charts", + "current": "Current", "element": "Element", "elements": "Elements", "height": "Height", diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap index 0f5db1c95..8513b0e46 100644 --- a/src/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap @@ -4,6 +4,7 @@ exports[`given element A and group of elements B and given both are selected whe Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -42,6 +43,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -457,6 +462,7 @@ exports[`given element A and group of elements B and given both are selected whe Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -495,6 +501,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -916,6 +926,7 @@ exports[`regression tests Cmd/Ctrl-click exclusively select element under pointe Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -954,6 +965,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -1684,6 +1699,7 @@ exports[`regression tests Drags selected element when hitting only bounding box Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -1722,6 +1738,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -1880,6 +1900,7 @@ exports[`regression tests adjusts z order when grouping: [end of test] appState Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -1918,6 +1939,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id3": true, @@ -2330,6 +2355,7 @@ exports[`regression tests alt-drag duplicates an element: [end of test] appState Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -2368,6 +2394,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -2575,6 +2605,7 @@ exports[`regression tests arrow keys: [end of test] appState 1`] = ` Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -2613,6 +2644,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -2731,6 +2766,7 @@ exports[`regression tests can drag element that covers another element, while an Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -2769,6 +2805,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id2": true, }, @@ -3200,6 +3240,7 @@ exports[`regression tests change the properties of a shape: [end of test] appSta Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "#fa5252", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -3238,6 +3279,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -3500,6 +3545,7 @@ exports[`regression tests click on an element and drag it: [dragged] appState 1` Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -3538,6 +3584,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -3696,6 +3746,7 @@ exports[`regression tests click on an element and drag it: [end of test] appStat Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -3734,6 +3785,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -3932,6 +3987,7 @@ exports[`regression tests click to select a shape: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -3970,6 +4026,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id1": true, }, @@ -4176,6 +4236,7 @@ exports[`regression tests click-drag to select a group: [end of test] appState 1 Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -4214,6 +4275,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id2": true, }, @@ -4529,6 +4594,7 @@ exports[`regression tests deselects group of selected elements on pointer down w Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -4589,6 +4655,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -4816,6 +4886,7 @@ exports[`regression tests deselects group of selected elements on pointer up whe Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -4876,6 +4947,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -5115,6 +5190,7 @@ exports[`regression tests deselects selected element on pointer down when pointe Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -5175,6 +5251,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -5315,6 +5395,7 @@ exports[`regression tests deselects selected element, on pointer up, when click Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -5375,6 +5456,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -5493,6 +5578,7 @@ exports[`regression tests double click to edit a group: [end of test] appState 1 Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -5531,6 +5617,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -5938,6 +6028,7 @@ exports[`regression tests drags selected elements from point inside common bound Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -5976,6 +6067,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -6248,6 +6343,7 @@ exports[`regression tests draw every type of shape: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -6286,6 +6382,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -8274,6 +8374,7 @@ exports[`regression tests given a group of selected elements with an element tha Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -8312,6 +8413,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id2": true, @@ -8628,6 +8733,7 @@ exports[`regression tests given a selected element A and a not selected element Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "#fa5252", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -8666,6 +8772,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id2": true, @@ -8875,6 +8985,7 @@ exports[`regression tests given selected element A with lower z-index than unsel Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "#fa5252", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -8913,6 +9024,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id2": true, @@ -9120,6 +9235,7 @@ exports[`regression tests given selected element A with lower z-index than unsel Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "#fa5252", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -9158,6 +9274,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id2": true, @@ -9427,6 +9547,7 @@ exports[`regression tests key 2 selects rectangle tool: [end of test] appState 1 Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -9465,6 +9586,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -9583,6 +9708,7 @@ exports[`regression tests key 3 selects diamond tool: [end of test] appState 1`] Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -9621,6 +9747,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -9739,6 +9869,7 @@ exports[`regression tests key 4 selects ellipse tool: [end of test] appState 1`] Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -9777,6 +9908,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -9895,6 +10030,7 @@ exports[`regression tests key 5 selects arrow tool: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -9933,6 +10069,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -10081,6 +10221,7 @@ exports[`regression tests key 6 selects line tool: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -10119,6 +10260,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -10267,6 +10412,7 @@ exports[`regression tests key 7 selects draw tool: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -10305,6 +10451,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -10453,6 +10603,7 @@ exports[`regression tests key a selects arrow tool: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -10491,6 +10642,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -10639,6 +10794,7 @@ exports[`regression tests key d selects diamond tool: [end of test] appState 1`] Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -10677,6 +10833,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -10795,6 +10955,7 @@ exports[`regression tests key e selects ellipse tool: [end of test] appState 1`] Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -10833,6 +10994,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -10951,6 +11116,7 @@ exports[`regression tests key l selects line tool: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -10989,6 +11155,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -11137,6 +11307,7 @@ exports[`regression tests key r selects rectangle tool: [end of test] appState 1 Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -11175,6 +11346,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -11293,6 +11468,7 @@ exports[`regression tests key x selects draw tool: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -11331,6 +11507,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -11479,6 +11659,7 @@ exports[`regression tests make a group and duplicate it: [end of test] appState Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -11517,6 +11698,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -12187,6 +12372,7 @@ exports[`regression tests noop interaction after undo shouldn't create history e Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -12225,6 +12411,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id3": true, @@ -12432,6 +12622,7 @@ exports[`regression tests pinch-to-zoom works: [end of test] appState 1`] = ` Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -12470,6 +12661,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": -6, @@ -12526,6 +12721,7 @@ exports[`regression tests rerenders UI on language change: [end of test] appStat Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -12564,6 +12760,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -12618,6 +12818,7 @@ exports[`regression tests selecting 'Add to library' in context menu adds elemen Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -12656,6 +12857,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -12774,6 +12979,7 @@ exports[`regression tests selecting 'Bring forward' in context menu brings eleme Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -12812,6 +13018,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -13074,6 +13284,7 @@ exports[`regression tests selecting 'Bring to front' in context menu brings elem Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -13112,6 +13323,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -13374,6 +13589,7 @@ exports[`regression tests selecting 'Copy styles' in context menu copies styles: Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -13412,6 +13628,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -13530,6 +13750,7 @@ exports[`regression tests selecting 'Delete' in context menu deletes element: [e Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -13568,6 +13789,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -13718,6 +13943,7 @@ exports[`regression tests selecting 'Duplicate' in context menu duplicates eleme Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -13756,6 +13982,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -13959,6 +14189,7 @@ exports[`regression tests selecting 'Group selection' in context menu groups sel Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -13997,6 +14228,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id1": true, }, @@ -14275,6 +14510,7 @@ exports[`regression tests selecting 'Paste styles' in context menu pastes styles Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "#e64980", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "cross-hatch", @@ -14313,6 +14549,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -15106,6 +15346,7 @@ exports[`regression tests selecting 'Send backward' in context menu sends elemen Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -15144,6 +15385,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -15406,6 +15651,7 @@ exports[`regression tests selecting 'Send to back' in context menu sends element Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -15444,6 +15690,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -15706,6 +15956,7 @@ exports[`regression tests selecting 'Ungroup selection' in context menu ungroups Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -15744,6 +15995,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id1": true, }, @@ -16077,6 +16332,7 @@ exports[`regression tests shift click on selected element should deselect it on Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -16115,6 +16371,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -16236,6 +16496,7 @@ exports[`regression tests shift-click to multiselect, then drag: [end of test] a Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -16274,6 +16535,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -16549,6 +16814,7 @@ exports[`regression tests should show fill icons when element has non transparen Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "#fa5252", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -16587,6 +16853,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -16780,6 +17050,7 @@ exports[`regression tests shows 'Group selection' in context menu for multiple s Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -16818,6 +17089,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id2": true, @@ -17027,6 +17302,7 @@ exports[`regression tests shows 'Ungroup selection' in context menu for group in Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -17065,6 +17341,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id2": true, @@ -17346,6 +17626,7 @@ exports[`regression tests shows context menu for canvas: [end of test] appState Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -17384,6 +17665,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -17438,6 +17723,7 @@ exports[`regression tests shows context menu for element: [end of test] appState Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -17476,6 +17762,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -17594,6 +17884,7 @@ exports[`regression tests single-clicking on a subgroup of a selected group shou Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -17632,6 +17923,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, "id1": true, @@ -18407,6 +18702,7 @@ exports[`regression tests spacebar + drag scrolls the canvas: [end of test] appS Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -18445,6 +18741,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 60, @@ -18499,6 +18799,7 @@ exports[`regression tests supports nested groups: [end of test] appState 1`] = ` Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -18537,6 +18838,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id0": true, }, @@ -19223,6 +19528,7 @@ exports[`regression tests switches from group of selected elements to another el Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -19283,6 +19589,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id1": true, "id2": true, @@ -19620,6 +19930,7 @@ exports[`regression tests switches selected element on pointer down: [end of tes Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -19680,6 +19991,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object { "id1": true, }, @@ -19907,6 +20222,7 @@ exports[`regression tests two-finger scroll works: [end of test] appState 1`] = Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -19945,6 +20261,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 11, @@ -20001,6 +20321,7 @@ exports[`regression tests undo/redo drawing an element: [end of test] appState 1 Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -20039,6 +20360,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -20491,6 +20816,7 @@ exports[`regression tests updates fontSize & fontFamily appState: [end of test] Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -20529,6 +20855,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, @@ -20583,6 +20913,7 @@ exports[`regression tests zoom hotkeys: [end of test] appState 1`] = ` Object { "appearance": "light", "collaborators": Map {}, + "currentChartType": "bar", "currentItemBackgroundColor": "transparent", "currentItemEndArrowhead": "arrow", "currentItemFillStyle": "hachure", @@ -20621,6 +20952,10 @@ Object { "offsetLeft": 0, "offsetTop": 0, "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, "previousSelectedElementIds": Object {}, "resizingElement": null, "scrollX": 0, diff --git a/src/types.ts b/src/types.ts index 6161bf883..5d4485bc1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,6 +9,7 @@ import { GroupId, ExcalidrawBindableElement, Arrowhead, + ChartType, } from "./element/types"; import { SHAPES } from "./shapes"; import { Point as RoughPoint } from "roughjs/bin/geometry"; @@ -17,6 +18,7 @@ import { SuggestedBinding } from "./element/binding"; import { ImportedDataState } from "./data/types"; import { ExcalidrawImperativeAPI } from "./components/App"; import type { ResolvablePromise } from "./utils"; +import { Spreadsheet } from "./charts"; export type FlooredNumber = number & { _brand: "FlooredNumber" }; export type Point = Readonly; @@ -97,6 +99,16 @@ export type AppState = { fileHandle: import("browser-nativefs").FileSystemHandle | null; collaborators: Map; showStats: boolean; + currentChartType: ChartType; + pasteDialog: + | { + shown: false; + data: null; + } + | { + shown: true; + data: Spreadsheet; + }; }; export type NormalizedZoomValue = number & { _brand: "normalizedZoom" }; From 6f82a88b797dfafec4468b24bba12814e74075aa Mon Sep 17 00:00:00 2001 From: Lipis Date: Sun, 27 Dec 2020 18:51:47 +0200 Subject: [PATCH 08/45] chore: Cleanup unused labels (#2682) --- src/charts.ts | 5 ----- src/components/PasteChartDialog.tsx | 3 ++- src/locales/en.json | 7 ++----- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/charts.ts b/src/charts.ts index 81d27f319..48e21d46f 100644 --- a/src/charts.ts +++ b/src/charts.ts @@ -12,11 +12,6 @@ const BAR_GAP = 12; const BAR_HEIGHT = 256; const GRID_OPACITY = 50; -export const CHART_LABELS = { - bar: "labels.chartTypeBar", - line: "labels.chartTypeLine", -}; - export interface Spreadsheet { title: string | null; labels: string[] | null; diff --git a/src/components/PasteChartDialog.tsx b/src/components/PasteChartDialog.tsx index 5b82e4d41..3c1aeadef 100644 --- a/src/components/PasteChartDialog.tsx +++ b/src/components/PasteChartDialog.tsx @@ -2,6 +2,7 @@ import oc from "open-color"; import React, { useLayoutEffect, useRef, useState } from "react"; import { ChartElements, renderSpreadsheet, Spreadsheet } from "../charts"; import { ChartType } from "../element/types"; +import { t } from "../i18n"; import { exportToSvg } from "../scene/export"; import { AppState, LibraryItem } from "../types"; import { Dialog } from "./Dialog"; @@ -98,7 +99,7 @@ export const PasteChartDialog = ({ diff --git a/src/locales/en.json b/src/locales/en.json index 497113149..b48b10565 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,6 +1,7 @@ { "labels": { "paste": "Paste", + "pasteCharts": "Paste charts", "selectAll": "Select all", "multiSelect": "Add element to selection", "moveCanvas": "Move canvas", @@ -90,9 +91,7 @@ "centerVertically": "Center vertically", "centerHorizontally": "Center horizontally", "distributeHorizontally": "Distribute horizontally", - "distributeVertically": "Distribute vertically", - "chartTypeBar": "Bar", - "chartTypeLine": "Line" + "distributeVertically": "Distribute vertically" }, "buttons": { "clearReset": "Reset the canvas", @@ -224,8 +223,6 @@ }, "stats": { "angle": "Angle", - "charts": "Charts", - "current": "Current", "element": "Element", "elements": "Elements", "height": "Height", From b8d13c98b536e0d35c5b910e05bcf7bd9f96326c Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 27 Dec 2020 16:27:25 -0500 Subject: [PATCH 09/45] refactor: Media queries (#2680) --- src/components/ColorPicker.scss | 2 +- src/components/ContextMenu.scss | 2 +- src/components/Dialog.scss | 2 +- src/components/ExportDialog.scss | 4 +--- src/components/HintViewer.scss | 10 +++++----- src/components/IconPicker.scss | 2 +- src/components/Modal.scss | 4 ++-- src/components/ToolIcon.scss | 6 +++++- src/css/_variables.scss | 3 ++- src/css/styles.scss | 2 +- src/is-mobile.tsx | 1 + 11 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/components/ColorPicker.scss b/src/components/ColorPicker.scss index 86b0d9328..23a6aac82 100644 --- a/src/components/ColorPicker.scss +++ b/src/components/ColorPicker.scss @@ -218,7 +218,7 @@ left: 2px; } - @media #{$media-query} { + @media #{$is-mobile-query} { display: none; } } diff --git a/src/components/ContextMenu.scss b/src/components/ContextMenu.scss index 089c9013b..fe8059e09 100644 --- a/src/components/ContextMenu.scss +++ b/src/components/ContextMenu.scss @@ -74,7 +74,7 @@ z-index: 1; } - @media #{$media-query} { + @media #{$is-mobile-query} { .context-menu-option { display: block; diff --git a/src/components/Dialog.scss b/src/components/Dialog.scss index 5c94a9069..3ca5d6258 100644 --- a/src/components/Dialog.scss +++ b/src/components/Dialog.scss @@ -18,7 +18,7 @@ margin: 0; } - @media #{$media-query} { + @media #{$is-mobile-query} { .Dialog { --metric: calc(var(--space-factor) * 4); --inset-left: #{"max(var(--metric), var(--sal))"}; diff --git a/src/components/ExportDialog.scss b/src/components/ExportDialog.scss index 9a479d58f..3086d72b1 100644 --- a/src/components/ExportDialog.scss +++ b/src/components/ExportDialog.scss @@ -37,7 +37,7 @@ } } - @media (max-width: 550px) { + @media #{$is-mobile-query} { .ExportDialog { display: flex; flex-direction: column; @@ -51,9 +51,7 @@ .ExportDialog__actions > * { margin-bottom: calc(var(--space-factor) * 3); } - } - @media #{$media-query} { .ExportDialog__preview canvas { max-height: 30vh; } diff --git a/src/components/HintViewer.scss b/src/components/HintViewer.scss index 63db75114..87b502b64 100644 --- a/src/components/HintViewer.scss +++ b/src/components/HintViewer.scss @@ -1,5 +1,8 @@ @import "../css/_variables"; +// this is loosely based on the longest hint text +$wide-viewport-width: 1000px; + .excalidraw { .HintViewer { pointer-events: none; @@ -16,12 +19,9 @@ color: $oc-gray-6; font-size: 0.8rem; - @media (min-width: 1200px) { - white-space: pre; - } - - @media #{$media-query} { + @media #{$is-mobile-query} { position: static; + padding-right: 2em; } > span { diff --git a/src/components/IconPicker.scss b/src/components/IconPicker.scss index 9521e7eda..62c2b5d49 100644 --- a/src/components/IconPicker.scss +++ b/src/components/IconPicker.scss @@ -110,7 +110,7 @@ :root[dir="rtl"] & { left: 2px; } - @media #{$media-query} { + @media #{$is-mobile-query} { display: none; } } diff --git a/src/components/Modal.scss b/src/components/Modal.scss index 10620e1f7..c009b4e49 100644 --- a/src/components/Modal.scss +++ b/src/components/Modal.scss @@ -40,7 +40,7 @@ background: var(--bg-color-island); backdrop-filter: none; - @media #{$media-query} { + @media #{$is-mobile-query} { max-width: 100%; } } @@ -74,7 +74,7 @@ top: calc(var(--space-factor) * 5); } - @media #{$media-query} { + @media #{$is-mobile-query} { .Modal { padding: 0; } diff --git a/src/components/ToolIcon.scss b/src/components/ToolIcon.scss index 3c542aea0..91e8e1bc5 100644 --- a/src/components/ToolIcon.scss +++ b/src/components/ToolIcon.scss @@ -142,6 +142,7 @@ user-select: none; } + // shrink shape icons on small viewports to make them fit @media (max-width: 425px) { .Shape .ToolIcon__icon { width: 2rem; @@ -153,6 +154,8 @@ } } + // move the lock button out of the way on small viewports + // it begins to collide with the GitHub icon before we switch to mobile mode @media (max-width: 760px) { .ToolIcon.ToolIcon__lock { display: inline-block; @@ -162,6 +165,7 @@ margin-left: 0; border-radius: 20px 0 0 20px; + z-index: 1; background-color: var(--button-gray-1); @@ -189,7 +193,7 @@ margin-left: 5px; margin-top: 1px; - @media #{$media-query} { + @media #{$is-mobile-query} { display: none; } } diff --git a/src/css/_variables.scss b/src/css/_variables.scss index 142d1756b..4e4ac861d 100644 --- a/src/css/_variables.scss +++ b/src/css/_variables.scss @@ -1,3 +1,4 @@ @import "open-color/open-color.scss"; -$media-query: "(max-width: 600px), (max-height: 500px) and (max-width: 1000px)"; +// keep up to date with is-mobile.tsx +$is-mobile-query: "(max-width: 600px), (max-height: 500px) and (max-width: 1000px)"; diff --git a/src/css/styles.scss b/src/css/styles.scss index 28edcc7ee..c2fcd527b 100644 --- a/src/css/styles.scss +++ b/src/css/styles.scss @@ -441,7 +441,7 @@ } } - @media #{$media-query} { + @media #{$is-mobile-query} { aside { display: none; } diff --git a/src/is-mobile.tsx b/src/is-mobile.tsx index 9a8d5fe2b..c20bf89de 100644 --- a/src/is-mobile.tsx +++ b/src/is-mobile.tsx @@ -11,6 +11,7 @@ export const IsMobileProvider = ({ if (!query.current) { query.current = window.matchMedia ? window.matchMedia( + // keep up to date with _variables.scss "(max-width: 640px), (max-height: 500px) and (max-width: 1000px)", ) : (({ From 0488b7b5c6328aec96ee75be6d0f788320ff9f23 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 27 Dec 2020 16:42:23 -0500 Subject: [PATCH 10/45] fix(css): Fix compile error (#2685) --- src/components/PasteChartDialog.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/PasteChartDialog.scss b/src/components/PasteChartDialog.scss index 6d28f8a32..9d45fb2df 100644 --- a/src/components/PasteChartDialog.scss +++ b/src/components/PasteChartDialog.scss @@ -2,7 +2,7 @@ .excalidraw { .PasteChartDialog { - @media #{$media-query} { + @media #{$is-mobile-query} { .Island { display: flex; flex-direction: column; @@ -13,7 +13,7 @@ align-items: center; justify-content: space-around; flex-wrap: wrap; - @media #{$media-query} { + @media #{$is-mobile-query} { flex-direction: column; justify-content: center; } From 3b0fb1562d58e6c767ccf2850ac075cd00e9f465 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Sun, 27 Dec 2020 17:07:05 -0500 Subject: [PATCH 11/45] feat: Require use of a preset dialog size; adjust dialog sizing (#2684) --- src/components/Dialog.tsx | 4 ++-- src/components/ErrorDialog.tsx | 2 +- src/components/ExportDialog.tsx | 6 +----- src/components/PasteChartDialog.tsx | 2 +- src/components/ShortcutsDialog.tsx | 6 +----- src/excalidraw-app/collab/RoomDialog.tsx | 6 +----- 6 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/components/Dialog.tsx b/src/components/Dialog.tsx index 90c3d030d..4efbadb82 100644 --- a/src/components/Dialog.tsx +++ b/src/components/Dialog.tsx @@ -19,7 +19,7 @@ const useRefState = () => { export const Dialog = (props: { children: React.ReactNode; className?: string; - maxWidth?: number; + small?: boolean; onCloseRequest(): void; title: React.ReactNode; autofocus?: boolean; @@ -76,7 +76,7 @@ export const Dialog = (props: { diff --git a/src/components/ErrorDialog.tsx b/src/components/ErrorDialog.tsx index f10c71897..fbd8e48cf 100644 --- a/src/components/ErrorDialog.tsx +++ b/src/components/ErrorDialog.tsx @@ -24,7 +24,7 @@ export const ErrorDialog = ({ <> {modalIsShown && ( diff --git a/src/components/ExportDialog.tsx b/src/components/ExportDialog.tsx index 013bbed33..4abae7552 100644 --- a/src/components/ExportDialog.tsx +++ b/src/components/ExportDialog.tsx @@ -262,11 +262,7 @@ export const ExportDialog = ({ ref={triggerButton} /> {modalIsShown && ( - + void }) => { return ( <> - + diff --git a/src/excalidraw-app/collab/RoomDialog.tsx b/src/excalidraw-app/collab/RoomDialog.tsx index afe8ef243..fdf62f1c0 100644 --- a/src/excalidraw-app/collab/RoomDialog.tsx +++ b/src/excalidraw-app/collab/RoomDialog.tsx @@ -123,11 +123,7 @@ const RoomDialog = ({ ); }; return ( - + {renderRoomDialog()} ); From 3aab81bc35305b5adda5d8c731cfb43b0ff202f9 Mon Sep 17 00:00:00 2001 From: David Luzar Date: Sun, 27 Dec 2020 23:17:27 +0100 Subject: [PATCH 12/45] docs: add tsdoc for certain element props (#2673) Co-authored-by: Panayiotis Lipiridis --- src/element/types.ts | 10 ++++++++++ src/packages/excalidraw/CHANGELOG.md | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/element/types.ts b/src/element/types.ts index 8a7b26ecc..baeb001a6 100644 --- a/src/element/types.ts +++ b/src/element/types.ts @@ -27,11 +27,21 @@ type _ExcalidrawElementBase = Readonly<{ width: number; height: number; angle: number; + /** Random integer used to seed shape generation so that the roughjs shape + doesn't differ across renders. */ seed: number; + /** Integer that is sequentially incremented on each change. Used to reconcile + elements during collaboration or when saving to server. */ version: number; + /** Random integer that is regenerated on each change. + Used for deterministic reconciliation of updates during collaboration, + in case the versions (see above) are identical. */ versionNonce: number; isDeleted: boolean; + /** List of groups the element belongs to. + Ordered from deepest to shallowest. */ groupIds: readonly GroupId[]; + /** Ids of (linear) elements that are bound to this element. */ boundElementIds: readonly ExcalidrawLinearElement["id"][] | null; }>; diff --git a/src/packages/excalidraw/CHANGELOG.md b/src/packages/excalidraw/CHANGELOG.md index ab26fdf34..ecc9cc139 100644 --- a/src/packages/excalidraw/CHANGELOG.md +++ b/src/packages/excalidraw/CHANGELOG.md @@ -51,6 +51,10 @@ Please add the latest change on the top under the correct section. - Bump ini from 1.3.5 to 1.3.7 in /src/packages/excalidraw [#2500](https://github.com/excalidraw/excalidraw/pull/2500) +### Docs + +- Document some of the more exotic element props [#2673](https://github.com/excalidraw/excalidraw/pull/2673) + ## 0.1.1 #### Fix From 0cf58adb4cd5afc0a40c85a3adc9934efe004be7 Mon Sep 17 00:00:00 2001 From: David Luzar Date: Mon, 28 Dec 2020 13:14:22 +0100 Subject: [PATCH 13/45] chore: Update portal URL (#2689) --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index ab2e34bd1..0977b9496 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ REACT_APP_BACKEND_V1_GET_URL=https://json.excalidraw.com/api/v1/ REACT_APP_BACKEND_V2_GET_URL=https://json.excalidraw.com/api/v2/ REACT_APP_BACKEND_V2_POST_URL=https://json.excalidraw.com/api/v2/post/ -REACT_APP_SOCKET_SERVER_URL=https://excalidraw-socket.herokuapp.com +REACT_APP_SOCKET_SERVER_URL=https://portal.excalidraw.com REACT_APP_FIREBASE_CONFIG='{"apiKey":"AIzaSyAd15pYlMci_xIp9ko6wkEsDzAAA0Dn0RU","authDomain":"excalidraw-room-persistence.firebaseapp.com","databaseURL":"https://excalidraw-room-persistence.firebaseio.com","projectId":"excalidraw-room-persistence","storageBucket":"excalidraw-room-persistence.appspot.com","messagingSenderId":"654800341332","appId":"1:654800341332:web:4a692de832b55bd57ce0c1"}' From aef3644c93eea3434357dfed4eaf16cdeb4a81c7 Mon Sep 17 00:00:00 2001 From: David Luzar Date: Tue, 29 Dec 2020 21:03:34 +0100 Subject: [PATCH 14/45] fix: scene not initialized properly when tab not focused (#2677) Co-authored-by: Lipis --- src/components/App.tsx | 11 ++++++++++- src/excalidraw-app/index.tsx | 24 +++++++++--------------- src/packages/excalidraw/CHANGELOG.md | 1 + 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index e60c27bf1..ecce0fd2f 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -861,7 +861,16 @@ class App extends React.Component { history.record(this.state, this.scene.getElementsIncludingDeleted()); - this.props.onChange?.(this.scene.getElementsIncludingDeleted(), this.state); + // Do not notify consumers if we're still loading the scene. Among other + // potential issues, this fixes a case where the tab isn't focused during + // init, which would trigger onChange with empty elements, which would then + // override whatever is in localStorage currently. + if (!this.state.isLoading) { + this.props.onChange?.( + this.scene.getElementsIncludingDeleted(), + this.state, + ); + } } // Copy/paste diff --git a/src/excalidraw-app/index.tsx b/src/excalidraw-app/index.tsx index c8b151f47..f8db9fc6a 100644 --- a/src/excalidraw-app/index.tsx +++ b/src/excalidraw-app/index.tsx @@ -93,7 +93,6 @@ type Scene = ImportedDataState & { commitToHistory: boolean }; const initializeScene = async (opts: { resetScene: ExcalidrawImperativeAPI["resetScene"]; initializeSocketClient: CollabAPI["initializeSocketClient"]; - onLateInitialization?: (scene: Scene) => void; }): Promise => { const searchParams = new URLSearchParams(window.location.search); const id = searchParams.get("id"); @@ -124,17 +123,15 @@ const initializeScene = async (opts: { } else { // https://github.com/excalidraw/excalidraw/issues/1919 if (document.hidden) { - window.addEventListener( - "focus", - () => - initializeScene(opts).then((_scene) => { - opts?.onLateInitialization?.(_scene || scene); - }), - { - once: true, - }, - ); - return null; + return new Promise((resolve, reject) => { + window.addEventListener( + "focus", + () => initializeScene(opts).then(resolve).catch(reject), + { + once: true, + }, + ); + }); } isCollabScene = false; @@ -222,9 +219,6 @@ function ExcalidrawWrapper(props: { collab: CollabAPI }) { initializeScene({ resetScene: excalidrawApi.resetScene, initializeSocketClient: collab.initializeSocketClient, - onLateInitialization: (scene) => { - initialStatePromiseRef.current.promise.resolve(scene); - }, }).then((scene) => { initialStatePromiseRef.current.promise.resolve(scene); }); diff --git a/src/packages/excalidraw/CHANGELOG.md b/src/packages/excalidraw/CHANGELOG.md index ecc9cc139..ed69a57ec 100644 --- a/src/packages/excalidraw/CHANGELOG.md +++ b/src/packages/excalidraw/CHANGELOG.md @@ -27,6 +27,7 @@ Please add the latest change on the top under the correct section. ### Fixes +- Fix initialization when browser tab not focused [#2677](https://github.com/excalidraw/excalidraw/pull/2677) - Consistent case for export locale strings [#2622](https://github.com/excalidraw/excalidraw/pull/2622) - Remove unnecessary console.error as it was polluting Sentry [#2637](https://github.com/excalidraw/excalidraw/pull/2637) - Fix scroll-to-center on init for non-zero canvas offsets [#2445](https://github.com/excalidraw/excalidraw/pull/2445) From 7c3513b9df8005a0a8edd4ed72da3a48b9e167bc Mon Sep 17 00:00:00 2001 From: Benja Kugler Date: Sat, 2 Jan 2021 13:13:48 -0300 Subject: [PATCH 15/45] feat: browse libraries styles fixed (#2694) * feat: browse libraries styles fixed * simplify jsx & css * remove justify-content * fix padding/margin * Update src/components/LayerUI.scss Co-authored-by: benjamin.kugler Co-authored-by: dwelle --- src/components/LayerUI.scss | 22 +++++++--- src/components/LayerUI.tsx | 80 +++++++++++++++++-------------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/components/LayerUI.scss b/src/components/LayerUI.scss index e4aa90298..494d3ba22 100644 --- a/src/components/LayerUI.scss +++ b/src/components/LayerUI.scss @@ -7,11 +7,23 @@ align-items: center; justify-content: center; - .browse-libraries { - position: absolute; - right: 12px; - top: 16px; - white-space: nowrap; + .layer-ui__library-header { + display: flex; + align-items: center; + width: 100%; + margin: 2px 0; + + button { + // 2px from the left to account for focus border of left-most button + margin: 0 2px; + } + + a { + margin-left: auto; + // 17px for scrollbar (needed for overlay scrollbars on Big Sur?) + 1px extra + padding-right: 18px; + white-space: nowrap; + } } } diff --git a/src/components/LayerUI.tsx b/src/components/LayerUI.tsx index ec3b17e91..5a806e829 100644 --- a/src/components/LayerUI.tsx +++ b/src/components/LayerUI.tsx @@ -124,9 +124,42 @@ const LibraryMenuItems = ({ let addedPendingElements = false; rows.push( - <> +
+ { + importLibraryFromJSON() + .then(() => { + // Maybe we should close and open the menu so that the items get updated. + // But for now we just close the menu. + setAppState({ isLibraryOpen: false }); + }) + .catch(muteFSAbortError) + .catch((error) => { + setAppState({ errorMessage: error.message }); + }); + }} + /> + { + saveLibraryAsJSON() + .catch(muteFSAbortError) + .catch((error) => { + setAppState({ errorMessage: error.message }); + }); + }} + /> + { @@ -135,48 +168,7 @@ const LibraryMenuItems = ({ > {t("labels.libraries")} - - - { - importLibraryFromJSON() - .then(() => { - // Maybe we should close and open the menu so that the items get updated. - // But for now we just close the menu. - setAppState({ isLibraryOpen: false }); - }) - .catch(muteFSAbortError) - .catch((error) => { - setAppState({ errorMessage: error.message }); - }); - }} - /> - { - saveLibraryAsJSON() - .catch(muteFSAbortError) - .catch((error) => { - setAppState({ errorMessage: error.message }); - }); - }} - /> - - , +
, ); for (let row = 0; row < numRows; row++) { From 7366f089baf60ec0f368f98a1cef397e66ce0e9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:01:57 +0530 Subject: [PATCH 16/45] chore(packages/excalidraw): bump ts-loader from 8.0.12 to 8.0.13. (#2696) Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 8.0.12 to 8.0.13. - [Release notes](https://github.com/TypeStrong/ts-loader/releases) - [Changelog](https://github.com/TypeStrong/ts-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/ts-loader/compare/v8.0.12...v8.0.13) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/packages/excalidraw/package-lock.json | 12 ++++++------ src/packages/excalidraw/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/packages/excalidraw/package-lock.json b/src/packages/excalidraw/package-lock.json index 23db6e1e8..8ca29fa65 100644 --- a/src/packages/excalidraw/package-lock.json +++ b/src/packages/excalidraw/package-lock.json @@ -1981,9 +1981,9 @@ "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "requires": { "prr": "~1.0.1" @@ -3227,9 +3227,9 @@ "dev": true }, "ts-loader": { - "version": "8.0.12", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.12.tgz", - "integrity": "sha512-UIivVfGVJDdwwjgSrbtcL9Nf10c1BWnL1mxAQUVcnhNIn/P9W3nP5v60Z0aBMtc7ZrE11lMmU6+5jSgAXmGaYw==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.13.tgz", + "integrity": "sha512-1o1nO6aqouA23d2nlcMSEyPMAWRhnYUU0EQUJSc60E0TUyBNX792RHFYUN1ZM29vhMUNayrsbj2UVdZwKhXCDA==", "dev": true, "requires": { "chalk": "^2.3.0", diff --git a/src/packages/excalidraw/package.json b/src/packages/excalidraw/package.json index 80c9b4d79..b4a6c5b5d 100644 --- a/src/packages/excalidraw/package.json +++ b/src/packages/excalidraw/package.json @@ -57,7 +57,7 @@ "mini-css-extract-plugin": "1.3.3", "sass-loader": "10.1.0", "terser-webpack-plugin": "5.0.3", - "ts-loader": "8.0.12", + "ts-loader": "8.0.13", "webpack": "5.11.0", "webpack-bundle-analyzer": "4.3.0", "webpack-cli": "4.2.0" From cb4c9d16fcb612887411fba2a34e44d7e0db2ea4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:02:27 +0530 Subject: [PATCH 17/45] chore(deps-dev): bump webpack in /src/packages/utils (#2699) Bumps [webpack](https://github.com/webpack/webpack) from 5.11.0 to 5.11.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.11.0...v5.11.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/packages/utils/package-lock.json | 34 ++++++++++++++-------------- src/packages/utils/package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/packages/utils/package-lock.json b/src/packages/utils/package-lock.json index 3e3f27ad2..1600a2987 100644 --- a/src/packages/utils/package-lock.json +++ b/src/packages/utils/package-lock.json @@ -1103,9 +1103,9 @@ "dev": true }, "@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "version": "14.14.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.19.tgz", + "integrity": "sha512-4nhBPStMK04rruRVtVc6cDqhu7S9GZai0fpXgPXrFpcPX6Xul8xnrjSdGB4KPBVYG/R5+fXWdCM8qBoiULWGPQ==", "dev": true }, "@webassemblyjs/ast": { @@ -2317,18 +2317,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.45.0" } }, "mimic-fn": { @@ -2948,9 +2948,9 @@ } }, "webpack": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.0.tgz", - "integrity": "sha512-ubWv7iP54RqAC/VjixgpnLLogCFbAfSOREcSWnnOlZEU8GICC5eKmJSu6YEnph2N2amKqY9rvxSwgyHxVqpaRw==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.1.tgz", + "integrity": "sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -2980,13 +2980,13 @@ }, "dependencies": { "enhanced-resolve": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz", - "integrity": "sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", + "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.0.0" + "tapable": "^2.2.0" } }, "find-up": { diff --git a/src/packages/utils/package.json b/src/packages/utils/package.json index 1f39f390b..6c7919855 100644 --- a/src/packages/utils/package.json +++ b/src/packages/utils/package.json @@ -46,7 +46,7 @@ "cross-env": "7.0.3", "file-loader": "6.2.0", "ts-loader": "8.0.12", - "webpack": "5.11.0", + "webpack": "5.11.1", "webpack-bundle-analyzer": "4.3.0", "webpack-cli": "4.2.0" }, From a231cefac06e16d489bd5b7b97e7f0dc29fee508 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:14:01 +0530 Subject: [PATCH 18/45] chore(deps-dev): bump webpack-cli in /src/packages/excalidraw (#2697) Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.2.0 to 4.3.1. - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.2.0...webpack-cli@4.3.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/packages/excalidraw/package-lock.json | 234 +++++----------------- src/packages/excalidraw/package.json | 2 +- 2 files changed, 56 insertions(+), 180 deletions(-) diff --git a/src/packages/excalidraw/package-lock.json b/src/packages/excalidraw/package-lock.json index 8ca29fa65..caf4a21bd 100644 --- a/src/packages/excalidraw/package-lock.json +++ b/src/packages/excalidraw/package-lock.json @@ -1149,6 +1149,12 @@ "to-fast-properties": "^2.0.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, "@polka/url": { "version": "1.0.0-next.11", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", @@ -1369,18 +1375,18 @@ } }, "@webpack-cli/info": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz", - "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", + "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz", - "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", + "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==", "dev": true }, "@xtuc/ieee754": { @@ -1446,12 +1452,6 @@ "color-convert": "^1.9.0" } }, - "array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", - "dev": true - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1761,18 +1761,6 @@ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1912,12 +1900,6 @@ "ms": "2.1.2" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1945,15 +1927,6 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", @@ -2047,19 +2020,19 @@ "dev": true }, "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, @@ -2075,6 +2048,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -2163,13 +2142,10 @@ } }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true }, "glob-to-regexp": { "version": "0.4.1", @@ -2229,9 +2205,9 @@ "dev": true }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "icss-utils": { @@ -2248,51 +2224,6 @@ "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } } }, "indexes-of": { @@ -2322,6 +2253,15 @@ "loose-envify": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2413,12 +2353,6 @@ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "dev": true }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, "loader-runner": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", @@ -2642,15 +2576,6 @@ "object-keys": "^1.1.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -2807,16 +2732,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2856,12 +2771,6 @@ "resolve": "^1.9.0" } }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -2930,11 +2839,12 @@ } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -3126,18 +3036,6 @@ "has-flag": "^3.0.0" } }, - "table-layout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", - "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - } - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -3253,12 +3151,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -3522,21 +3414,21 @@ } }, "webpack-cli": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz", - "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", + "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", "dev": true, "requires": { - "@webpack-cli/info": "^1.1.0", - "@webpack-cli/serve": "^1.1.0", + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/info": "^1.2.1", + "@webpack-cli/serve": "^1.2.1", "colorette": "^1.2.1", - "command-line-usage": "^6.1.0", "commander": "^6.2.0", "enquirer": "^2.3.6", - "execa": "^4.1.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", - "leven": "^3.1.0", "rechoir": "^0.7.0", "v8-compile-cache": "^2.2.0", "webpack-merge": "^4.2.2" @@ -3586,22 +3478,6 @@ "isexe": "^2.0.0" } }, - "wordwrapjs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", - "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "ws": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", diff --git a/src/packages/excalidraw/package.json b/src/packages/excalidraw/package.json index b4a6c5b5d..97abe04ff 100644 --- a/src/packages/excalidraw/package.json +++ b/src/packages/excalidraw/package.json @@ -60,7 +60,7 @@ "ts-loader": "8.0.13", "webpack": "5.11.0", "webpack-bundle-analyzer": "4.3.0", - "webpack-cli": "4.2.0" + "webpack-cli": "4.3.1" }, "bugs": "https://github.com/excalidraw/excalidraw/issues", "repository": "https://github.com/excalidraw/excalidraw", From afe0c760f6c596fe01f78ea3eb4060c2fbb8a618 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:14:21 +0530 Subject: [PATCH 19/45] chore(deps-dev): bump webpack-cli in /src/packages/utils (#2701) Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.2.0 to 4.3.1. - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.2.0...webpack-cli@4.3.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/packages/utils/package-lock.json | 173 +++++++-------------------- src/packages/utils/package.json | 2 +- 2 files changed, 43 insertions(+), 132 deletions(-) diff --git a/src/packages/utils/package-lock.json b/src/packages/utils/package-lock.json index 1600a2987..9b6de6870 100644 --- a/src/packages/utils/package-lock.json +++ b/src/packages/utils/package-lock.json @@ -1064,6 +1064,12 @@ "to-fast-properties": "^2.0.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, "@polka/url": { "version": "1.0.0-next.11", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", @@ -1284,18 +1290,18 @@ } }, "@webpack-cli/info": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz", - "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", + "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz", - "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", + "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==", "dev": true }, "@xtuc/ieee754": { @@ -1361,12 +1367,6 @@ "color-convert": "^1.9.0" } }, - "array-back": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", - "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", - "dev": true - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1670,18 +1670,6 @@ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1762,12 +1750,6 @@ "ms": "2.1.2" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1795,15 +1777,6 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", @@ -1897,19 +1870,19 @@ "dev": true }, "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, @@ -1925,6 +1898,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -2013,13 +1992,10 @@ } }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true }, "glob-to-regexp": { "version": "0.4.1", @@ -2079,9 +2055,9 @@ "dev": true }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "import-local": { @@ -2209,12 +2185,6 @@ "minimist": "^1.2.5" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, "loader-runner": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", @@ -2388,15 +2358,6 @@ "object-keys": "^1.1.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -2481,16 +2442,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2530,12 +2481,6 @@ "resolve": "^1.9.0" } }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -2755,18 +2700,6 @@ "has-flag": "^3.0.0" } }, - "table-layout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", - "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - } - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -2882,12 +2815,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -3129,21 +3056,21 @@ } }, "webpack-cli": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz", - "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", + "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", "dev": true, "requires": { - "@webpack-cli/info": "^1.1.0", - "@webpack-cli/serve": "^1.1.0", + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/info": "^1.2.1", + "@webpack-cli/serve": "^1.2.1", "colorette": "^1.2.1", - "command-line-usage": "^6.1.0", "commander": "^6.2.0", "enquirer": "^2.3.6", - "execa": "^4.1.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", - "leven": "^3.1.0", "rechoir": "^0.7.0", "v8-compile-cache": "^2.2.0", "webpack-merge": "^4.2.2" @@ -3193,22 +3120,6 @@ "isexe": "^2.0.0" } }, - "wordwrapjs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", - "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, "ws": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", diff --git a/src/packages/utils/package.json b/src/packages/utils/package.json index 6c7919855..a60d28d87 100644 --- a/src/packages/utils/package.json +++ b/src/packages/utils/package.json @@ -48,7 +48,7 @@ "ts-loader": "8.0.12", "webpack": "5.11.1", "webpack-bundle-analyzer": "4.3.0", - "webpack-cli": "4.2.0" + "webpack-cli": "4.3.1" }, "bugs": "https://github.com/excalidraw/excalidraw/issues", "repository": "https://github.com/excalidraw/excalidraw", From 8e9af5c51b77be090cb96aaa34e798923f77d5ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:20:06 +0530 Subject: [PATCH 20/45] chore(deps-dev): bump webpack in /src/packages/excalidraw (#2698) Bumps [webpack](https://github.com/webpack/webpack) from 5.11.0 to 5.11.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.11.0...v5.11.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/packages/excalidraw/package-lock.json | 28 +++++++++++------------ src/packages/excalidraw/package.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/packages/excalidraw/package-lock.json b/src/packages/excalidraw/package-lock.json index caf4a21bd..cb79f61bc 100644 --- a/src/packages/excalidraw/package-lock.json +++ b/src/packages/excalidraw/package-lock.json @@ -2464,18 +2464,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.45.0" } }, "mimic-fn": { @@ -3217,9 +3217,9 @@ } }, "webpack": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.0.tgz", - "integrity": "sha512-ubWv7iP54RqAC/VjixgpnLLogCFbAfSOREcSWnnOlZEU8GICC5eKmJSu6YEnph2N2amKqY9rvxSwgyHxVqpaRw==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.1.tgz", + "integrity": "sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -3249,13 +3249,13 @@ }, "dependencies": { "enhanced-resolve": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz", - "integrity": "sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", + "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.0.0" + "tapable": "^2.2.0" } }, "find-up": { diff --git a/src/packages/excalidraw/package.json b/src/packages/excalidraw/package.json index 97abe04ff..cce5d6163 100644 --- a/src/packages/excalidraw/package.json +++ b/src/packages/excalidraw/package.json @@ -58,7 +58,7 @@ "sass-loader": "10.1.0", "terser-webpack-plugin": "5.0.3", "ts-loader": "8.0.13", - "webpack": "5.11.0", + "webpack": "5.11.1", "webpack-bundle-analyzer": "4.3.0", "webpack-cli": "4.3.1" }, From eb1f717d350b98c5bdee820c41baca78a622d9e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:20:28 +0530 Subject: [PATCH 21/45] chore(deps-dev): bump ts-loader in /src/packages/utils (#2700) Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 8.0.12 to 8.0.13. - [Release notes](https://github.com/TypeStrong/ts-loader/releases) - [Changelog](https://github.com/TypeStrong/ts-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/ts-loader/compare/v8.0.12...v8.0.13) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/packages/utils/package-lock.json | 12 ++++++------ src/packages/utils/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/packages/utils/package-lock.json b/src/packages/utils/package-lock.json index 9b6de6870..9d2f334ac 100644 --- a/src/packages/utils/package-lock.json +++ b/src/packages/utils/package-lock.json @@ -1804,9 +1804,9 @@ "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "requires": { "prr": "~1.0.1" @@ -2789,9 +2789,9 @@ "dev": true }, "ts-loader": { - "version": "8.0.12", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.12.tgz", - "integrity": "sha512-UIivVfGVJDdwwjgSrbtcL9Nf10c1BWnL1mxAQUVcnhNIn/P9W3nP5v60Z0aBMtc7ZrE11lMmU6+5jSgAXmGaYw==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.13.tgz", + "integrity": "sha512-1o1nO6aqouA23d2nlcMSEyPMAWRhnYUU0EQUJSc60E0TUyBNX792RHFYUN1ZM29vhMUNayrsbj2UVdZwKhXCDA==", "dev": true, "requires": { "chalk": "^2.3.0", diff --git a/src/packages/utils/package.json b/src/packages/utils/package.json index a60d28d87..776a30ad5 100644 --- a/src/packages/utils/package.json +++ b/src/packages/utils/package.json @@ -45,7 +45,7 @@ "babel-plugin-transform-class-properties": "6.24.1", "cross-env": "7.0.3", "file-loader": "6.2.0", - "ts-loader": "8.0.12", + "ts-loader": "8.0.13", "webpack": "5.11.1", "webpack-bundle-analyzer": "4.3.0", "webpack-cli": "4.3.1" From 69878167c28c8bb0398ed99cb942526fae0234d8 Mon Sep 17 00:00:00 2001 From: Lipis Date: Sun, 3 Jan 2021 11:50:41 +0200 Subject: [PATCH 22/45] improvement: Make dialogs look more like dialogs (#2686) Co-authored-by: Jed Fox Co-authored-by: dwelle --- src/components/Dialog.scss | 14 ++++++++------ src/components/Dialog.tsx | 8 ++++---- src/components/Island.scss | 2 +- src/components/Modal.scss | 14 ++++++++------ src/components/Modal.tsx | 6 +----- src/css/theme.scss | 8 ++------ 6 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/components/Dialog.scss b/src/components/Dialog.scss index 3ca5d6258..3586c1cd2 100644 --- a/src/components/Dialog.scss +++ b/src/components/Dialog.scss @@ -7,6 +7,9 @@ margin-top: 0; grid-template-columns: 1fr calc(var(--space-factor) * 7); grid-gap: var(--metric); + padding: calc(var(--space-factor) * 2); + text-align: center; + font-variant: small-caps; } .Dialog__titleContent { @@ -18,6 +21,10 @@ margin: 0; } + .Dialog__content { + padding: 0 16px 16px; + } + @media #{$is-mobile-query} { .Dialog { --metric: calc(var(--space-factor) * 4); @@ -30,13 +37,8 @@ var(--space-factor) * 7 ); position: sticky; - top: calc(-1 * var(--metric)); - margin: calc(-1 * var(--inset-right)); - margin-top: calc(-1 * var(--metric)); - margin-bottom: var(--metric); + top: 0; padding: calc(var(--space-factor) * 2); - padding-left: var(--inset-left); - padding-right: var(--inset-right); background: var(--bg-color-island); font-size: 1.25em; diff --git a/src/components/Dialog.tsx b/src/components/Dialog.tsx index 4efbadb82..aa2ef7c01 100644 --- a/src/components/Dialog.tsx +++ b/src/components/Dialog.tsx @@ -79,8 +79,8 @@ export const Dialog = (props: { maxWidth={props.small ? 550 : 800} onCloseRequest={props.onCloseRequest} > - -

+ +

{props.title} -

- {props.children} +

+
{props.children}
); diff --git a/src/components/Island.scss b/src/components/Island.scss index 713910aca..faac18d68 100644 --- a/src/components/Island.scss +++ b/src/components/Island.scss @@ -4,7 +4,7 @@ background-color: var(--bg-color-island); backdrop-filter: saturate(100%) blur(10px); box-shadow: var(--shadow-island); - border-radius: var(--border-radius-m); + border-radius: 4px; padding: calc(var(--padding) * var(--space-factor)); position: relative; transition: box-shadow 0.5s ease-in-out; diff --git a/src/components/Modal.scss b/src/components/Modal.scss index c009b4e49..2b34500da 100644 --- a/src/components/Modal.scss +++ b/src/components/Modal.scss @@ -30,18 +30,26 @@ z-index: 2; width: 100%; max-width: var(--max-width); + max-height: 100%; opacity: 0; transform: translateY(10px); animation: Modal__content_fade-in 0.1s ease-out 0.05s forwards; position: relative; + overflow-y: auto; // for modals, reset blurry bg background: var(--bg-color-island); backdrop-filter: none; + border: 1px solid var(--dialog-border); + box-shadow: 0 2px 10px transparentize($oc-black, 0.75); + border-radius: 6px; + @media #{$is-mobile-query} { max-width: 100%; + border: 0; + border-radius: 0; } } @@ -68,12 +76,6 @@ } } - .Modal__close--floating { - position: absolute; - right: calc(var(--space-factor) * 5); - top: calc(var(--space-factor) * 5); - } - @media #{$is-mobile-query} { .Modal { padding: 0; diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx index 7fcfbf4df..015760823 100644 --- a/src/components/Modal.tsx +++ b/src/components/Modal.tsx @@ -36,11 +36,7 @@ export const Modal = (props: {
{props.children}
diff --git a/src/css/theme.scss b/src/css/theme.scss index b28fca637..4de90d83d 100644 --- a/src/css/theme.scss +++ b/src/css/theme.scss @@ -3,7 +3,6 @@ :root { --bg-color-island: rgba(255, 255, 255, 0.9); --popup-background-color: #{$oc-white}; - --border-radius-m: 4px; --space-factor: 0.25rem; --button-gray-1: #{$oc-gray-2}; --button-gray-2: #{$oc-gray-4}; @@ -15,7 +14,6 @@ --icon-fill-color: #{$oc-black}; --icon-green-fill-color: #{$oc-green-9}; --keybinding-color: #{$oc-gray-5}; - --color-overlay-text-color: #ccc; --sat: env(safe-area-inset-top); --sab: env(safe-area-inset-bottom); --sal: env(safe-area-inset-left); @@ -23,8 +21,6 @@ --text-color-primary: #{$oc-gray-8}; --shadow-island: 0 1px 5px #{transparentize($oc-black, 0.85)}; --overlay-background-color: #{transparentize($oc-white, 0.12)}; - --border-radius-m: 4px; - --space-factor: 0.25rem; --dropdown-icon: url('data:image/svg+xml,'); --focus-highlight-color: #{$oc-blue-2}; --select-highlight-color: #{$oc-blue-5}; @@ -35,6 +31,7 @@ --popup-secondary-background-color: #{$oc-gray-1}; --popup-text-color: #{$oc-black}; --popup-text-inverted-color: #{$oc-white}; + --dialog-border: #{$oc-gray-6}; } .excalidraw { @@ -60,10 +57,8 @@ --icon-fill-color: #{$oc-gray-4}; --icon-green-fill-color: #{$oc-green-4}; --keybinding-color: #{$oc-gray-6}; - --color-overlay-text-color: #bbb; --shadow-island: 0 1px 5px #{transparentize($oc-black, 0.7)}; --overlay-background-color: rgba(30, 30, 30, 0.88); - // #{$oc-gray-4}; inlined --dropdown-icon: url('data:image/svg+xml,'); --focus-highlight-color: #{$oc-blue-6}; --select-highlight-color: #{$oc-blue-4}; @@ -74,5 +69,6 @@ --popup-secondary-background-color: #222; --popup-text-color: #{$oc-gray-4}; --popup-text-inverted-color: #2c2c2c; + --dialog-border: #{$oc-gray-9}; } } From c35d983fef8a83ba842dd892c0f461111a3e8589 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Jan 2021 10:52:02 +0100 Subject: [PATCH 23/45] chore(deps): bump @testing-library/jest-dom from 5.11.6 to 5.11.8 (#2702) Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 5.11.6 to 5.11.8. - [Release notes](https://github.com/testing-library/jest-dom/releases) - [Changelog](https://github.com/testing-library/jest-dom/blob/master/CHANGELOG.md) - [Commits](https://github.com/testing-library/jest-dom/compare/v5.11.6...v5.11.8) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0dcf1e7ef..e306338ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3030,9 +3030,9 @@ } }, "@testing-library/jest-dom": { - "version": "5.11.6", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.6.tgz", - "integrity": "sha512-cVZyUNRWwUKI0++yepYpYX7uhrP398I+tGz4zOlLVlUYnZS+Svuxv4fwLeCIy7TnBYKXUaOlQr3vopxL8ZfEnA==", + "version": "5.11.8", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.8.tgz", + "integrity": "sha512-ScyKrWQM5xNcr79PkSewnA79CLaoxVskE+f7knTOhDD9ftZSA1Jw8mj+pneqhEu3x37ncNfW84NUr7lqK+mXjA==", "requires": { "@babel/runtime": "^7.9.2", "@types/testing-library__jest-dom": "^5.9.1", diff --git a/package.json b/package.json index e78309da2..3bf149b7f 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "@sentry/browser": "5.29.2", "@sentry/integrations": "5.29.2", - "@testing-library/jest-dom": "5.11.6", + "@testing-library/jest-dom": "5.11.8", "@testing-library/react": "11.2.2", "@types/jest": "26.0.19", "@types/nanoid": "2.1.0", From ade2565f497243a5e428f4906d8ed80c872fd981 Mon Sep 17 00:00:00 2001 From: Aakansha Doshi Date: Mon, 4 Jan 2021 02:21:52 +0530 Subject: [PATCH 24/45] feat: add langCode and renderFooter props (#2644) Co-authored-by: Aakansha Doshi Co-authored-by: dwelle --- src/components/App.tsx | 19 ++- src/components/InitializeApp.tsx | 23 ++- src/components/LayerUI.tsx | 20 +-- src/components/MobileMenu.tsx | 15 +- .../components/LanguageList.tsx | 18 +-- src/excalidraw-app/index.tsx | 60 +++++++- src/i18n.ts | 127 +++++++---------- src/packages/excalidraw/CHANGELOG.md | 3 + src/packages/excalidraw/README.md | 20 +++ src/packages/excalidraw/index.tsx | 8 +- .../regressionTests.test.tsx.snap | 134 +++++++++--------- src/tests/align.test.tsx | 4 +- src/tests/regressionTests.test.tsx | 9 +- src/types.ts | 3 + 14 files changed, 271 insertions(+), 192 deletions(-) rename src/{ => excalidraw-app}/components/LanguageList.tsx (58%) diff --git a/src/components/App.tsx b/src/components/App.tsx index ecce0fd2f..30c069f42 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -111,7 +111,7 @@ import { selectGroupsForSelectedElements, } from "../groups"; import { createHistory, SceneHistory } from "../history"; -import { getLanguage, t } from "../i18n"; +import { t, getLanguage, setLanguage, languages, defaultLang } from "../i18n"; import { CODES, getResizeCenterPointKey, @@ -332,7 +332,7 @@ class App extends React.Component { offsetLeft, } = this.state; - const { onCollabButtonClick, onExportToBackend } = this.props; + const { onCollabButtonClick, onExportToBackend, renderFooter } = this.props; const canvasScale = window.devicePixelRatio; const canvasWidth = canvasDOMWidth * canvasScale; @@ -369,9 +369,10 @@ class App extends React.Component { } zenModeEnabled={zenModeEnabled} toggleZenMode={this.toggleZenMode} - lng={getLanguage().lng} + langCode={getLanguage().code} isCollaborating={this.props.isCollaborating || false} onExportToBackend={onExportToBackend} + renderCustomFooter={renderFooter} /> {this.state.showStats && ( { } componentDidUpdate(prevProps: ExcalidrawProps, prevState: AppState) { + if (prevProps.langCode !== this.props.langCode) { + this.updateLanguage(); + } + if ( prevProps.width !== this.props.width || prevProps.height !== this.props.height || @@ -3849,6 +3854,14 @@ class App extends React.Component { offsetTop: typeof offsets?.offsetTop === "number" ? offsets.offsetTop : 0, }; } + + private async updateLanguage() { + const currentLang = + languages.find((lang) => lang.code === this.props.langCode) || + defaultLang; + await setLanguage(currentLang); + this.setAppState({}); + } } // ----------------------------------------------------------------------------- diff --git a/src/components/InitializeApp.tsx b/src/components/InitializeApp.tsx index 091f726d7..ae0bea036 100644 --- a/src/components/InitializeApp.tsx +++ b/src/components/InitializeApp.tsx @@ -1,18 +1,29 @@ import React from "react"; import { LoadingMessage } from "./LoadingMessage"; -import { setLanguageFirstTime } from "../i18n"; +import { + defaultLang, + Language, + languages, + setLanguageFirstTime, +} from "../i18n"; -export class InitializeApp extends React.Component< - any, - { isLoading: boolean } -> { +interface Props { + langCode: Language["code"]; +} +interface State { + isLoading: boolean; +} +export class InitializeApp extends React.Component { public state: { isLoading: boolean } = { isLoading: true, }; async componentDidMount() { - await setLanguageFirstTime(); + const currentLang = + languages.find((lang) => lang.code === this.props.langCode) || + defaultLang; + await setLanguageFirstTime(currentLang); this.setState({ isLoading: false, }); diff --git a/src/components/LayerUI.tsx b/src/components/LayerUI.tsx index 5a806e829..dd09ffef9 100644 --- a/src/components/LayerUI.tsx +++ b/src/components/LayerUI.tsx @@ -19,8 +19,7 @@ import { FixedSideContainer } from "./FixedSideContainer"; import { UserList } from "./UserList"; import { LockIcon } from "./LockIcon"; import { ExportDialog, ExportCB } from "./ExportDialog"; -import { LanguageList } from "./LanguageList"; -import { t, languages, setLanguage } from "../i18n"; +import { Language, t } from "../i18n"; import { HintViewer } from "./HintViewer"; import useIsMobile from "../is-mobile"; @@ -64,13 +63,14 @@ interface LayerUIProps { onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void; zenModeEnabled: boolean; toggleZenMode: () => void; - lng: string; + langCode: Language["code"]; isCollaborating: boolean; onExportToBackend?: ( exportedElements: readonly NonDeletedExcalidrawElement[], appState: AppState, canvas: HTMLCanvasElement | null, ) => void; + renderCustomFooter?: (isMobile: boolean) => JSX.Element; } const useOnClickOutside = ( @@ -316,6 +316,7 @@ const LayerUI = ({ toggleZenMode, isCollaborating, onExportToBackend, + renderCustomFooter, }: LayerUIProps) => { const isMobile = useIsMobile(); @@ -551,14 +552,7 @@ const LayerUI = ({ "transition-right disable-pointerEvents": zenModeEnabled, })} > - { - await setLanguage(lng); - setAppState({}); - }} - languages={languages} - floating - /> + {renderCustomFooter?.(false)} {actionManager.renderAction("toggleShortcuts")}
, @@ -267,7 +251,6 @@ const LibraryMenu = ({ const items = await Library.loadLibrary(); const nextItems = items.filter((_, index) => index !== indexToRemove); Library.saveLibrary(nextItems); - trackEvent(EVENT_LIBRARY, "remove"); setLibraryItems(nextItems); }, []); @@ -276,7 +259,6 @@ const LibraryMenu = ({ const items = await Library.loadLibrary(); const nextItems = [...items, elements]; onAddToLibrary(); - trackEvent(EVENT_LIBRARY, "add"); Library.saveLibrary(nextItems); setLibraryItems(nextItems); }, @@ -328,9 +310,6 @@ const LayerUI = ({ href="https://blog.excalidraw.com/end-to-end-encryption/" target="_blank" rel="noopener noreferrer" - onClick={() => { - trackEvent(EVENT_EXIT, "e2ee shield"); - }} > {shield} @@ -567,7 +546,6 @@ const LayerUI = ({