Compare commits

...

78 Commits

Author SHA1 Message Date
31747b08a7 refine routes 2021-02-14 17:49:37 +02:00
c71ba5c02a add room 2021-02-14 17:43:09 +02:00
e86ae51c92 test handle filesystem 2021-02-14 17:34:41 +02:00
d87ced1711 separate routes 2021-02-14 17:25:27 +02:00
803785201e fix regexp 2021-02-14 17:23:10 +02:00
e844ef8c34 fix headers 2021-02-14 17:19:12 +02:00
9e2df2ac82 merge routes with headers 2021-02-14 17:18:07 +02:00
feae342283 resolve #2910 2021-02-14 17:15:40 +02:00
e6cd97c4f2 feat: adjust line-confirm-threshold based on zoom (#2884)
Co-authored-by: Lipis <lipiridis@gmail.com>
2021-02-14 14:43:23 +01:00
ba9b65b051 chore: npm audit fix 2021-02-14 15:18:17 +02:00
830fb64a25 fix: Support Excalidraw inside scrollable container (#3018)
* refactor: remove position fixed from excalidraw container, modal and stats

* remove unused css

* remove position fixed from toast and scroll to content

* Make excal interactable by fixing offsets and set popover as fixed since position needs to be calculate from viewport  top

* Assign 200px less than height of Excalidraw to the selected shapes actions o UI doesn't overflow

* update changelog, readme and package.json
2021-02-14 18:18:34 +05:30
5b343a9d46 chore(deps-dev): bump @babel/preset-env from 7.12.13 to 7.12.16 in /src/packages/utils (#3030)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.12.13 to 7.12.16.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.16/packages/babel-preset-env)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 11:47:25 +02:00
f8beb305de refactor: Removed redundant import from App.tsx (#3040)
Given it's followed by qualified import - unqualified import looks redundant, unless I'm missing some tricky edge case.
2021-02-14 11:25:57 +02:00
4b4eecbd27 chore(deps): bump react-scripts from 4.0.1 to 4.0.2 (#2979)
Bumps [react-scripts](https://github.com/facebook/create-react-app/tree/HEAD/packages/react-scripts) from 4.0.1 to 4.0.2.
- [Release notes](https://github.com/facebook/create-react-app/releases)
- [Changelog](https://github.com/facebook/create-react-app/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/create-react-app/commits/react-scripts@4.0.2/packages/react-scripts)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:23:05 +00:00
e8bd910b9b chore(deps-dev): bump @babel/preset-env from 7.12.13 to 7.12.16 in /src/packages/excalidraw (#3019)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 08:20:30 +00:00
a9a3e1bca5 chore(deps-dev): bump ts-loader from 8.0.15 to 8.0.17 in /src/packages/utils (#3027)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 08:16:28 +00:00
2a922dd477 chore(deps-dev): bump @babel/preset-typescript from 7.12.13 to 7.12.16 in /src/packages/excalidraw (#3025)
Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.12.13 to 7.12.16.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.16/packages/babel-preset-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 08:12:33 +00:00
07dab85ebf chore(deps-dev): bump sass-loader from 11.0.0 to 11.0.1 in /src/packages/excalidraw (#3020)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 08:07:01 +00:00
d2ce4a7523 chore(deps-dev): bump ts-loader from 8.0.15 to 8.0.17 in /src/packages/excalidraw (#3029)
Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 8.0.15 to 8.0.17.
- [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.15...v8.0.17)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 08:01:57 +00:00
dc73f3a9eb chore(deps-dev): bump @babel/core from 7.12.13 to 7.12.16 in /src/packages/excalidraw (#3031)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 07:59:28 +00:00
d100f38750 chore(deps-dev): bump @babel/preset-typescript from 7.12.13 to 7.12.16 in /src/packages/utils (#3024)
Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.12.13 to 7.12.16.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.16/packages/babel-preset-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 07:55:41 +00:00
503500cc74 chore(deps-dev): bump @babel/plugin-transform-typescript from 7.12.13 to 7.12.16 in /src/packages/utils (#3028)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 07:46:40 +00:00
1a828a43d9 chore(deps): bump @types/react-dom from 17.0.0 to 17.0.1 (#3035)
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 17.0.0 to 17.0.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 07:45:50 +00:00
d88884466b chore(deps-dev): bump @babel/core from 7.12.13 to 7.12.16 in /src/packages/utils (#3021)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.12.13 to 7.12.16.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.16/packages/babel-core)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:44:21 +02:00
d3d470ac3d chore(deps-dev): bump jest-canvas-mock from 2.3.0 to 2.3.1 (#3037)
Bumps [jest-canvas-mock](https://github.com/hustcc/jest-canvas-mock) from 2.3.0 to 2.3.1.
- [Release notes](https://github.com/hustcc/jest-canvas-mock/releases)
- [Changelog](https://github.com/hustcc/jest-canvas-mock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hustcc/jest-canvas-mock/commits)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:43:49 +02:00
54df521a78 chore(deps-dev): bump mini-css-extract-plugin from 1.3.5 to 1.3.6 in /src/packages/excalidraw (#3022)
Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 1.3.5 to 1.3.6.
- [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v1.3.5...v1.3.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:43:38 +02:00
c5557b5cc1 chore(deps): bump typescript from 4.1.3 to 4.1.5 (#3034)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.1.3 to 4.1.5.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.1.3...v4.1.5)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:43:27 +02:00
51875fd627 chore(deps): bump firebase from 8.2.6 to 8.2.7 (#3038)
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 8.2.6 to 8.2.7.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Changelog](https://github.com/firebase/firebase-js-sdk/blob/master/CHANGELOG.md)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@8.2.6...firebase@8.2.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:42:53 +02:00
b2ba61bbcf chore(deps-dev): bump webpack from 5.21.1 to 5.21.2 in /src/packages/excalidraw (#3032)
Bumps [webpack](https://github.com/webpack/webpack) from 5.21.1 to 5.21.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.21.1...v5.21.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:42:36 +02:00
3b7f62c9a0 chore(deps-dev): bump @babel/plugin-transform-typescript from 7.12.13 to 7.12.16 in /src/packages/excalidraw (#3033)
Bumps [@babel/plugin-transform-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-typescript) from 7.12.13 to 7.12.16.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.16/packages/babel-plugin-transform-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:42:26 +02:00
aeafb81479 chore(deps-dev): bump css-loader in /src/packages/excalidraw (#3026)
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v5.0.1...v5.0.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:42:13 +02:00
dfe81bf6b2 chore(deps-dev): bump webpack from 5.21.1 to 5.21.2 in /src/packages/utils (#3023)
Bumps [webpack](https://github.com/webpack/webpack) from 5.21.1 to 5.21.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.21.1...v5.21.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:42:02 +02:00
1d332d597a chore(deps): bump @types/react from 17.0.1 to 17.0.2 (#3036)
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.1 to 17.0.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-14 09:41:09 +02:00
b5fc8757a4 fix: allow to toggle between modes when view only mode to make UI consistent (#3009) 2021-02-12 10:40:40 +02:00
ecbd5ba55d docs: update readme, changelog and release 0.3.0 🎉 (#3003) 2021-02-11 19:55:38 +05:30
6967d8c985 chore: Update translations from Crowdin (#3000) 2021-02-11 14:13:32 +02:00
4b253c7362 fix: refresh wysiwyg position on canvas resize (#3008) 2021-02-11 12:24:26 +01:00
4fdddb518a docs(readme): link to @excalidraw/excalidraw npm package to give more visibility (#3002) 2021-02-10 21:58:29 +05:30
0b2e4dd60b build(webpack): remove publicPath so __webpack_public_path__ can be used to host assets (#2835)
* build(webpack): remove publicPath so __webpack_public_path__ can be use to host assets

* update readme and changelog

* fix

* revert version so its released in v3
2021-02-10 21:49:16 +05:30
f162512988 docs: link to specific sponsors (#2950) 2021-02-10 10:22:49 +02:00
2f7154cdf2 chore: Use Sentence case for Live collaboration 2021-02-09 15:55:03 +02:00
5ab0ce5a33 feat: Add the ability to clear library (#2997)
* Add the ability to clear libraries

* Update 'libraries' to 'library'

* Update en.json
2021-02-09 11:19:04 +01:00
073f4032f3 chore: Update translations from Crowdin (#2986) 2021-02-09 11:06:23 +02:00
73cba59d2d feat: Updates to Collaboration and RTL UX (#2994) 2021-02-08 21:43:51 +01:00
4085071347 docs: Fix typo (#2996) 2021-02-08 18:39:59 +02:00
8a63187d4f Update the lang attribute with the current lang. (#2995)
Currently, when changing the app language, the `lang` attribute still in `en`.
2021-02-08 12:38:38 +02:00
9c51ba6067 feat: show toast when saving to existing file (#2988) 2021-02-07 22:01:22 +01:00
bf50c9cae7 chore: Update translations from Crowdin (#2946) 2021-02-07 12:33:37 +02:00
1801048763 chore(deps-dev): bump @babel/plugin-transform-arrow-functions from 7.12.1 to 7.12.13 in /src/packages/excalidraw (#2961)
Bumps [@babel/plugin-transform-arrow-functions](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-arrow-functions) from 7.12.1 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-plugin-transform-arrow-functions)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 11:25:00 +02:00
414deea084 chore(deps-dev): bump @babel/preset-typescript from 7.12.7 to 7.12.13 in /src/packages/excalidraw (#2955)
Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.12.7 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-preset-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:15:47 +00:00
979d28d5c6 chore(deps-dev): bump @babel/preset-env from 7.12.11 to 7.12.13 in /src/packages/utils (#2970)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:14:45 +00:00
1f8b7e417f chore(deps-dev): bump @babel/plugin-transform-async-to-generator from 7.12.1 to 7.12.13 in /src/packages/excalidraw (#2957)
Bumps [@babel/plugin-transform-async-to-generator](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-async-to-generator) from 7.12.1 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-plugin-transform-async-to-generator)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:05:16 +00:00
8c968cd13e chore(deps-dev): bump @babel/preset-typescript from 7.12.7 to 7.12.13 in /src/packages/utils (#2964)
Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.12.7 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-preset-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:59:54 +00:00
f798000006 chore(deps-dev): bump @babel/plugin-transform-async-to-generator from 7.12.1 to 7.12.13 in /src/packages/utils (#2972)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:55:43 +00:00
7ff3a71179 chore(deps-dev): bump @babel/preset-env from 7.12.11 to 7.12.13 in /src/packages/excalidraw (#2973)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.12.11 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-preset-env)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:48:42 +00:00
6c0804d4c3 chore(deps-dev): bump @babel/core from 7.12.10 to 7.12.13 in /src/packages/excalidraw (#2952)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.12.10 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-core)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:45:04 +00:00
ae8e7aca16 chore(deps-dev): bump ts-loader from 8.0.14 to 8.0.15 in /src/packages/excalidraw (#2969)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:41:10 +00:00
842b185aa6 chore(deps-dev): bump @babel/plugin-transform-runtime from 7.12.10 to 7.12.15 in /src/packages/utils (#2968)
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.12.10 to 7.12.15.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.15/packages/babel-plugin-transform-runtime)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:34:00 +00:00
f59387471e chore(deps): bump firebase from 8.2.5 to 8.2.6 (#2983)
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 8.2.5 to 8.2.6.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Changelog](https://github.com/firebase/firebase-js-sdk/blob/master/CHANGELOG.md)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@8.2.5...firebase@8.2.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:31:32 +00:00
60eb709eb3 chore(deps-dev): bump @babel/plugin-transform-runtime from 7.12.10 to 7.12.15 in /src/packages/excalidraw (#2967)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:27:00 +00:00
02539bbb89 chore(deps): bump @testing-library/react from 11.2.3 to 11.2.5 (#2975)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 11.2.3 to 11.2.5.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/master/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v11.2.3...v11.2.5)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 10:19:28 +02:00
77ae5d4605 chore(deps): bump @sentry/* from 6.0.3 to 6.1.0 (#2984) 2021-02-07 10:17:05 +02:00
bdd4f69bf6 chore(deps-dev): bump @babel/preset-react from 7.12.10 to 7.12.13 in /src/packages/excalidraw (#2963)
Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.12.10 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-preset-react)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 10:16:47 +02:00
87ca829490 chore(deps-dev): bump webpack-cli from 4.4.0 to 4.5.0 in /src/packages/excalidraw (#2953)
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.4.0 to 4.5.0.
- [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.4.0...webpack-cli@4.5.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 10:15:42 +02:00
a31a7fd766 chore(deps-dev): bump @babel/plugin-transform-typescript from 7.12.1 to 7.12.13 in /src/packages/utils (#2954)
Bumps [@babel/plugin-transform-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-typescript) from 7.12.1 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-plugin-transform-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:12:48 +00:00
e70f02063f chore(deps-dev): bump sass-loader from 10.1.1 to 11.0.0 in /src/packages/excalidraw (#2971)
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 10.1.1 to 11.0.0.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v10.1.1...v11.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 08:10:24 +00:00
769f727bd4 chore(deps-dev): bump @babel/plugin-transform-arrow-functions from 7.12.1 to 7.12.13 in /src/packages/utils (#2960)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 07:58:51 +00:00
bc994fcbe2 chore(deps-dev): bump @babel/core from 7.12.10 to 7.12.13 in /src/packages/utils (#2956)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.12.10 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-core)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:52:55 +02:00
ac5e058222 chore(deps-dev): bump webpack from 5.19.0 to 5.21.1 in /src/packages/utils (#2966)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 07:52:22 +00:00
d61970cdac chore(deps): bump browser-fs-access from 0.13.0 to 0.13.1 (#2980)
Bumps [browser-fs-access](https://github.com/GoogleChromeLabs/browser-fs-access) from 0.13.0 to 0.13.1.
- [Release notes](https://github.com/GoogleChromeLabs/browser-fs-access/releases)
- [Commits](https://github.com/GoogleChromeLabs/browser-fs-access/commits)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:43:49 +02:00
489d4b7469 chore(deps-dev): bump webpack from 5.19.0 to 5.21.1 in /src/packages/excalidraw (#2965)
Bumps [webpack](https://github.com/webpack/webpack) from 5.19.0 to 5.21.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.19.0...v5.21.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:43:26 +02:00
d88de08872 chore(deps-dev): bump webpack-cli from 4.4.0 to 4.5.0 in /src/packages/utils (#2958)
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.4.0 to 4.5.0.
- [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.4.0...webpack-cli@4.5.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:42:51 +02:00
42882e2a93 chore(deps-dev): bump @babel/plugin-transform-typescript (#2959)
Bumps [@babel/plugin-transform-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-typescript) from 7.12.1 to 7.12.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.13/packages/babel-plugin-transform-typescript)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:42:37 +02:00
f6374e5bde chore(deps-dev): bump ts-loader from 8.0.14 to 8.0.15 in /src/packages/utils (#2962)
Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 8.0.14 to 8.0.15.
- [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.14...v8.0.15)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:42:20 +02:00
aac9d4e837 chore(deps): bump @types/react from 17.0.0 to 17.0.1 (#2978)
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.0 to 17.0.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:42:12 +02:00
d9103b8b24 chore(deps-dev): bump firebase-tools from 9.2.2 to 9.3.0 (#2974)
Bumps [firebase-tools](https://github.com/firebase/firebase-tools) from 9.2.2 to 9.3.0.
- [Release notes](https://github.com/firebase/firebase-tools/releases)
- [Changelog](https://github.com/firebase/firebase-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/firebase/firebase-tools/compare/v9.2.2...v9.3.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:42:02 +02:00
8b56346011 chore(deps-dev): bump lint-staged from 10.5.3 to 10.5.4 (#2976)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.5.3 to 10.5.4.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.5.3...v10.5.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-02-07 09:41:52 +02:00
e63a0ec5be feat: allow host to pass color for collaborators (#2943)
* feat: allow host to pass color for collaborators

* remove user prop as its not used anywhere

* update changelog and readme

* add pr link
2021-02-06 23:33:52 +05:30
76 changed files with 4773 additions and 3127 deletions

View File

@ -2,6 +2,7 @@
"extends": ["prettier", "react-app"],
"plugins": ["prettier"],
"rules": {
"@typescript-eslint/no-unused-vars": "warn",
"curly": "warn",
"dot-notation": "warn",
"import/no-anonymous-default-export": "off",
@ -22,7 +23,6 @@
],
"no-unneeded-ternary": "warn",
"no-unused-expressions": "warn",
"no-unused-vars": "warn",
"no-useless-return": "warn",
"no-var": "warn",
"object-shorthand": "warn",

View File

@ -19,7 +19,7 @@
### Option 2 - CodeSandbox
1. Go to https://codesandbox.io/s/github/excalidraw/excalidraw
1. Connect your Github account
1. Connect your GitHub account
1. Go to Git tab on left side
1. Tap on `Fork Sandbox`
1. Write your code
@ -35,7 +35,6 @@ Make sure the title starts with a semantic prefix:
- **feat**: A new feature
- **fix**: A bug fix
- **improvement**: An improvement to a current feature
- **docs**: Documentation only changes
- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- **refactor**: A code change that neither fixes a bug nor adds a feature

View File

@ -2,7 +2,7 @@
<a href="https://excalidraw.com">
<img width="540" src="./public/og-image-sm.png" alt="Excalidraw logo: Sketch handrawn like diagrams." />
</a>
<h3>Virtual whiteboard for sketching hand-drawn like diagrams.<br>Collaborative and end to end encrypted.</h3>
<h3>Virtual whiteboard for sketching hand-drawn like diagrams.<br>Collaborative and end-to-end encrypted.</h3>
<p>
<a href="https://twitter.com/Excalidraw">
<img alt="Follow Excalidraw on Twitter" src="https://img.shields.io/twitter/follow/excalidraw.svg?label=follow+excalidraw&style=social&logo=twitter">
@ -20,11 +20,11 @@ Go to [excalidraw.com](https://excalidraw.com) to start sketching.
Read the latest news and updates on our [blog](https://blog.excalidraw.com). A good start is to see all the updates of [One Year of Excalidraw](https://blog.excalidraw.com/one-year-of-excalidraw/).
## We accept donations
## Supporting Excalidraw
If you like the project, you can become a sponsor at [Open Collective](https://opencollective.com/excalidraw).
<a href="https://opencollective.com/excalidraw#category-CONTRIBUTE" target="_blank"><img src="https://opencollective.com/excalidraw/tiers/sponsors.svg?avatarHeight=64"/></a>
[<img src="https://opencollective.com/excalidraw/tiers/sponsors/0/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/0/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/1/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/1/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/2/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/2/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/3/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/3/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/4/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/4/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/5/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/5/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/6/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/6/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/7/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/7/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/8/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/8/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/9/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/9/website) [<img src="https://opencollective.com/excalidraw/tiers/sponsors/10/avatar.svg?avatarHeight=120">](https://opencollective.com/excalidraw/tiers/sponsors/10/website)
<a href="https://opencollective.com/excalidraw#category-CONTRIBUTE" target="_blank"><img src="https://opencollective.com/excalidraw/tiers/backers.svg?avatarHeight=32"/></a>
@ -50,7 +50,7 @@ Translations will be available on the app if they exceed a certain threshold of
### Create a collaboration session manually
In order to create a session manually you just need to generate a link of this form:
In order to create a session manually, you just need to generate a link of this form:
```
https://excalidraw.com/#room=[0-9a-f]{20},[a-zA-Z0-9_-]{22}
@ -70,12 +70,16 @@ The second set of digits is the encryption key. The Excalidraw server doesnt
Find a growing list of libraries containing assets for your drawings at [libraries.excalidraw.com](https://libraries.excalidraw.com).
## Developement
## Embedding Excalidraw in your App?
Try out [`@excalidraw/excalidraw`](https://www.npmjs.com/package/@excalidraw/excalidraw). This package allows you to easily embed Excalidraw as a React component into your apps.
## Development
### Code Sandbox
- Go to https://codesandbox.io/s/github/excalidraw/excalidraw
- You may need to sign in with Github and reload the page
- You may need to sign in with GitHub and reload the page
- You can start coding instantly, and even send PRs from there!
### Local Installation
@ -101,15 +105,15 @@ git clone https://github.com/excalidraw/excalidraw.git
#### Docker Compose
You can use docker-compose to work on excalidraw locally if you don't want to setup a Node.js env.
You can use docker-compose to work on Excalidraw locally if you don't want to setup a Node.js env.
```sh
docker-compose up --build -d
```
### Self hosting
### Self-hosting
We publish a Docker image with the Excalidraw client at [excalidraw/excalidraw](https://hub.docker.com/r/excalidraw/excalidraw). You can use it to self host your own client under your own domain, on Kubernetes, AWS ECS, etc.
We publish a Docker image with the Excalidraw client at [excalidraw/excalidraw](https://hub.docker.com/r/excalidraw/excalidraw). You can use it to self-host your own client under your own domain, on Kubernetes, AWS ECS, etc.
```sh
docker build -t excalidraw/excalidraw .
@ -120,7 +124,7 @@ The Docker image is free of analytics and other tracking libraries.
**At the moment, self-hosting your own instance doesn't support sharing or collaboration features.**
We are working towards providing a full-fledged solution for self hosting your own Excalidraw.
We are working towards providing a full-fledged solution for self-hosting your own Excalidraw.
## Contributing

3010
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -19,17 +19,17 @@
]
},
"dependencies": {
"@sentry/browser": "6.0.3",
"@sentry/integrations": "6.0.3",
"@sentry/browser": "6.1.0",
"@sentry/integrations": "6.1.0",
"@testing-library/jest-dom": "5.11.9",
"@testing-library/react": "11.2.3",
"@testing-library/react": "11.2.5",
"@types/jest": "26.0.20",
"@types/react": "17.0.0",
"@types/react-dom": "17.0.0",
"@types/react": "17.0.2",
"@types/react-dom": "17.0.1",
"@types/socket.io-client": "1.4.35",
"browser-fs-access": "0.13.0",
"browser-fs-access": "0.13.1",
"clsx": "1.1.1",
"firebase": "8.2.5",
"firebase": "8.2.7",
"i18next-browser-languagedetector": "6.0.1",
"lodash.throttle": "4.1.1",
"nanoid": "3.1.20",
@ -43,20 +43,21 @@
"pwacompat": "2.0.17",
"react": "17.0.1",
"react-dom": "17.0.1",
"react-scripts": "4.0.1",
"react-scripts": "4.0.2",
"roughjs": "4.3.1",
"socket.io-client": "2.3.1",
"typescript": "4.1.3"
"typescript": "4.1.5"
},
"devDependencies": {
"@types/lodash.throttle": "4.1.6",
"@types/pako": "1.0.1",
"@types/resize-observer-browser": "0.1.5",
"eslint-config-prettier": "7.2.0",
"eslint-plugin-prettier": "3.3.1",
"firebase-tools": "9.2.2",
"firebase-tools": "9.3.0",
"husky": "4.3.8",
"jest-canvas-mock": "2.3.0",
"lint-staged": "10.5.3",
"jest-canvas-mock": "2.3.1",
"lint-staged": "10.5.4",
"pepjs": "0.5.3",
"prettier": "2.2.1",
"rewire": "5.0.0"

View File

@ -96,9 +96,24 @@ export const actionChangeShouldAddWatermark = register({
export const actionSaveScene = register({
name: "saveScene",
perform: async (elements, appState, value) => {
const fileHandleExists = !!appState.fileHandle;
try {
const { fileHandle } = await saveAsJSON(elements, appState);
return { commitToHistory: false, appState: { ...appState, fileHandle } };
return {
commitToHistory: false,
appState: {
...appState,
fileHandle,
toastMessage: fileHandleExists
? fileHandle.name
? t("toast.fileSavedToFilename").replace(
"{filename}",
`"${fileHandle.name}"`,
)
: t("toast.fileSaved")
: null,
},
};
} catch (error) {
if (error?.name !== "AbortError") {
console.error(error);

View File

@ -83,7 +83,7 @@ export const actionFinalize = register({
// If the multi point line closes the loop,
// set the last point to first point.
// This ensures that loop remains closed at different scales.
const isLoop = isPathALoop(multiPointElement.points);
const isLoop = isPathALoop(multiPointElement.points, appState.zoom.value);
if (
multiPointElement.type === "line" ||
multiPointElement.type === "draw"

View File

@ -42,7 +42,7 @@ export const actionGoToCollaborator = register({
return null;
}
const { background, stroke } = getClientColors(clientId);
const { background, stroke } = getClientColors(clientId, appState);
const shortName = getClientInitials(collaborator.username);
return (

View File

@ -8,6 +8,7 @@ import {
} from "./types";
import { ExcalidrawElement } from "../element/types";
import { AppState, ExcalidrawProps } from "../types";
import { MODES } from "../constants";
// This is the <App> component, but for now we don't care about anything but its
// `canvas` state.
@ -68,7 +69,7 @@ export class ActionManager implements ActionsManagerInterface {
}
const { viewModeEnabled } = this.getAppState();
if (viewModeEnabled) {
if (data[0].name !== "viewMode") {
if (!Object.values(MODES).includes(data[0].name)) {
return false;
}
}

View File

@ -1,6 +1,13 @@
import colors from "./colors";
import { AppState } from "./types";
export const getClientColors = (clientId: string) => {
export const getClientColors = (clientId: string, appState: AppState) => {
if (appState?.collaborators) {
const currentUser = appState.collaborators.get(clientId);
if (currentUser?.color) {
return currentUser.color;
}
}
// Naive way of getting an integer out of the clientId
const sum = clientId.split("").reduce((a, str) => a + str.charCodeAt(0), 0);

View File

@ -4,7 +4,6 @@ import { RoughCanvas } from "roughjs/bin/canvas";
import rough from "roughjs/bin/rough";
import clsx from "clsx";
import "../actions";
import {
actionAddToLibrary,
actionBringForward,
@ -52,6 +51,7 @@ import {
LINE_CONFIRM_THRESHOLD,
MIME_TYPES,
POINTER_BUTTON,
SCROLL_TIMEOUT,
TAP_TWICE_TIMEOUT,
TEXT_TO_CENTER_SNAP_THRESHOLD,
TOUCH_CTX_MENU_TIMEOUT,
@ -826,6 +826,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
document.addEventListener(EVENT.PASTE, this.pasteFromClipboard);
document.addEventListener(EVENT.CUT, this.onCut);
document.addEventListener(EVENT.SCROLL, this.onScroll);
window.addEventListener(EVENT.RESIZE, this.onResize, false);
window.addEventListener(EVENT.UNLOAD, this.onUnload, false);
@ -999,6 +1000,10 @@ class App extends React.Component<ExcalidrawProps, AppState> {
}
}
private onScroll = debounce(() => {
this.setState({ ...this.getCanvasOffsets() });
}, SCROLL_TIMEOUT);
// Copy/paste
private onCut = withBatchedUpdates((event: ClipboardEvent) => {
@ -1551,6 +1556,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
textWysiwyg({
id: element.id,
appState: this.state,
canvas: this.canvas,
getViewportCoords: (x, y) => {
const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(
{
@ -1957,7 +1963,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
points: points.slice(0, -1),
});
} else {
if (isPathALoop(points)) {
if (isPathALoop(points, this.state.zoom.value)) {
document.documentElement.style.cursor = CURSOR_TYPE.POINTER;
}
// update last uncommitted point
@ -2629,7 +2635,10 @@ class App extends React.Component<ExcalidrawProps, AppState> {
const { multiElement } = this.state;
// finalize if completing a loop
if (multiElement.type === "line" && isPathALoop(multiElement.points)) {
if (
multiElement.type === "line" &&
isPathALoop(multiElement.points, this.state.zoom.value)
) {
mutateElement(multiElement, {
lastCommittedPoint:
multiElement.points[multiElement.points.length - 1],
@ -3700,15 +3709,16 @@ class App extends React.Component<ExcalidrawProps, AppState> {
options.push(actionCopyAsSvg);
}
if (!element) {
const viewModeOptions: ContextMenuOption[] = [
const viewModeOptions = [
...options,
typeof this.props.gridModeEnabled === "undefined" &&
actionToggleGridMode,
typeof this.props.zenModeEnabled === "undefined" && actionToggleZenMode,
typeof this.props.viewModeEnabled === "undefined" &&
actionToggleViewMode,
actionToggleStats,
];
if (typeof this.props.viewModeEnabled === "undefined") {
viewModeOptions.push(actionToggleViewMode);
}
ContextMenu.push({
options: viewModeOptions,
top: clientY,

View File

@ -4,7 +4,8 @@
.CollabButton.is-collaborating {
background-color: var(--button-special-active-background-color);
.ToolIcon__icon svg {
.ToolIcon__icon svg,
.ToolIcon__label {
color: var(--icon-green-fill-color);
}
}

View File

@ -25,8 +25,8 @@ const CollabButton = ({
onClick={onClick}
icon={users}
type="button"
title={t("buttons.roomDialog")}
aria-label={t("buttons.roomDialog")}
title={t("labels.liveCollaboration")}
aria-label={t("labels.liveCollaboration")}
showAriaLabel={useIsMobile()}
>
{collaboratorCount > 0 && (

View File

@ -1,12 +1,7 @@
import React from "react";
import { LoadingMessage } from "./LoadingMessage";
import {
defaultLang,
Language,
languages,
setLanguageFirstTime,
} from "../i18n";
import { defaultLang, Language, languages, setLanguage } from "../i18n";
interface Props {
langCode: Language["code"];
@ -23,7 +18,7 @@ export class InitializeApp extends React.Component<Props, State> {
const currentLang =
languages.find((lang) => lang.code === this.props.langCode) ||
defaultLang;
await setLanguageFirstTime(currentLang);
await setLanguage(currentLang);
this.setState({
isLoading: false,
});

View File

@ -19,9 +19,9 @@
}
a {
margin-left: auto;
margin-inline-start: auto;
// 17px for scrollbar (needed for overlay scrollbars on Big Sur?) + 1px extra
padding-right: 18px;
padding-inline-end: 18px;
white-space: nowrap;
}
}

View File

@ -27,7 +27,7 @@ import { ExportCB, ExportDialog } from "./ExportDialog";
import { FixedSideContainer } from "./FixedSideContainer";
import { GitHubCorner } from "./GitHubCorner";
import { HintViewer } from "./HintViewer";
import { exportFile, load, shield } from "./icons";
import { exportFile, load, shield, trash } from "./icons";
import { Island } from "./Island";
import "./LayerUI.scss";
import { LibraryUnit } from "./LibraryUnit";
@ -100,6 +100,7 @@ const LibraryMenuItems = ({
onInsertShape,
pendingElements,
setAppState,
setLibraryItems,
}: {
library: LibraryItems;
pendingElements: LibraryItem;
@ -107,6 +108,7 @@ const LibraryMenuItems = ({
onInsertShape: (elements: LibraryItem) => void;
onAddToLibrary: (elements: LibraryItem) => void;
setAppState: React.Component<any, AppState>["setState"];
setLibraryItems: (library: LibraryItems) => void;
}) => {
const isMobile = useIsMobile();
const numCells = library.length + (pendingElements.length > 0 ? 1 : 0);
@ -150,6 +152,19 @@ const LibraryMenuItems = ({
});
}}
/>
<ToolButton
key="reset"
type="button"
title={t("buttons.resetLibrary")}
aria-label={t("buttons.resetLibrary")}
icon={trash}
onClick={() => {
if (window.confirm(t("alerts.resetLibrary"))) {
Library.resetLibrary();
setLibraryItems([]);
}
}}
/>
<a href="https://libraries.excalidraw.com" target="_excalidraw_libraries">
{t("labels.libraries")}
@ -281,6 +296,7 @@ const LibraryMenu = ({
onInsertShape={onInsertShape}
pendingElements={pendingElements}
setAppState={setAppState}
setLibraryItems={setLibraryItems}
/>
)}
</Island>
@ -426,7 +442,15 @@ const LayerUI = ({
"transition-left": zenModeEnabled,
})}
>
<Island className={CLASSES.SHAPE_ACTIONS_MENU} padding={2}>
<Island
className={CLASSES.SHAPE_ACTIONS_MENU}
padding={2}
style={{
// we want to make sure this doesn't overflow so substracting 200
// which is approximately height of zoom footer and top left menu items with some buffer
maxHeight: `${appState.height - 200}px`,
}}
>
<SelectedShapeActions
appState={appState}
elements={elements}
@ -587,18 +611,6 @@ const LayerUI = ({
>
{t("buttons.exitZenMode")}
</button>
{appState.scrolledOutside && (
<button
className="scroll-back-to-content"
onClick={() => {
setAppState({
...calculateScrollCenter(elements, appState, canvas),
});
}}
>
{t("buttons.scrollBackToContent")}
</button>
)}
</footer>
);
@ -661,6 +673,18 @@ const LayerUI = ({
{renderBottomAppMenu()}
{renderGitHubCorner()}
{renderFooter()}
{appState.scrolledOutside && (
<button
className="scroll-back-to-content"
onClick={() => {
setAppState({
...calculateScrollCenter(elements, appState, canvas),
});
}}
>
{t("buttons.scrollBackToContent")}
</button>
)}
</div>
);
};

View File

@ -1,8 +1,13 @@
@import "../css/variables.module";
.excalidraw {
&.excalidraw-modal-container {
position: absolute;
z-index: 10;
}
.Modal {
position: fixed;
position: absolute;
top: 0;
left: 0;
right: 0;
@ -15,7 +20,7 @@
}
.Modal__background {
position: fixed;
position: absolute;
top: 0;
left: 0;
right: 0;
@ -82,7 +87,7 @@
}
.Modal__content {
position: fixed;
position: absolute;
top: 0;
left: 0;
right: 0;

View File

@ -54,7 +54,7 @@ const useBodyRoot = () => {
?.classList.contains("Appearance_dark");
const div = document.createElement("div");
div.classList.add("excalidraw");
div.classList.add("excalidraw", "excalidraw-modal-container");
if (isDarkTheme) {
div.classList.add("Appearance_dark");

View File

@ -1,14 +1,6 @@
.excalidraw {
.popover {
position: absolute;
position: fixed;
z-index: 10;
}
.popover .cover {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}

View File

@ -1,7 +1,7 @@
@import "../css/variables.module";
.Stats {
position: fixed;
position: absolute;
top: 64px;
right: 12px;
font-size: 12px;

View File

@ -11,7 +11,7 @@
left: 50%;
margin-left: -150px;
padding: 4px 0;
position: fixed;
position: absolute;
text-align: center;
width: 300px;
z-index: 999999;

View File

@ -2,8 +2,8 @@ import { FontFamily } from "./element/types";
export const APP_NAME = "Excalidraw";
export const DRAGGING_THRESHOLD = 10; // 10px
export const LINE_CONFIRM_THRESHOLD = 10; // 10px
export const DRAGGING_THRESHOLD = 10; // px
export const LINE_CONFIRM_THRESHOLD = 8; // px
export const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;
export const ELEMENT_TRANSLATE_AMOUNT = 1;
export const TEXT_TO_CENTER_SNAP_THRESHOLD = 30;
@ -47,6 +47,7 @@ export enum EVENT {
TOUCH_END = "touchend",
HASHCHANGE = "hashchange",
VISIBILITY_CHANGE = "visibilitychange",
SCROLL = "scroll",
}
export const ENV = {
@ -92,6 +93,7 @@ export const TOUCH_CTX_MENU_TIMEOUT = 500;
export const TITLE_TIMEOUT = 10000;
export const TOAST_TIMEOUT = 5000;
export const VERSION_TIMEOUT = 30000;
export const SCROLL_TIMEOUT = 500;
export const ZOOM_STEP = 0.1;
@ -99,3 +101,9 @@ export const ZOOM_STEP = 0.1;
export const IDLE_THRESHOLD = 60_000;
// Report a user active each ACTIVE_THRESHOLD milliseconds
export const ACTIVE_THRESHOLD = 3_000;
export const MODES = {
VIEW: "viewMode",
ZEN: "zenMode",
GRID: "gridMode",
};

View File

@ -10,7 +10,6 @@
.excalidraw {
color: var(--text-color-primary);
display: flex;
position: fixed;
top: 0;
bottom: 0;
left: 0;
@ -362,7 +361,6 @@
.App-menu__left {
overflow-y: auto;
max-height: calc(100vh - 236px);
}
.dropdown-select {
@ -434,7 +432,7 @@
.scroll-back-to-content {
color: var(--popup-text-color);
position: fixed;
position: absolute;
left: 50%;
bottom: 30px;
transform: translateX(-50%);

View File

@ -129,7 +129,7 @@ export class LinearElementEditor {
isDragging &&
(activePointIndex === 0 || activePointIndex === element.points.length - 1)
) {
if (isPathALoop(element.points)) {
if (isPathALoop(element.points, appState.zoom.value)) {
LinearElementEditor.movePoint(
element,
activePointIndex,

View File

@ -38,6 +38,7 @@ export const textWysiwyg = ({
onSubmit,
getViewportCoords,
element,
canvas,
}: {
id: ExcalidrawElement["id"];
appState: AppState;
@ -45,6 +46,7 @@ export const textWysiwyg = ({
onSubmit: (text: string) => void;
getViewportCoords: (x: number, y: number) => [number, number];
element: ExcalidrawElement;
canvas: HTMLCanvasElement | null;
}) => {
const updateWysiwygStyle = () => {
const updatedElement = Scene.getScene(element)?.getElement(id);
@ -151,6 +153,10 @@ export const textWysiwyg = ({
editable.oninput = null;
editable.onkeydown = null;
if (observer) {
observer.disconnect();
}
window.removeEventListener("resize", updateWysiwygStyle);
window.removeEventListener("wheel", stopEvent, true);
window.removeEventListener("pointerdown", onPointerDown);
@ -197,9 +203,19 @@ export const textWysiwyg = ({
let isDestroyed = false;
editable.onblur = handleSubmit;
// reposition wysiwyg in case of window resize. Happens on mobile when
// device keyboard is opened.
window.addEventListener("resize", updateWysiwygStyle);
// reposition wysiwyg in case of canvas is resized. Using ResizeObserver
// is preferred so we catch changes from host, where window may not resize.
let observer: ResizeObserver | null = null;
if (canvas && "ResizeObserver" in window) {
observer = new window.ResizeObserver(() => {
updateWysiwygStyle();
});
observer.observe(canvas);
} else {
window.addEventListener("resize", updateWysiwygStyle);
}
window.addEventListener("pointerdown", onPointerDown);
window.addEventListener("wheel", stopEvent, {
passive: false,

View File

@ -32,6 +32,16 @@
display: flex;
align-items: center;
justify-content: center;
@media #{$is-mobile-query} {
flex-direction: column;
align-items: stretch;
}
}
@media #{$is-mobile-query} {
.RoomDialog-usernameLabel {
font-weight: bold;
}
}
.RoomDialog-username {
@ -41,6 +51,10 @@
min-width: 0;
flex: 1 1 auto;
margin-inline-start: 1em;
@media #{$is-mobile-query} {
margin-top: 0.5em;
margin-inline-start: 0;
}
height: 2.5rem;
font-size: 1em;
line-height: 1.5;

View File

@ -119,7 +119,11 @@ const RoomDialog = ({
);
};
return (
<Dialog small onCloseRequest={handleClose} title={t("labels.createRoom")}>
<Dialog
small
onCloseRequest={handleClose}
title={t("labels.liveCollaboration")}
>
{renderRoomDialog()}
</Dialog>
);

View File

@ -281,7 +281,6 @@ function ExcalidrawWrapper() {
width={dimensions.width}
height={dimensions.height}
initialData={initialStatePromiseRef.current.promise}
user={{ name: collabAPI?.username }}
onCollabButtonClick={collabAPI?.onCollabButtonClick}
isCollaborating={collabAPI?.isCollaborating()}
onPointerUpdate={collabAPI?.onPointerUpdate}

View File

@ -1,5 +1,6 @@
import fallbackLangData from "./locales/en.json";
import percentages from "./locales/percentages.json";
import { ENV } from "./constants";
const COMPLETION_THRESHOLD = 85;
@ -55,25 +56,33 @@ export const languages: Language[] = allLanguages
COMPLETION_THRESHOLD,
);
const TEST_LANG_CODE = "__test__";
if (process.env.NODE_ENV === ENV.DEVELOPMENT) {
languages.unshift(
{ code: TEST_LANG_CODE, label: "test language" },
{
code: `${TEST_LANG_CODE}.rtl`,
label: "\u{202a}test language (rtl)\u{202c}",
rtl: true,
},
);
}
let currentLang: Language = defaultLang;
let currentLangData = {};
export const setLanguage = async (lang: Language) => {
currentLang = lang;
document.documentElement.dir = currentLang.rtl ? "rtl" : "ltr";
document.documentElement.lang = currentLang.code;
currentLangData = await import(
/* webpackChunkName: "i18n-[request]" */ `./locales/${currentLang.code}.json`
);
};
export const setLanguageFirstTime = async (lang: Language) => {
currentLang = lang;
document.documentElement.dir = currentLang.rtl ? "rtl" : "ltr";
currentLangData = await import(
/* webpackChunkName: "i18n-[request]" */ `./locales/${currentLang.code}.json`
);
if (lang.code.startsWith(TEST_LANG_CODE)) {
currentLangData = {};
} else {
currentLangData = await import(
/* webpackChunkName: "i18n-[request]" */ `./locales/${currentLang.code}.json`
);
}
};
export const getLanguage = () => currentLang;
@ -93,6 +102,13 @@ const findPartsForData = (data: any, parts: string[]) => {
};
export const t = (path: string, replacement?: { [key: string]: string }) => {
if (currentLang.code.startsWith(TEST_LANG_CODE)) {
const name = replacement
? `${path}(${JSON.stringify(replacement).slice(1, -1)})`
: path;
return `\u{202a}[[${name}]]\u{202c}`;
}
const parts = path.split(".");
let translation =
findPartsForData(currentLangData, parts) ||

View File

@ -68,7 +68,7 @@
"layers": "الطبقات",
"actions": "الإجراءات",
"language": "اللغة",
"createRoom": "مشاركة الجلسة مباشرة",
"liveCollaboration": "",
"duplicateSelection": "تكرار",
"untitled": "غير معنون",
"name": "الاسم",
@ -77,7 +77,7 @@
"group": "تحديد مجموعة",
"ungroup": "إلغاء تحديد مجموعة",
"collaborators": "المتعاونون",
"gridMode": "وضع الشبكة",
"showGrid": "",
"addToLibrary": "أضف إلى المكتبة",
"removeFromLibrary": "حذف من المكتبة",
"libraryLoadingMessage": "جارٍ تحميل المكتبة…",
@ -117,7 +117,7 @@
"edit": "تعديل",
"undo": "تراجع",
"redo": "إعادة تنفيذ",
"roomDialog": "بدء المشاركة الحية",
"resetLibrary": "",
"createNewRoom": "إنشاء غرفة جديدة",
"fullScreen": "شاشة كاملة",
"darkMode": "الوضع المظلم",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "حصل خطأ أثناء تحميل مكتبة الطرف الثالث.",
"confirmAddLibrary": "هذا سيضيف {{numShapes}} شكل إلى مكتبتك. هل أنت متأكد؟",
"imageDoesNotContainScene": "استيراد الصور غير مدعوم في الوقت الراهن.\n\nهل تريد استيراد مشهد؟ لا يبدو أن هذه الصورة تحتوي على أي بيانات مشهد. هل قمت بسماح هذا أثناء التصدير؟",
"cannotRestoreFromImage": "تعذر استعادة المشهد من ملف الصورة"
"cannotRestoreFromImage": "تعذر استعادة المشهد من ملف الصورة",
"resetLibrary": ""
},
"toolBar": {
"selection": "تحديد",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -8,11 +8,11 @@
"cut": "Изрежи",
"copy": "Копирай",
"copyAsPng": "Копиране в клипборда",
"copyAsSvg": "Копиране в клипборда",
"bringForward": "Преместване на~пред",
"copyAsSvg": "Копирано в клипборда като SVG",
"bringForward": "Преместване напред",
"sendToBack": "Изнасяне назад",
"bringToFront": "~Изнасяне отпред",
"sendBackward": "Изпрати назад",
"bringToFront": "Изнасяне отпред",
"sendBackward": "Изпрати отзад",
"delete": "Изтрий",
"copyStyles": "Копирайте стилове",
"pasteStyles": "Постави стилове",
@ -68,7 +68,7 @@
"layers": "Слоеве",
"actions": "Действия",
"language": "Език",
"createRoom": "Споделете сесия за сътрудничество на живо",
"liveCollaboration": "",
"duplicateSelection": "Дублирай",
"untitled": "Неозаглавено",
"name": "Име",
@ -77,7 +77,7 @@
"group": "Групирай селекцията",
"ungroup": "Спри групирането на селекцията",
"collaborators": "Сътрудници",
"gridMode": "Решетъчен режим",
"showGrid": "Показване на мрежа",
"addToLibrary": "Добавяне към библиотеката",
"removeFromLibrary": "Премахване от библиотеката",
"libraryLoadingMessage": "Зареждане на библиотеката…",
@ -92,7 +92,7 @@
"centerHorizontally": "Центрирай хоризонтално",
"distributeHorizontally": "Разпредели хоризонтално",
"distributeVertically": "Разпредели вертикално",
"viewMode": ""
"viewMode": "Изглед"
},
"buttons": {
"clearReset": "Нулиране на платно",
@ -117,7 +117,7 @@
"edit": "Редактиране",
"undo": "Отмяна",
"redo": "Повтори",
"roomDialog": "Започнете сътрудничество на живо",
"resetLibrary": "",
"createNewRoom": "Създай нова стая",
"fullScreen": "На цял екран",
"darkMode": "Тъмен режим",
@ -136,11 +136,12 @@
"decryptFailed": "Данните не можаха да се дешифрират.",
"uploadedSecurly": "Качването е защитено с криптиране от край до край, което означава, че сървърът Excalidraw и трети страни не могат да четат съдържанието.",
"loadSceneOverridePrompt": "Зареждането на външна рисунка ще презапише настоящото ви съдържание. Желаете ли да продължите?",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "Прекратяването на сесията ще презапише предишната, локално запазена, рисунка. Сигурни ли сте?\n\n(Ако искате да продължите с локалната рисунка, просто затворете таба на браузъра.)",
"errorLoadingLibrary": "Възникна грешка при зареждането на външна библиотека.",
"confirmAddLibrary": "Ще се добавят {{numShapes}} фигура(и) във вашата библиотека. Сигурни ли сте?",
"imageDoesNotContainScene": "Импортирането на картинки не се поддържва в момента.\n\nИскате да импортнете сцена? Тази картинка не съдържа данни от сцена. Разрешили ли сте последното при експортирането?",
"cannotRestoreFromImage": "Не може да бъде възстановена сцена от този файл"
"cannotRestoreFromImage": "Не може да бъде възстановена сцена от този файл",
"resetLibrary": ""
},
"toolBar": {
"selection": "Селекция",
@ -202,24 +203,24 @@
"title": "Грешка"
},
"helpDialog": {
"blog": "",
"blog": "Прочетете нашия блог",
"click": "клик",
"curvedArrow": "",
"curvedLine": "",
"documentation": "",
"curvedArrow": "Извита стрелка",
"curvedLine": "Извита линия",
"documentation": "Документация",
"drag": "плъзнете",
"editor": "Редактор",
"github": "",
"howto": "",
"github": "Намерихте проблем? Изпратете",
"howto": "Следвайте нашите ръководства",
"or": "или",
"preventBinding": "",
"preventBinding": "Спри прилепяне на стрелките",
"shapes": "Фигури",
"shortcuts": "Клавиши за бърз достъп",
"textFinish": "",
"textNewLine": "",
"title": "",
"textFinish": "Завършете редактирането (текст)",
"textNewLine": "Добавяне на нов ред (текст)",
"title": "Помощ",
"view": "Преглед",
"zoomToFit": "",
"zoomToFit": "Приближи докато се виждат всички елементи",
"zoomToSelection": "Приближи селекцията"
},
"encrypted": {
@ -235,14 +236,16 @@
"storage": "Съхранение на данни",
"title": "Статистика за хакери",
"total": "Общо",
"version": "",
"versionCopy": "",
"versionNotAvailable": "",
"version": "Версия",
"versionCopy": "Настисни за да копираш",
"versionNotAvailable": "Версията не е налична",
"width": "Широчина"
},
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyStyles": "Копирани стилове.",
"copyToClipboard": "Копирано в клипборда.",
"copyToClipboardAsPng": "Копирано в клипборда като PNG.",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Capes",
"actions": "Accions",
"language": "Llengua",
"createRoom": "Compartir una sessió de col·laboració en directe",
"liveCollaboration": "",
"duplicateSelection": "Duplicar",
"untitled": "Sense títol",
"name": "Nom",
@ -77,7 +77,7 @@
"group": "Agrupar la selecció",
"ungroup": "Desagrupar la selecció",
"collaborators": "Col·laboradors",
"gridMode": "Mode quadrícula",
"showGrid": "",
"addToLibrary": "Afegir a la biblioteca",
"removeFromLibrary": "Eliminar de la biblioteca",
"libraryLoadingMessage": "Carregant la biblioteca…",
@ -117,7 +117,7 @@
"edit": "Editar",
"undo": "Desfer",
"redo": "Refer",
"roomDialog": "Començar col·laboració en directe",
"resetLibrary": "",
"createNewRoom": "Crear sala nova",
"fullScreen": "Pantalla completa",
"darkMode": "Mode fosc",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "S'ha produït un error en carregar la biblioteca de tercers.",
"confirmAddLibrary": "Això afegirà {{numShapes}} forma(es) a la vostra biblioteca. Estàs segur?",
"imageDoesNotContainScene": "En aquest moment no sadmet la importació dimatges.\n\nVolies importar una escena? Sembla que aquesta imatge no conté cap dada descena. Ho has activat durant l'exportació?",
"cannotRestoreFromImage": "Lescena no sha pogut restaurar des daquest fitxer dimatge"
"cannotRestoreFromImage": "Lescena no sha pogut restaurar des daquest fitxer dimatge",
"resetLibrary": ""
},
"toolBar": {
"selection": "Selecció",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Ebenen",
"actions": "Aktionen",
"language": "Sprache",
"createRoom": "Live-Kollaborationssitzung teilen",
"liveCollaboration": "Live-Zusammenarbeit",
"duplicateSelection": "Duplizieren",
"untitled": "Unbenannt",
"name": "Name",
@ -76,8 +76,8 @@
"madeWithExcalidraw": "Made with Excalidraw",
"group": "Auswahl gruppieren",
"ungroup": "Gruppierung aufheben",
"collaborators": "Mitarbeitende",
"gridMode": "Rastermodus",
"collaborators": "Kollaboratoren",
"showGrid": "Raster anzeigen",
"addToLibrary": "Zur Bibliothek hinzufügen",
"removeFromLibrary": "Aus Bibliothek entfernen",
"libraryLoadingMessage": "Lade Bibliothek…",
@ -101,7 +101,7 @@
"exportToSvg": "Als SVG exportieren",
"copyToClipboard": "In Zwischenablage kopieren",
"copyPngToClipboard": "PNG in die Zwischenablage kopieren",
"scale": "Skalieren",
"scale": "Skalierung",
"save": "Speichern",
"saveAs": "Speichern unter",
"load": "Laden",
@ -117,7 +117,7 @@
"edit": "Bearbeiten",
"undo": "Rückgängig machen",
"redo": "Wiederholen",
"roomDialog": "Live-Kollaborationssitzung starten",
"resetLibrary": "Bibliothek zurücksetzen",
"createNewRoom": "Neuen Raum erstellen",
"fullScreen": "Vollbildanzeige",
"darkMode": "Dunkles Design",
@ -140,7 +140,8 @@
"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": "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"
"cannotRestoreFromImage": "Die Zeichnung konnte aus dieser Bilddatei nicht wiederhergestellt werden",
"resetLibrary": "Dieses löscht deine Bibliothek. Bist du sicher?"
},
"toolBar": {
"selection": "Auswahl",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Formatierung kopiert.",
"copyToClipboard": "In die Zwischenablage kopiert.",
"copyToClipboardAsPng": "In die Zwischenablage als PNG kopiert."
"copyToClipboardAsPng": "In die Zwischenablage als PNG kopiert.",
"fileSaved": "Datei gespeichert.",
"fileSavedToFilename": "Als {filename} gespeichert"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Στρώματα",
"actions": "Ενέργειες",
"language": "Γλώσσα",
"createRoom": "Έναρξη ζωντανής συνεδρίας",
"liveCollaboration": "Ζωντανή συνεργασία",
"duplicateSelection": "Δημιουργία αντιγράφου",
"untitled": "Χωρίς τίτλο",
"name": "Όνομα",
@ -77,7 +77,7 @@
"group": "Δημιουργία ομάδας από επιλογή",
"ungroup": "Κατάργηση ομάδας από επιλογή",
"collaborators": "Συνεργάτες",
"gridMode": "Εμφάνιση σε πλέγμα",
"showGrid": "Προβολή πλέγματος",
"addToLibrary": "Προσθήκη στη βιβλιοθήκη",
"removeFromLibrary": "Αφαίρεση από τη βιβλιοθήκη",
"libraryLoadingMessage": "Φόρτωση βιβλιοθήκης…",
@ -117,13 +117,13 @@
"edit": "Επεξεργασία",
"undo": "Αναίρεση",
"redo": "Επαναφορά",
"roomDialog": "Έναρξη ζωντανής συνεργασίας",
"resetLibrary": "Καθαρισμός βιβλιοθήκης",
"createNewRoom": "Δημιουργία νέου χώρου",
"fullScreen": "Πλήρης οθόνη",
"darkMode": "Σκοτεινή λειτουργία",
"lightMode": "Φωτεινή λειτουργία",
"zenMode": "Λειτουργία Zεν",
"exitZenMode": "Έξοδος απο την λειτουργία Zen"
"exitZenMode": "Έξοδος από την λειτουργία Zen"
},
"alerts": {
"clearReset": "Αυτό θα σβήσει ολόκληρο τον καμβά. Είσαι σίγουρος;",
@ -136,11 +136,12 @@
"decryptFailed": "Δεν ήταν δυνατή η αποκρυπτογράφηση δεδομένων.",
"uploadedSecurly": "Η μεταφόρτωση έχει εξασφαλιστεί με κρυπτογράφηση από άκρο σε άκρο, πράγμα που σημαίνει ότι ο διακομιστής Excalidraw και τρίτα μέρη δεν μπορούν να διαβάσουν το περιεχόμενο.",
"loadSceneOverridePrompt": "Η φόρτωση εξωτερικού σχεδίου θα αντικαταστήσει το υπάρχον περιεχόμενο. Επιθυμείτε να συνεχίσετε;",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "Η διακοπή της συνεδρίας θα αντικαταστήσει το προηγούμενο, τοπικά αποθηκευμένο σχέδιο. Είστε σίγουροι?\n\n(Αν θέλετε να διατηρήσετε το τοπικό σας σχέδιο, απλά κλείστε την καρτέλα του προγράμματος περιήγησης.)",
"errorLoadingLibrary": "Υπήρξε ένα σφάλμα κατά τη φόρτωση της βιβλιοθήκης τρίτου μέρους.",
"confirmAddLibrary": "Αυτό θα προσθέσει {{numShapes}} σχήμα(τα) στη βιβιλιοθήκη σας. Είστε σίγουροι;",
"confirmAddLibrary": "Αυτό θα προσθέσει {{numShapes}} σχήμα(τα) στη βιβλιοθήκη σας. Είστε σίγουροι;",
"imageDoesNotContainScene": "Η εισαγωγή εικόνων δεν υποστηρίζεται αυτή τη στιγμή.\n\nΜήπως θέλετε να εισαγάγετε μια σκηνή; Αυτή η εικόνα δεν φαίνεται να περιέχει δεδομένα σκηνής. Έχετε ενεργοποιήσει αυτό κατά την εξαγωγή;",
"cannotRestoreFromImage": "Η σκηνή δεν ήταν δυνατό να αποκατασταθεί από αυτό το αρχείο εικόνας"
"cannotRestoreFromImage": "Η σκηνή δεν ήταν δυνατό να αποκατασταθεί από αυτό το αρχείο εικόνας",
"resetLibrary": "Αυτό θα καθαρίσει τη βιβλιοθήκη σας. Είστε σίγουροι;"
},
"toolBar": {
"selection": "Επιλογή",
@ -161,7 +162,7 @@
},
"hints": {
"linearElement": "Κάνε κλικ για να ξεκινήσεις πολλαπλά σημεία, σύρε για μια γραμμή",
"freeDraw": "Κάντε κλικ και σύρατε, απελευθερώσατε όταν έχετε τελειώσει",
"freeDraw": "Κάντε κλικ και σύρτε, απελευθερώσατε όταν έχετε τελειώσει",
"text": "Tip: μπορείτε επίσης να προσθέστε κείμενο με διπλό-κλικ οπουδήποτε με το εργαλείο επιλογών",
"linearElementMulti": "Κάνε κλικ στο τελευταίο σημείο ή πάτησε Escape ή Enter για να τελειώσεις",
"lockAngle": "Μπορείτε να περιορίσετε τη γωνία κρατώντας πατημένο το SHIFT",
@ -184,7 +185,7 @@
"clearCanvasCaveat": " Αυτό θα προκαλέσει απώλεια της δουλειάς σου ",
"trackedToSentry_pre": "Το σφάλμα με αναγνωριστικό ",
"trackedToSentry_post": " παρακολουθήθηκε στο σύστημά μας.",
"openIssueMessage_pre": "Ήμασταν πολύ προσεκτικοί για να μην συμπεριλάβουμε τις πληροφορίες της σκηνής σου στο σφάλμα. Αν η σκηνή σου δεν είναι ιδιωτική, παρακαλώ σκέψουν να ακολουθήσεις το δικό μας ",
"openIssueMessage_pre": "Ήμασταν πολύ προσεκτικοί για να μην συμπεριλάβουμε τις πληροφορίες της σκηνής σου στο σφάλμα. Αν η σκηνή σου δεν είναι ιδιωτική, παρακαλώ σκέψου να ακολουθήσεις το δικό μας ",
"openIssueMessage_button": "ανιχνευτής σφαλμάτων.",
"openIssueMessage_post": " Παρακαλώ να συμπεριλάβετε τις παρακάτω πληροφορίες, αντιγράφοντας και επικολλώντας το ζήτημα στο GitHub.",
"sceneContent": "Περιεχόμενο σκηνής:"
@ -223,7 +224,7 @@
"zoomToSelection": "Ζουμ στην επιλογή"
},
"encrypted": {
"tooltip": "Τα σχέδιά σου είναι κρυπτογραφημένα από άκρο σε άκρο, έτσι δεν θα έιναι ποτέ ορατά μέσα από τους διακομιστές του Excalidraw."
"tooltip": "Τα σχέδιά σου είναι κρυπτογραφημένα από άκρο σε άκρο, έτσι δεν θα είναι ποτέ ορατά μέσα από τους διακομιστές του Excalidraw."
},
"stats": {
"angle": "Γωνία",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Αντιγράφηκαν στυλ.",
"copyToClipboard": "Αντιγράφηκε στο πρόχειρο.",
"copyToClipboardAsPng": "Αντιγράφτηκε στο πρόχειρο ως PNG."
"copyToClipboardAsPng": "Αντιγράφτηκε στο πρόχειρο ως PNG.",
"fileSaved": "Το αρχείο αποθηκεύτηκε.",
"fileSavedToFilename": "Αποθηκεύτηκε στο {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Layers",
"actions": "Actions",
"language": "Language",
"createRoom": "Share a live-collaboration session",
"liveCollaboration": "Live collaboration",
"duplicateSelection": "Duplicate",
"untitled": "Untitled",
"name": "Name",
@ -117,7 +117,7 @@
"edit": "Edit",
"undo": "Undo",
"redo": "Redo",
"roomDialog": "Start live collaboration",
"resetLibrary": "Reset library",
"createNewRoom": "Create new room",
"fullScreen": "Full screen",
"darkMode": "Dark mode",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "There was an error loading the third party library.",
"confirmAddLibrary": "This will add {{numShapes}} shape(s) to your library. Are you sure?",
"imageDoesNotContainScene": "Importing images isn't supported at the moment.\n\nDid you want to import a scene? This image does not seem to contain any scene data. Have you enabled this during export?",
"cannotRestoreFromImage": "Scene couldn't be restored from this image file"
"cannotRestoreFromImage": "Scene couldn't be restored from this image file",
"resetLibrary": "This will clear your library. Are you sure?"
},
"toolBar": {
"selection": "Selection",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Copied styles.",
"copyToClipboard": "Copied to clipboard.",
"copyToClipboardAsPng": "Copied to clipboard as PNG."
"copyToClipboardAsPng": "Copied to clipboard as PNG.",
"fileSaved": "File saved.",
"fileSavedToFilename": "Saved to {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Capas",
"actions": "Acciones",
"language": "Idioma",
"createRoom": "Compartir una sesión de colaboración en vivo",
"liveCollaboration": "Colaboración en directo",
"duplicateSelection": "Duplicar",
"untitled": "Sin título",
"name": "Nombre",
@ -77,7 +77,7 @@
"group": "Agrupar selección",
"ungroup": "Desagrupar selección",
"collaborators": "Colaboradores",
"gridMode": "Modo cuadrícula",
"showGrid": "Mostrar cuadrícula",
"addToLibrary": "Añadir a la biblioteca",
"removeFromLibrary": "Eliminar de la biblioteca",
"libraryLoadingMessage": "Cargando librería…",
@ -117,7 +117,7 @@
"edit": "Editar",
"undo": "Deshacer",
"redo": "Rehacer",
"roomDialog": "Iniciar colaboración en vivo",
"resetLibrary": "Resetear librería",
"createNewRoom": "Crear nueva sala",
"fullScreen": "Pantalla completa",
"darkMode": "Modo oscuro",
@ -140,7 +140,8 @@
"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": "La importación de imágenes no está homologada en este momento.\n\n¿Deseas importar una escena? Esta imagen no parece contener ningún dato de escena. ¿Lo has activado durante la exportación?",
"cannotRestoreFromImage": "No se pudo restaurar la escena desde este archivo de imagen"
"cannotRestoreFromImage": "No se pudo restaurar la escena desde este archivo de imagen",
"resetLibrary": "Esto eliminará tu librería. ¿Estás seguro?"
},
"toolBar": {
"selection": "Selección",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Estilos copiados.",
"copyToClipboard": "Copiado en el portapapeles.",
"copyToClipboardAsPng": "Copiado al portapapeles como PNG."
"copyToClipboardAsPng": "Copiado al portapapeles como PNG.",
"fileSaved": "Archivo guardado.",
"fileSavedToFilename": "Guardado en {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "لایه ها",
"actions": "عملیات",
"language": "زبان",
"createRoom": "اشتراک گذاری جلسه همکاری زنده",
"liveCollaboration": "",
"duplicateSelection": "تکرار",
"untitled": "بدون عنوان",
"name": "نام",
@ -77,7 +77,7 @@
"group": "گروهبندی انتخابها",
"ungroup": "حذف گروهبندی انتخابها",
"collaborators": "همکاران",
"gridMode": "حالت شبکه ای",
"showGrid": "",
"addToLibrary": "افزودن به کتابخانه",
"removeFromLibrary": "حذف از کتابخانه",
"libraryLoadingMessage": "بارگذاری کتابخانه…",
@ -117,7 +117,7 @@
"edit": "ویرایش",
"undo": "بازگرد",
"redo": "از سر",
"roomDialog": "همکاری آنلاین را شروع کنید",
"resetLibrary": "",
"createNewRoom": "ایجاد یک اتاق جدید",
"fullScreen": "تمام‌صفحه",
"darkMode": "حالت تیره",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "خطایی در بارگذاری کتابخانه ثالث وجود داشت.",
"confirmAddLibrary": "{{numShapes}} از اشکال به کتابخانه شما اضافه خواهد شد. مطمئن هستید؟",
"imageDoesNotContainScene": "وارد کردن تصویر در این لحظه امکان پذیر نمی باشد.\nآیا مایل به وارد کردن یک صحنه هستید؟ این تصویر به نظر می رسد که فاقد هرگونه اطلاعاتی مربوط به صحنه باشد. آیا این گزینه را در زمان وارد کردن تصویر فعال کرده اید؟",
"cannotRestoreFromImage": "صحنه را نمی توان از این فایل تصویری بازیابی کرد"
"cannotRestoreFromImage": "صحنه را نمی توان از این فایل تصویری بازیابی کرد",
"resetLibrary": ""
},
"toolBar": {
"selection": "گزینش",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "کپی سبک.",
"copyToClipboard": "",
"copyToClipboardAsPng": "کپی در حافطه موقت به صورت PNG."
"copyToClipboardAsPng": "کپی در حافطه موقت به صورت PNG.",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Tasot",
"actions": "Toiminnot",
"language": "Kieli",
"createRoom": "Jaa yhteistyöistunto",
"liveCollaboration": "Live-yhteistyö",
"duplicateSelection": "Monista",
"untitled": "Nimetön",
"name": "Nimi",
@ -77,7 +77,7 @@
"group": "Ryhmitä valinta",
"ungroup": "Pura valittu ryhmä",
"collaborators": "Yhteistyökumppanit",
"gridMode": "Ruudukkotila",
"showGrid": "Näytä ruudukko",
"addToLibrary": "Lisää kirjastoon",
"removeFromLibrary": "Poista kirjastosta",
"libraryLoadingMessage": "Ladataan kirjastoa…",
@ -117,7 +117,7 @@
"edit": "Muokkaa",
"undo": "Kumoa",
"redo": "Tee uudelleen",
"roomDialog": "Aloita live-yhteistyö",
"resetLibrary": "Tyhjennä kirjasto",
"createNewRoom": "Luo huone",
"fullScreen": "Koko näyttö",
"darkMode": "Tumma tila",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "Kolmannen osapuolen kirjastoa ladattaessa tapahtui virhe.",
"confirmAddLibrary": "Tämä lisää {{numShapes}} muotoa kirjastoosi. Oletko varma?",
"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"
"cannotRestoreFromImage": "Teosta ei voitu palauttaa tästä kuvatiedostosta",
"resetLibrary": "Tämä tyhjentää kirjastosi. Oletko varma?"
},
"toolBar": {
"selection": "Valinta",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Tyylit kopioitu.",
"copyToClipboard": "Kopioitu leikepöydälle.",
"copyToClipboardAsPng": "Kopioitu leikepöydälle PNG-tiedostona."
"copyToClipboardAsPng": "Kopioitu leikepöydälle PNG-tiedostona.",
"fileSaved": "Tiedosto tallennettu.",
"fileSavedToFilename": "Tallennettu kohteeseen {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Calques",
"actions": "Actions",
"language": "Langue",
"createRoom": "Partager une session de collaboration en direct",
"liveCollaboration": "Collaboration en direct",
"duplicateSelection": "Dupliquer",
"untitled": "Sans-titre",
"name": "Nom",
@ -77,7 +77,7 @@
"group": "Grouper la sélection",
"ungroup": "Dégrouper la sélection",
"collaborators": "Collaborateurs",
"gridMode": "Mode grille",
"showGrid": "Afficher la grille",
"addToLibrary": "Ajouter à la bibliothèque",
"removeFromLibrary": "Supprimer de la bibliothèque",
"libraryLoadingMessage": "Chargement de la bibliothèque…",
@ -117,7 +117,7 @@
"edit": "Modifier",
"undo": "Annuler",
"redo": "Rétablir",
"roomDialog": "Démarrer la collaboration en direct",
"resetLibrary": "Réinitialiser la bibliothèque",
"createNewRoom": "Créer une nouvelle salle",
"fullScreen": "Plein écran",
"darkMode": "Mode sombre",
@ -140,7 +140,8 @@
"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": "L'importation d'images n'est pas prise en charge pour le moment.\n\nVouliez-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"
"cannotRestoreFromImage": "Impossible de restaurer la scène depuis ce fichier image",
"resetLibrary": "Cela va effacer votre bibliothèque. Êtes-vous sûr·e ?"
},
"toolBar": {
"selection": "Sélection",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Styles copiés.",
"copyToClipboard": "Copié vers le presse-papiers.",
"copyToClipboardAsPng": "Copié vers le presse-papier en PNG."
"copyToClipboardAsPng": "Copié vers le presse-papier en PNG.",
"fileSaved": "Fichier enregistré.",
"fileSavedToFilename": "Enregistré sous {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "שכבות",
"actions": "פעולות",
"language": "שפה",
"createRoom": "התחל שיתוף פעולה חי",
"liveCollaboration": "",
"duplicateSelection": "שכפל",
"untitled": "ללא כותרת",
"name": "שם",
@ -77,7 +77,7 @@
"group": "אחד לקבוצה",
"ungroup": "פרק קבוצה",
"collaborators": "שותפים",
"gridMode": "מצב רשת",
"showGrid": "",
"addToLibrary": "הוסף לספריה",
"removeFromLibrary": "הסר מספריה",
"libraryLoadingMessage": "טוען ספריה…",
@ -117,7 +117,7 @@
"edit": "ערוך",
"undo": "בטל",
"redo": "בצע מחדש",
"roomDialog": "התחל שיתוף חי",
"resetLibrary": "",
"createNewRoom": "צור חדר",
"fullScreen": "מסך מלא",
"darkMode": "מצב כהה",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "קרתה שגיאה בטעינת הספריה החיצונית.",
"confirmAddLibrary": "הפעולה תוסיף {{numShapes}} צורה(ות) לספריה שלך. האם אתה בטוח?",
"imageDoesNotContainScene": "אין תמיכה בייבוא תמונות כעת.\n\nהאם אתה רוצה לייבא תצוגה? התמונה הזאת אינה מכילה מידע על תצוגה. האם הפעלת את האפשרות הזאת בזמן הוצאת המידע?",
"cannotRestoreFromImage": "לא הצלחנו לשחזר את התצוגה מקובץ התמונה"
"cannotRestoreFromImage": "לא הצלחנו לשחזר את התצוגה מקובץ התמונה",
"resetLibrary": ""
},
"toolBar": {
"selection": "בחירה",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "परतें",
"actions": "कार्रवाई",
"language": "भाषा",
"createRoom": "अधिवेशन",
"liveCollaboration": "",
"duplicateSelection": "डुप्लिकेट",
"untitled": "अशीर्षित",
"name": "नाम",
@ -77,7 +77,7 @@
"group": "समूह चयन",
"ungroup": "समूह चयन असमूहीकृत करें",
"collaborators": "सहयोगी",
"gridMode": "ग्रिड मॉड",
"showGrid": "",
"addToLibrary": "लाइब्रेरी से जोड़ें",
"removeFromLibrary": "लाइब्रेरी से निकालें",
"libraryLoadingMessage": "लाइब्रेरी खुल रही है",
@ -117,7 +117,7 @@
"edit": "संशोधन करें",
"undo": "पूर्ववत् करें",
"redo": "फिर से करें",
"roomDialog": "लाइव सहयोग शुरू करें",
"resetLibrary": "",
"createNewRoom": "एक नया कमरा बनाएं",
"fullScreen": "पूरी स्क्रीन",
"darkMode": "डार्क मोड",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "लाइब्रेरी लोड करने में त्रुटि",
"confirmAddLibrary": "लाइब्रेरी जोड़ें पुष्‍टि करें आकार संख्या",
"imageDoesNotContainScene": "दृश्य में छवि नहीं है",
"cannotRestoreFromImage": "छवि फ़ाइल बहाल दृश्य नहीं है"
"cannotRestoreFromImage": "छवि फ़ाइल बहाल दृश्य नहीं है",
"resetLibrary": ""
},
"toolBar": {
"selection": "चयन",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "काॅपी कीए स्टाइल",
"copyToClipboard": "क्लिपबोर्ड में कॉपी कीए",
"copyToClipboardAsPng": "क्लिपबोर्ड में PNG के रूप में कॉपी किए"
"copyToClipboardAsPng": "क्लिपबोर्ड में PNG के रूप में कॉपी किए",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Rétegek",
"actions": "Műveletek",
"language": "Nyelv",
"createRoom": "Élő együttmüködés megosztása",
"liveCollaboration": "",
"duplicateSelection": "Duplikálás",
"untitled": "Névtelen",
"name": "Név",
@ -77,7 +77,7 @@
"group": "Csoportosítás",
"ungroup": "Csoportbontás",
"collaborators": "Közreműködők",
"gridMode": "Hálómód",
"showGrid": "",
"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…",
@ -117,7 +117,7 @@
"edit": "Szerkesztés",
"undo": "Vissza",
"redo": "Újra",
"roomDialog": "Élő együttműködés indítása",
"resetLibrary": "",
"createNewRoom": "Új szoba létrehozása",
"fullScreen": "Teljes képernyő",
"darkMode": "Sötét mód",
@ -140,7 +140,8 @@
"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": "Képek importálása egyelőre nem támogatott.\n\nEgy jelenetet szeretnél betölteni? Úgy tűnik ez a kép fájl nem tartalmazza a szükséges adatokat. Exportáláskor ezt egy külön opcióval lehet beállítani.",
"cannotRestoreFromImage": "A jelenet visszaállítása nem sikerült ebből a kép fájlból"
"cannotRestoreFromImage": "A jelenet visszaállítása nem sikerült ebből a kép fájlból",
"resetLibrary": ""
},
"toolBar": {
"selection": "Kijelölés",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Lapisan",
"actions": "Aksi",
"language": "Bahasa",
"createRoom": "Bagikan sesi kolaborasi langsung",
"liveCollaboration": "",
"duplicateSelection": "Duplikat",
"untitled": "Tanpa judul",
"name": "Nama",
@ -77,7 +77,7 @@
"group": "Kelompokan pilihan",
"ungroup": "Pisahkan pilihan",
"collaborators": "Kolaborator",
"gridMode": "Mode grid",
"showGrid": "Tampilkan grid",
"addToLibrary": "Tambahkan ke pustaka",
"removeFromLibrary": "Hapus dari pustaka",
"libraryLoadingMessage": "Memuat pustaka…",
@ -117,7 +117,7 @@
"edit": "Edit",
"undo": "Urungkan",
"redo": "Ulangi",
"roomDialog": "Mulai kolaborasi langsung",
"resetLibrary": "",
"createNewRoom": "Buat ruang baru",
"fullScreen": "Layar penuh",
"darkMode": "Mode gelap",
@ -136,11 +136,12 @@
"decryptFailed": "Tidak dapat mengdekripsi data.",
"uploadedSecurly": "Pengunggahan ini telah diamankan menggunakan enkripsi end-to-end, artinya server Excalidraw dan pihak ketiga tidak data membaca nya",
"loadSceneOverridePrompt": "Memuat gambar external akan mengganti konten Anda yang ada. Apakah Anda ingin melanjutkan?",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "Menghentikan sesi akan menimpa gambar Anda yang tersimpan secara lokal. Anda yakin?\n\n(Jika Anda ingin menyimpan gambar lokal Anda, gantinya cukup tutup tab browser.)",
"errorLoadingLibrary": "Terdapat kesalahan dalam memuat pustaka pihak ketiga.",
"confirmAddLibrary": "Ini akan menambahkan {{numShapes}} bentuk ke pustaka Anda. Anda yakin?",
"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"
"cannotRestoreFromImage": "Pemandangan tidak dapat dipulihkan dari file gambar ini",
"resetLibrary": ""
},
"toolBar": {
"selection": "Pilihan",
@ -235,14 +236,16 @@
"storage": "Penyimpanan",
"title": "Statistik untuk nerd",
"total": "Total",
"version": "",
"versionCopy": "",
"versionNotAvailable": "",
"version": "Versi",
"versionCopy": "Klik untuk salin",
"versionNotAvailable": "Versi tidak tersedia",
"width": "Lebar"
},
"toast": {
"copyStyles": "Gaya tersalin.",
"copyToClipboard": "",
"copyToClipboardAsPng": "Tersalin ke clipboard sebagai PNG."
"copyToClipboard": "Tersalin ke papan klip.",
"copyToClipboardAsPng": "Tersalin ke clipboard sebagai PNG.",
"fileSaved": "File tersimpan.",
"fileSavedToFilename": "Disimpan ke {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Livelli",
"actions": "Azioni",
"language": "Lingua",
"createRoom": "Condividi una sessione di collaborazione in diretta",
"liveCollaboration": "Collaborazione live",
"duplicateSelection": "Duplica",
"untitled": "Senza titolo",
"name": "Nome",
@ -77,7 +77,7 @@
"group": "Crea gruppo da selezione",
"ungroup": "Dividi gruppo da selezione",
"collaborators": "Collaboratori",
"gridMode": "Modalità griglia",
"showGrid": "Visualizza griglia",
"addToLibrary": "Aggiungi alla libreria",
"removeFromLibrary": "Rimuovi dalla libreria",
"libraryLoadingMessage": "Caricamento libreria…",
@ -117,7 +117,7 @@
"edit": "Modifica",
"undo": "Annulla",
"redo": "Ripeti",
"roomDialog": "Inizia collaborazione in diretta",
"resetLibrary": "Ripristina libreria",
"createNewRoom": "Crea nuova stanza",
"fullScreen": "Schermo intero",
"darkMode": "Tema scuro",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "Si è verificato un errore nel caricamento della libreria di terze parti.",
"confirmAddLibrary": "Questo aggiungerà {{numShapes}} forma(e) alla tua libreria. Sei sicuro?",
"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"
"cannotRestoreFromImage": "Impossibile ripristinare la scena da questo file immagine",
"resetLibrary": "Questa azione cancellerà l'intera libreria. Sei sicuro?"
},
"toolBar": {
"selection": "Selezione",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Stili copiati.",
"copyToClipboard": "Copiato negli appunti.",
"copyToClipboardAsPng": "Copiato negli appunti come PNG."
"copyToClipboardAsPng": "Copiato negli appunti come PNG.",
"fileSaved": "File salvato.",
"fileSavedToFilename": "Salvato in {filename}"
}
}

View File

@ -1,11 +1,11 @@
{
"labels": {
"paste": "貼り付け",
"pasteCharts": "",
"pasteCharts": "チャートの貼り付け",
"selectAll": "すべて選択",
"multiSelect": "複数選択",
"moveCanvas": "キャンバスを移動",
"cut": "",
"cut": "切り取り",
"copy": "コピー",
"copyAsPng": "PNGとしてクリップボードへコピー",
"copyAsSvg": "SVGとしてクリップボードへコピー",
@ -38,7 +38,7 @@
"fontSize": "フォントの大きさ",
"fontFamily": "フォントの種類",
"onlySelected": "選択中のみ",
"withBackground": "",
"withBackground": "背景を含める",
"exportEmbedScene": "エクスポートされたファイルにシーンを埋め込みます",
"exportEmbedScene_details": "シーンデータはエクスポートされたPNG/SVGファイルに保存され、シーンを復元することができます。\nエクスポートされたファイルのサイズは増加します。",
"addWatermark": "\"Made with Excalidraw\"と表示",
@ -68,20 +68,20 @@
"layers": "レイヤー",
"actions": "操作",
"language": "言語",
"createRoom": "共同編集セッションの共有",
"liveCollaboration": "ライブ連携",
"duplicateSelection": "複製",
"untitled": "",
"untitled": "無題",
"name": "名前",
"yourName": "あなたの名前",
"madeWithExcalidraw": "Excalidrawで作成",
"group": "図形のグループ化",
"ungroup": "グループ化を解除",
"collaborators": "共同編集者",
"gridMode": "",
"showGrid": "グリッドを表示",
"addToLibrary": "ライブラリに追加",
"removeFromLibrary": "ライブラリから削除",
"libraryLoadingMessage": "ライブラリを読み込み中…",
"libraries": "",
"libraries": "ライブラリを参照する",
"loadingScene": "シーンを読み込み中…",
"align": "整列",
"alignTop": "上揃え",
@ -90,9 +90,9 @@
"alignRight": "右揃え",
"centerVertically": "縦方向に中央揃え",
"centerHorizontally": "横方向に中央揃え",
"distributeHorizontally": "",
"distributeVertically": "",
"viewMode": ""
"distributeHorizontally": "水平方向に分散配置",
"distributeVertically": "垂直方向に分散配置",
"viewMode": "閲覧モード"
},
"buttons": {
"clearReset": "キャンバスのリセット",
@ -117,12 +117,12 @@
"edit": "編集",
"undo": "元に戻す",
"redo": "やり直し",
"roomDialog": "共同編集を開始する",
"resetLibrary": "ライブラリをリセット",
"createNewRoom": "新しい部屋を作成する",
"fullScreen": "全画面表示",
"darkMode": "ダークモード",
"lightMode": "ライトモード",
"zenMode": "",
"zenMode": "Zenモード",
"exitZenMode": "集中モードをやめる"
},
"alerts": {
@ -136,11 +136,12 @@
"decryptFailed": "データを復号できませんでした。",
"uploadedSecurly": "データのアップロードはエンドツーエンド暗号化によって保護されています。Excalidrawサーバーと第三者はデータの内容を見ることができません。",
"loadSceneOverridePrompt": "外部図面を読み込むと、既存のコンテンツが置き換わります。続行しますか?",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "セッションを停止すると、ローカルに保存されている図が上書きされます。 本当によろしいですか?\n\n(ローカルの図を保持したい場合は、セッションを停止せずにブラウザタブを閉じてください。)",
"errorLoadingLibrary": "サードパーティライブラリの読み込み中にエラーが発生しました。",
"confirmAddLibrary": "{{numShapes}} 個の図形をライブラリに追加します。よろしいですか?",
"imageDoesNotContainScene": "",
"cannotRestoreFromImage": "このイメージファイルからシーンを復元できませんでした"
"imageDoesNotContainScene": "現在、画像のインポートはサポートされていません。\n\nシーンをインポートしようとしましたかこの画像にはシーンデータが含まれていないようです。エクスポート中に有効にしていましたか",
"cannotRestoreFromImage": "このイメージファイルからシーンを復元できませんでした",
"resetLibrary": "ライブラリを消去します。本当によろしいですか?"
},
"toolBar": {
"selection": "選択",
@ -164,7 +165,7 @@
"freeDraw": "クリックしてドラッグします。離すと終了します",
"text": "ヒント: 選択ツールを使用して任意の場所をダブルクリックしてテキストを追加することもできます",
"linearElementMulti": "最後のポイントをクリックするか、エスケープまたはEnterを押して終了します",
"lockAngle": "",
"lockAngle": "SHIFTを押したままにすると、角度を制限することができます",
"resize": "サイズを変更中にSHIFTを押しすと比率を制御できます。Altを押すと中央からサイズを変更できます。",
"rotate": "回転中にSHIFT キーを押すと角度を制限することができます",
"lineEditor_info": "ポイントを編集するには、ダブルクリックまたはEnterキーを押します",
@ -202,47 +203,49 @@
"title": "エラー"
},
"helpDialog": {
"blog": "",
"click": "",
"curvedArrow": "",
"curvedLine": "",
"documentation": "",
"drag": "",
"editor": "",
"github": "",
"howto": "",
"or": "",
"preventBinding": "",
"shapes": "",
"shortcuts": "",
"textFinish": "",
"textNewLine": "",
"title": "",
"view": "",
"zoomToFit": "",
"zoomToSelection": ""
"blog": "公式ブログを読む",
"click": "クリック",
"curvedArrow": "カーブした矢印",
"curvedLine": "曲線",
"documentation": "ドキュメント",
"drag": "ドラッグ",
"editor": "エディタ",
"github": "不具合報告はこちら",
"howto": "ヘルプ・マニュアル",
"or": "または",
"preventBinding": "矢印を結合しない",
"shapes": "図形",
"shortcuts": "キーボードショートカット",
"textFinish": "編集を終了する (テキスト)",
"textNewLine": "新しい行を追加 (テキスト)",
"title": "ヘルプ",
"view": "表示",
"zoomToFit": "すべての要素が収まるようにズーム",
"zoomToSelection": "選択要素にズーム"
},
"encrypted": {
"tooltip": "描画内容はエンドツーエンド暗号化が施されており、Excalidrawサーバーが内容を見ることはできません。"
},
"stats": {
"angle": "",
"element": "",
"elements": "",
"angle": "角度",
"element": "要素",
"elements": "要素",
"height": "高さ",
"scene": "",
"selected": "",
"storage": "",
"title": "",
"scene": "シーン",
"selected": "選択済み",
"storage": "ストレージ",
"title": "マニア向け統計情報",
"total": "合計",
"version": "",
"versionCopy": "",
"versionNotAvailable": "",
"version": "バージョン",
"versionCopy": "クリックしてコピー",
"versionNotAvailable": "利用できないバージョン",
"width": "幅"
},
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyStyles": "スタイルをコピー",
"copyToClipboard": "クリップボードにコピー",
"copyToClipboardAsPng": "PNG形式でクリップボードにコピー",
"fileSaved": "ファイルを保存しました",
"fileSavedToFilename": "{filename} に保存しました"
}
}

View File

@ -24,7 +24,7 @@
"strokeStyle_solid": "Aččuran",
"strokeStyle_dashed": "S tjerriḍin",
"strokeStyle_dotted": "S tenqiḍin",
"sloppiness": "",
"sloppiness": "Astehzi",
"opacity": "Tiḍullest",
"textAlign": "Areyyec n uḍris",
"edges": "Leryuf",
@ -68,7 +68,7 @@
"layers": "Tissiyin",
"actions": "Tigawin",
"language": "Tutlayt",
"createRoom": "Bḍu tiɣimit n umɛawen s srid",
"liveCollaboration": "",
"duplicateSelection": "Sisleg",
"untitled": "War azwel",
"name": "Isem",
@ -77,7 +77,7 @@
"group": "Segrew tafrayt",
"ungroup": "Kkess asegrew i tefrayt",
"collaborators": "Imɛiwnen",
"gridMode": "Askar n uferrug",
"showGrid": "Beqqeḍ aferrug",
"addToLibrary": "Rnu ɣer temkarḍit",
"removeFromLibrary": "Kkes si temkarḍit",
"libraryLoadingMessage": "Asali n temkarḍit…",
@ -117,7 +117,7 @@
"edit": "Ẓreg",
"undo": "Sefsex",
"redo": "Err-d",
"roomDialog": "Bdu amɛawen s srid",
"resetLibrary": "",
"createNewRoom": "Snulfu-d taxxamt tamaynutt",
"fullScreen": "Agdil aččuran",
"darkMode": "Askar imsulles",
@ -130,17 +130,18 @@
"couldNotCreateShareableLink": "D awezɣi asnulfu n useɣwen n beṭṭu.",
"couldNotCreateShareableLinkTooBig": "D awezɣi asnulfu n useɣwen n beṭṭu. Asayes ɣezzif aṭas",
"couldNotLoadInvalidFile": "D awezɣi asali n ufaylu armeɣtu",
"importBackendFailed": "",
"importBackendFailed": "Takterḍ seg uɣawas n deffir ur teddi ara.",
"cannotExportEmptyCanvas": "D awezɣi asifeḍ n teɣzut n usuneɣ tilemt.",
"couldNotCopyToClipboard": "D awezɣi anɣal ɣer tecfawit. Eɛreḍ ad tesqedceḍ iminig Chrome.",
"decryptFailed": "D awezɣi tukksa n uwgelhen i yisefka.",
"uploadedSecurly": "Asili yettwasɣelles s uwgelhen ixef s ixef, ayagi yebɣa ad d-yini belli aqeddac n Excalidraw akked medden ur zmiren ara ad ɣren agbur.",
"loadSceneOverridePrompt": "Asali n wunuɣ uffiɣ ad isemselsi agbur-inek (m) yellan. Tebɣiḍ ad tkemmeleḍ?",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "Aḥbas n tɣimit ad yesefsex unuɣ-inek (m) yettwaḥerzen yakan s wudem adigan. Tetḥeqqeḍ?\n(Ma tebɣiḍ ad teǧǧeḍ unuɣ-inek (m) adigan, mdel iccer n yiminig, deg umḍiq.)",
"errorLoadingLibrary": "Teḍra-d tuccḍa deg usali n temkarḍit n wis kraḍ.",
"confirmAddLibrary": "Ayagi adirnu talɣa (win) {{numShapes}} ɣer temkarḍit-inek (m). Tetḥeqqeḍ?",
"imageDoesNotContainScene": "Taktert n tugniwin ur tettwadhel ara akka tura.\nTebɣiḍ ad tketreḍ asayes? Tugna-agi tettban-d ur tegbir ara isefka n usnas. Tesremdeḍ ayagi deg usifeḍ?",
"cannotRestoreFromImage": "Asayes ulamek ara d-yettwarr seg ufaylu-agi n tugna"
"cannotRestoreFromImage": "Asayes ulamek ara d-yettwarr seg ufaylu-agi n tugna",
"resetLibrary": ""
},
"toolBar": {
"selection": "Tafrayt",
@ -184,7 +185,7 @@
"clearCanvasCaveat": " Ayagi ad d-iglu s usṛuḥu n umahil ",
"trackedToSentry_pre": "Tuccḍa akked umesmagi ",
"trackedToSentry_post": " tettwasekles deg unagraw-nneɣ.",
"openIssueMessage_pre": "",
"openIssueMessage_pre": "Nḥuder aṭas akken ur nseddu ara talɣut n usayes-inek (m) di tuccḍa. Ma yella asayes-inek (m) mačči d amaẓlay, ttxil-k (m) xemmem ad ḍefreḍ ",
"openIssueMessage_button": "afecku n weḍfar n yibugen.",
"openIssueMessage_post": " Ma ulac uɣilif seddu talɣut ukessar-agi s wenɣal akked usenṭeḍ di GitHub issue.",
"sceneContent": "Agbur n usayes:"
@ -212,7 +213,7 @@
"github": "Tufiḍ-d ugur? Azen-aɣ-d",
"howto": "Ḍfer imniren-nneɣ",
"or": "neɣ",
"preventBinding": "",
"preventBinding": "Seḥbes tuqqna n tneccabin",
"shapes": "Talɣiwin",
"shortcuts": "Inegzumen n unasiw",
"textFinish": "Fak asiẓreg (aḍris)",
@ -242,7 +243,9 @@
},
"toast": {
"copyStyles": "Iɣunab yettwaneɣlen.",
"copyToClipboard": "",
"copyToClipboardAsPng": "Yettwanɣel ɣer tecfawit am PNG."
"copyToClipboard": "Yettwaɣel ɣer tecfawit.",
"copyToClipboardAsPng": "Yettwanɣel ɣer tecfawit am PNG.",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "레이어",
"actions": "동작",
"language": "언어",
"createRoom": "실시간 협업 세션 공유",
"liveCollaboration": "",
"duplicateSelection": "복제",
"untitled": "제목 없음",
"name": "이름",
@ -77,7 +77,7 @@
"group": "그룹 생성",
"ungroup": "그룹 해제",
"collaborators": "공동 작업자",
"gridMode": "격자 방식",
"showGrid": "",
"addToLibrary": "라이브러리에 추가",
"removeFromLibrary": "라이브러리에서 제거",
"libraryLoadingMessage": "라이브러리 불러오는 중…",
@ -117,7 +117,7 @@
"edit": "수정",
"undo": "실행 취소",
"redo": "다시 실행",
"roomDialog": "실시간 협업 시작하기",
"resetLibrary": "",
"createNewRoom": "방 만들기",
"fullScreen": "전체화면",
"darkMode": "다크 모드",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "외부 라이브러리를 불러오는 중에 문제가 발생했습니다.",
"confirmAddLibrary": "{{numShapes}}개의 모양이 라이브러리에 추가됩니다. 계속하시겠어요?",
"imageDoesNotContainScene": "이미지에서 불러오기는 현재 지원되지 않습니다.\n\n화면을 불러오려고 하셨나요? 이미지에 화면 정보가 없는 것 같습니다. 내보낼 때 화면을 포함했나요?",
"cannotRestoreFromImage": "이미지 파일에서 화면을 복구할 수 없었습니다"
"cannotRestoreFromImage": "이미지 파일에서 화면을 복구할 수 없었습니다",
"resetLibrary": ""
},
"toolBar": {
"selection": "선택",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "스타일 복사.",
"copyToClipboard": "클립보드로 복사.",
"copyToClipboardAsPng": "클립보드로 PNG 이미지 복사."
"copyToClipboardAsPng": "클립보드로 PNG 이미지 복사.",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "အလွှာများ",
"actions": "လုပ်ဆောင်ချက်များ",
"language": "ဘာသာစကား",
"createRoom": "တိုက်ရိုက်ပူးပေါင်းဆောင်ရွက်ရန်အဖွဲ့ဖွဲ့",
"liveCollaboration": "",
"duplicateSelection": "ပွား",
"untitled": "အမည်မရှိ",
"name": "အမည်",
@ -77,7 +77,7 @@
"group": "အုပ်စုဖွဲ့",
"ungroup": "အုပ်စုဖျက်သိမ်း",
"collaborators": "ပူးပေါင်းပါဝင်သူများ",
"gridMode": "",
"showGrid": "",
"addToLibrary": "မှတ်တမ်းတင်",
"removeFromLibrary": "မှတ်တမ်းမှထုတ်",
"libraryLoadingMessage": "မှတ်တမ်းအား တင်သွင်းနေသည်…",
@ -117,7 +117,7 @@
"edit": "ပြင်ဆင်",
"undo": "ပြန်ထား",
"redo": "ထပ်လုပ်",
"roomDialog": "တိုက်ရိုက်ပူးပေါင်းမှုစတင်",
"resetLibrary": "",
"createNewRoom": "အခန်းသစ်ဖွဲ့",
"fullScreen": "",
"darkMode": "",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "ပြင်ပမှမှတ်တမ်းအားတင်သွင်းရာတွင်အမှားအယွင်းရှိနေသည်။",
"confirmAddLibrary": "{{numShapes}} ခုသောပုံသဏ္ဌာန်အားမှတ်တမ်းတင်ပါမည်။ အတည်ပြုပါ။",
"imageDoesNotContainScene": "",
"cannotRestoreFromImage": "ဤပုံဖြင့်မြင်ကွင်းပြန်လည်မရယူနိုင်ပါ။"
"cannotRestoreFromImage": "ဤပုံဖြင့်မြင်ကွင်းပြန်လည်မရယူနိုင်ပါ။",
"resetLibrary": ""
},
"toolBar": {
"selection": "ရွေးချယ်",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Lag",
"actions": "Handlinger",
"language": "Språk",
"createRoom": "Del en sanntids-samarbeidsøkt",
"liveCollaboration": "Sanntids-samarbeid",
"duplicateSelection": "Dupliser",
"untitled": "Uten navn",
"name": "Navn",
@ -77,7 +77,7 @@
"group": "Gruppér utvalg",
"ungroup": "Avgruppér utvalg",
"collaborators": "Samarbeidspartnere",
"gridMode": "Rutevisning",
"showGrid": "Vis rutenett",
"addToLibrary": "Legg til i bibliotek",
"removeFromLibrary": "Fjern fra bibliotek",
"libraryLoadingMessage": "Laster bibliotek…",
@ -117,7 +117,7 @@
"edit": "Rediger",
"undo": "Angre",
"redo": "Gjør om",
"roomDialog": "Start sanntids-samarbeid",
"resetLibrary": "Nullstill bibliotek",
"createNewRoom": "Opprett et nytt rom",
"fullScreen": "Fullskjerm",
"darkMode": "Mørk modus",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "Det oppstod en feil under lasting av tredjepartsbiblioteket.",
"confirmAddLibrary": "Dette vil legge til {{numShapes}} figur(er) i biblioteket ditt. Er du sikker?",
"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"
"cannotRestoreFromImage": "Scenen kunne ikke gjenopprettes fra denne bildefilen",
"resetLibrary": "Dette vil tømme biblioteket ditt. Er du sikker?"
},
"toolBar": {
"selection": "Velg",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Kopierte stiler.",
"copyToClipboard": "Kopiert til utklippstavlen.",
"copyToClipboardAsPng": "Kopiert til utklippstavlen som PNG."
"copyToClipboardAsPng": "Kopiert til utklippstavlen som PNG.",
"fileSaved": "Fil lagret.",
"fileSavedToFilename": "Lagret til {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Lagen",
"actions": "Acties",
"language": "Taal",
"createRoom": "Deel een live-samenwerkingssessie",
"liveCollaboration": "Live Samenwerking",
"duplicateSelection": "Dupliceer",
"untitled": "Naamloos",
"name": "Naam",
@ -77,7 +77,7 @@
"group": "Groeperen",
"ungroup": "Groep opheffen",
"collaborators": "Deelnemers",
"gridMode": "Rasterweergave",
"showGrid": "Raster weergeven",
"addToLibrary": "Voeg toe aan bibliotheek",
"removeFromLibrary": "Verwijder uit bibliotheek",
"libraryLoadingMessage": "Bibliotheek laden…",
@ -117,7 +117,7 @@
"edit": "Bewerken",
"undo": "Ongedaan maken",
"redo": "Herstel ongedaan maken",
"roomDialog": "Live-samenwerkingssessie starten",
"resetLibrary": "Bibliotheek Resetten",
"createNewRoom": "Creëer live-samenwerkingssessie",
"fullScreen": "Volledig scherm",
"darkMode": "Donkere modus",
@ -140,7 +140,8 @@
"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": "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"
"cannotRestoreFromImage": "Scène kan niet worden hersteld vanuit dit afbeeldingsbestand",
"resetLibrary": "Dit zal je bibliotheek wissen. Weet je het zeker?"
},
"toolBar": {
"selection": "Selectie",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Stijlen gekopieerd.",
"copyToClipboard": "Gekopieerd naar het klembord.",
"copyToClipboardAsPng": "Gekopieerd naar klembord als PNG."
"copyToClipboardAsPng": "Gekopieerd naar klembord als PNG.",
"fileSaved": "Bestand opgeslagen.",
"fileSavedToFilename": "Opgeslagen als {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Lag",
"actions": "Handlingar",
"language": "Språk",
"createRoom": "Del ei sanntids-samarbeidsøkt",
"liveCollaboration": "",
"duplicateSelection": "Dupliser",
"untitled": "Utan namn",
"name": "Namn",
@ -77,7 +77,7 @@
"group": "Grupper utval",
"ungroup": "Avgrupper utval",
"collaborators": "Samarbeidarar",
"gridMode": "Rutevisning",
"showGrid": "",
"addToLibrary": "Legg til i bibliotek",
"removeFromLibrary": "Fjern frå bibliotek",
"libraryLoadingMessage": "Laster bibliotek…",
@ -117,7 +117,7 @@
"edit": "Rediger",
"undo": "Angre",
"redo": "Gjer om",
"roomDialog": "Start sanntids-samarbeid",
"resetLibrary": "",
"createNewRoom": "Lag nytt rom",
"fullScreen": "Fullskjerm",
"darkMode": "Mørk modus",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "Det oppstod ein feil under lastinga av tredjepartsbibliotek.",
"confirmAddLibrary": "Dette vil legge til {{numShapes}} form(er) i biblioteket ditt. Er du sikker?",
"imageDoesNotContainScene": "Importering av bilder støttes ikkje for p. t.\n\nVil du importere ein scene? Dette bildet ser ikkje ut til å inneholde noen scene-data. Har du aktivert dette under eksporten?",
"cannotRestoreFromImage": "Scena kunne ikkje gjenopprettast frå denne biletfila"
"cannotRestoreFromImage": "Scena kunne ikkje gjenopprettast frå denne biletfila",
"resetLibrary": ""
},
"toolBar": {
"selection": "Vel",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "ਪਰਤਾਂ",
"actions": "ਕਾਰਵਾਈਆਂ",
"language": "ਭਾਸ਼ਾ",
"createRoom": "ਲਾਇਵ ਸਹਿਯੋਗ ਇਜਲਾਸ ਸਾਂਝਾ ਕਰੋ",
"liveCollaboration": "",
"duplicateSelection": "ਡੁਪਲੀਕੇਟ ਬਣਾਓ",
"untitled": "ਬੇ-ਸਿਰਨਾਵਾਂ",
"name": "ਨਾਂ",
@ -77,7 +77,7 @@
"group": "ਚੋਣ ਦਾ ਗਰੁੱਪ ਬਣਾਓ",
"ungroup": "ਚੋਣ ਦਾ ਗਰੁੱਪ ਤੋੜੋ",
"collaborators": "ਸਹਿਯੋਗੀ",
"gridMode": "ਜਾਲੀਦਾਰ ਮੋਡ",
"showGrid": "ਜਾਲੀ ਦਿਖਾਓ",
"addToLibrary": "ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ ਜੋੜੋ",
"removeFromLibrary": "ਲਾਇਬ੍ਰੇਰੀ 'ਚੋਂ ਹਟਾਓ",
"libraryLoadingMessage": "ਲਾਇਬ੍ਰੇਰੀ ਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…",
@ -117,7 +117,7 @@
"edit": "ਸੋਧੋ",
"undo": "ਅਣਕੀਤਾ ਕਰੋ",
"redo": "ਮੁੜ-ਕਰੋ",
"roomDialog": "ਲਾਇਵ ਸਹਿਯੋਗ ਸ਼ੁਰੂ ਕਰੋ",
"resetLibrary": "",
"createNewRoom": "ਨਵਾਂ ਕਮਰਾ ਬਣਾਓ",
"fullScreen": "ਪੂਰੀ ਸਕਰੀਨ",
"darkMode": "ਡਾਰਕ ਮੋਡ",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "ਤੀਜੀ ਧਿਰ ਦੀ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਲੋਡ ਕਰਨ ਵਿੱਚ ਗਲਤੀ ਹੋਈ ਸੀ।",
"confirmAddLibrary": "ਇਹ ਤੁਹਾਡੀ ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ {{numShapes}} ਆਕ੍ਰਿਤੀ(ਆਂ) ਨੂੰ ਜੋੜ ਦੇਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇੰਝ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?",
"imageDoesNotContainScene": "ਫਿਲਹਾਲ ਤਸਵੀਰਾਂ ਨੂੰ ਆਯਾਤ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ।\n\nਕੀ ਤੁਸੀਂ ਦ੍ਰਿਸ਼ ਨੂੰ ਆਯਾਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਸੀ? ਇਸ ਤਸਵੀਰ ਵਿੱਚ ਦ੍ਰਿਸ਼ ਦਾ ਕੋਈ ਵੀ ਡਾਟਾ ਨਜ਼ਰ ਨਹੀਂ ਆ ਰਿਹਾ। ਕੀ ਨਿਰਯਾਤ ਦੌਰਾਨ ਤੁਸੀਂ ਇਹ ਸਮਰੱਥ ਕੀਤਾ ਸੀ?",
"cannotRestoreFromImage": "ਇਸ ਤਸਵੀਰ ਫਾਈਲ ਤੋਂ ਦ੍ਰਿਸ਼ ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"
"cannotRestoreFromImage": "ਇਸ ਤਸਵੀਰ ਫਾਈਲ ਤੋਂ ਦ੍ਰਿਸ਼ ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ",
"resetLibrary": ""
},
"toolBar": {
"selection": "ਚੋਣਕਾਰ",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "ਕਾਪੀ ਕੀਤੇ ਸਟਾਇਲ।",
"copyToClipboard": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕੀਤਾ।",
"copyToClipboardAsPng": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ PNG ਵਜੋਂ ਕਾਪੀ ਕੀਤਾ।"
"copyToClipboardAsPng": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ PNG ਵਜੋਂ ਕਾਪੀ ਕੀਤਾ।",
"fileSaved": "ਫਾਈਲ ਸਾਂਭੀ ਗਈ।",
"fileSavedToFilename": "{filename} ਵਿੱਚ ਸਾਂਭੀ"
}
}

View File

@ -1,36 +1,36 @@
{
"ar-SA": 87,
"bg-BG": 91,
"ca-ES": 87,
"ar-SA": 85,
"bg-BG": 98,
"ca-ES": 85,
"de-DE": 100,
"el-GR": 99,
"el-GR": 100,
"en": 100,
"es-ES": 100,
"fa-IR": 95,
"fa-IR": 93,
"fi-FI": 100,
"fr-FR": 100,
"he-IL": 87,
"hi-IN": 98,
"hu-HU": 87,
"id-ID": 97,
"he-IL": 85,
"hi-IN": 96,
"hu-HU": 85,
"id-ID": 99,
"it-IT": 100,
"ja-JP": 79,
"kab-KAB": 96,
"ko-KR": 100,
"my-MM": 81,
"ja-JP": 100,
"kab-KAB": 97,
"ko-KR": 97,
"my-MM": 79,
"nb-NO": 100,
"nl-NL": 99,
"nn-NO": 90,
"pa-IN": 100,
"pl-PL": 88,
"nn-NO": 87,
"pa-IN": 99,
"pl-PL": 85,
"pt-BR": 100,
"pt-PT": 97,
"pt-PT": 94,
"ro-RO": 100,
"ru-RU": 98,
"ru-RU": 100,
"sk-SK": 100,
"sv-SE": 100,
"tr-TR": 87,
"uk-UA": 97,
"zh-CN": 98,
"tr-TR": 85,
"uk-UA": 99,
"zh-CN": 95,
"zh-TW": 100
}

View File

@ -68,7 +68,7 @@
"layers": "Warstwy",
"actions": "Akcje",
"language": "Język",
"createRoom": "Udostępnij sesję współpracy na żywo",
"liveCollaboration": "",
"duplicateSelection": "Powiel",
"untitled": "Bez tytułu",
"name": "Nazwa",
@ -77,7 +77,7 @@
"group": "Zgrupuj wybrane",
"ungroup": "Rozgrupuj wybrane",
"collaborators": "Współtwórcy",
"gridMode": "Tryb siatki",
"showGrid": "",
"addToLibrary": "Dodaj do biblioteki",
"removeFromLibrary": "Usuń z biblioteki",
"libraryLoadingMessage": "Ładowanie biblioteki…",
@ -117,7 +117,7 @@
"edit": "Edytuj",
"undo": "Cofnij",
"redo": "Przywróć",
"roomDialog": "Utwórz nową sesję współpracy na żywo",
"resetLibrary": "",
"createNewRoom": "Utwórz nowy pokój",
"fullScreen": "Pełny ekran",
"darkMode": "Ciemny motyw",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "Wystąpił błąd podczas ładowania zewnętrznej biblioteki.",
"confirmAddLibrary": "To doda {{numShapes}} kształtów do twojej biblioteki. Jesteś pewien?",
"imageDoesNotContainScene": "Importowanie zdjęć nie jest obecnie obsługiwane.\n\nCzy chciałeś zaimportować scenę? Ten obraz nie zawiera żadnych danych sceny. Czy włączyłeś to podczas eksportowania?",
"cannotRestoreFromImage": "Scena nie mogła zostać przywrócona z pliku obrazu"
"cannotRestoreFromImage": "Scena nie mogła zostać przywrócona z pliku obrazu",
"resetLibrary": ""
},
"toolBar": {
"selection": "Zaznaczenie",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Camadas",
"actions": "Ações",
"language": "Idioma",
"createRoom": "Compartilhar uma sessão de colaboração ao vivo",
"liveCollaboration": "Colaboração ao vivo",
"duplicateSelection": "Duplicar",
"untitled": "Sem título",
"name": "Nome",
@ -77,7 +77,7 @@
"group": "Agrupar seleção",
"ungroup": "Desagrupar seleção",
"collaborators": "Colaboradores",
"gridMode": "Modo grade",
"showGrid": "Mostrar grade",
"addToLibrary": "Adicionar à biblioteca",
"removeFromLibrary": "Remover da biblioteca",
"libraryLoadingMessage": "Carregando biblioteca…",
@ -117,7 +117,7 @@
"edit": "Editar",
"undo": "Desfazer",
"redo": "Refazer",
"roomDialog": "Iniciar colaboração ao vivo",
"resetLibrary": "Redefinir biblioteca",
"createNewRoom": "Criar nova sala",
"fullScreen": "Tela cheia",
"darkMode": "Modo escuro",
@ -140,7 +140,8 @@
"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"
"cannotRestoreFromImage": "Não foi possível restaurar a cena deste arquivo de imagem",
"resetLibrary": "Isto limpará a sua biblioteca. Você tem certeza?"
},
"toolBar": {
"selection": "Seleção",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Estilos copiados.",
"copyToClipboard": "Copiado para área de transferência.",
"copyToClipboardAsPng": "Copiado para a área de transferência como PNG."
"copyToClipboardAsPng": "Copiado para a área de transferência como PNG.",
"fileSaved": "Arquivo salvo.",
"fileSavedToFilename": "Salvo em {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Camadas",
"actions": "Ações",
"language": "Idioma",
"createRoom": "Compartilhar uma sessão de colaboração ao vivo",
"liveCollaboration": "",
"duplicateSelection": "Duplicar",
"untitled": "Sem título",
"name": "Nome",
@ -77,7 +77,7 @@
"group": "Agrupar seleção",
"ungroup": "Desagrupar seleção",
"collaborators": "Colaboradores",
"gridMode": "Modo grade",
"showGrid": "",
"addToLibrary": "Adicionar à biblioteca",
"removeFromLibrary": "Remover da biblioteca",
"libraryLoadingMessage": "Carregando biblioteca…",
@ -117,7 +117,7 @@
"edit": "Editar",
"undo": "Desfazer",
"redo": "Refazer",
"roomDialog": "Iniciar colaboração ao vivo",
"resetLibrary": "",
"createNewRoom": "Criar nova sala",
"fullScreen": "Tela cheia",
"darkMode": "Modo escuro",
@ -140,7 +140,8 @@
"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"
"cannotRestoreFromImage": "Não foi possível restaurar a cena deste arquivo de imagem",
"resetLibrary": ""
},
"toolBar": {
"selection": "Seleção",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Estilos copiados.",
"copyToClipboard": "",
"copyToClipboardAsPng": "Copiado para o clipboard como PNG."
"copyToClipboardAsPng": "Copiado para o clipboard como PNG.",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Straturi",
"actions": "Acțiuni",
"language": "Limbă",
"createRoom": "Invită la o sesiune de colaborare în direct",
"liveCollaboration": "Colaborare în direct",
"duplicateSelection": "Duplicare",
"untitled": "Nedenumit",
"name": "Nume",
@ -77,7 +77,7 @@
"group": "Grupare selecție",
"ungroup": "Degrupare selecție",
"collaborators": "Colaboratori",
"gridMode": "Mod grilă",
"showGrid": "Afișare grilă",
"addToLibrary": "Adăugare la bibliotecă",
"removeFromLibrary": "Eliminare din bibliotecă",
"libraryLoadingMessage": "Se încarcă biblioteca…",
@ -117,7 +117,7 @@
"edit": "Edit",
"undo": "Anulare",
"redo": "Refacere",
"roomDialog": "Colaborare în direct",
"resetLibrary": "Resetare bibliotecă",
"createNewRoom": "Creare cameră nouă",
"fullScreen": "Ecran complet",
"darkMode": "Mod întunecat",
@ -140,7 +140,8 @@
"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": "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"
"cannotRestoreFromImage": "Scena nu a putut fi restaurată din acest fișier de imagine",
"resetLibrary": "Această opțiune va elimina conținutul din bibliotecă. Confirmi?"
},
"toolBar": {
"selection": "Selecție",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Stiluri copiate.",
"copyToClipboard": "Copiat în memoria temporară.",
"copyToClipboardAsPng": "Copiat în memoria temporară ca PNG."
"copyToClipboardAsPng": "Copiat în memoria temporară ca PNG.",
"fileSaved": "Fișier salvat.",
"fileSavedToFilename": "Salvat în {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Слои",
"actions": "Действия",
"language": "Язык",
"createRoom": "Начать сеанс совместной работы",
"liveCollaboration": "Совместное взаимодействие",
"duplicateSelection": "Дубликат",
"untitled": "Безымянный",
"name": "Имя",
@ -77,7 +77,7 @@
"group": "Сгруппировать выделение",
"ungroup": "Разделить выделение",
"collaborators": "Участники",
"gridMode": "Сетка",
"showGrid": "Показать сетку",
"addToLibrary": "Добавить в библиотеку",
"removeFromLibrary": "Удалить из библиотеки",
"libraryLoadingMessage": "Загрузка библиотеки…",
@ -117,7 +117,7 @@
"edit": "Изменить",
"undo": "Шаг назад",
"redo": "Шаг вперед",
"roomDialog": "Начать совместную работу",
"resetLibrary": "Сброс библиотеки",
"createNewRoom": "Создать новую комнату",
"fullScreen": "Полный экран",
"darkMode": "Темная тема",
@ -136,11 +136,12 @@
"decryptFailed": "Не удалось расшифровать данные.",
"uploadedSecurly": "Загружаемые данные защищена сквозным шифрованием, что означает, что сервер Excalidraw и третьи стороны не могут прочитать содержимое.",
"loadSceneOverridePrompt": "Загрузка рисунка приведёт к замене имеющегося содержимого. Вы хотите продолжить?",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "Остановка сессии перезапишет ваш предыдущий, локально сохранённый рисунок. Вы уверены? \n\n(Если вы хотите оставить ваш локальный рисунок, просто закройте вкладку браузера)",
"errorLoadingLibrary": "Произошла ошибка при загрузке сторонней библиотеки.",
"confirmAddLibrary": "Будет добавлено {{numShapes}} фигур в вашу библиотеку. Продолжить?",
"imageDoesNotContainScene": "Импорт изображений не поддерживается в данный момент.\n\nХотите импортировать сцену? Данное изображение не содержит данных о сцене. Было ли включено это во время экспорта?",
"cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения"
"cannotRestoreFromImage": "Сцена не может быть восстановлена из этого изображения",
"resetLibrary": "Это очистит вашу библиотеку. Вы уверены?"
},
"toolBar": {
"selection": "Выделение области",
@ -235,14 +236,16 @@
"storage": "Хранилище",
"title": "Статистика для ботаников",
"total": "Всего",
"version": "",
"version": "Версия",
"versionCopy": "Копировать",
"versionNotAvailable": "",
"versionNotAvailable": "Версия не доступна",
"width": "Ширина"
},
"toast": {
"copyStyles": "Скопированы стили.",
"copyToClipboard": "",
"copyToClipboardAsPng": "Скопировано в буфер обмена в формате PNG."
"copyToClipboard": "Скопировано в буфер обмена.",
"copyToClipboardAsPng": "Скопировано в буфер обмена в формате PNG.",
"fileSaved": "Файл сохранён.",
"fileSavedToFilename": "Сохранено в {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Vrstvy",
"actions": "Akcie",
"language": "Jazyk",
"createRoom": "Zdieľajte živú spoluprácu",
"liveCollaboration": ivá spolupráca",
"duplicateSelection": "Duplikovať",
"untitled": "Bez názvu",
"name": "Meno",
@ -77,7 +77,7 @@
"group": "Zoskupiť",
"ungroup": "Zrušiť zoskupenie",
"collaborators": "Spolupracovníci",
"gridMode": "Režim mriežky",
"showGrid": "Zobraziť mriežku",
"addToLibrary": "Pridať do knižnice",
"removeFromLibrary": "Odstrániť z knižnice",
"libraryLoadingMessage": "Načítavanie knižnice…",
@ -117,7 +117,7 @@
"edit": "Upraviť",
"undo": "Späť",
"redo": "Znova",
"roomDialog": "Začať živú spoluprácu",
"resetLibrary": "Obnoviť knižnicu",
"createNewRoom": "Vytvoriť novú miestnosť",
"fullScreen": "Celá obrazovka",
"darkMode": "Tmavý režim",
@ -140,7 +140,8 @@
"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": "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"
"cannotRestoreFromImage": "Nepodarilo sa obnoviť scénu z tohto obrázkového súboru",
"resetLibrary": "Týmto vyprázdnite vašu knižnicu. Ste si istý?"
},
"toolBar": {
"selection": "Výber",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Štýly skopírované.",
"copyToClipboard": "Skopírované do schránky.",
"copyToClipboardAsPng": "Skopírované do schránky ako PNG."
"copyToClipboardAsPng": "Skopírované do schránky ako PNG.",
"fileSaved": "Súbor uložený.",
"fileSavedToFilename": "Uložený ako {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Lager",
"actions": "Åtgärder",
"language": "Språk",
"createRoom": "Dela en live-samarbetssession",
"liveCollaboration": "Samarbeta live",
"duplicateSelection": "Duplicera",
"untitled": "Namnlös",
"name": "Namn",
@ -77,7 +77,7 @@
"group": "Gruppera markering",
"ungroup": "Avgruppera markering",
"collaborators": "Medarbetare",
"gridMode": "Rutnätsläge",
"showGrid": "Visa rutnät",
"addToLibrary": "Lägg till i biblioteket",
"removeFromLibrary": "Ta bort från bibliotek",
"libraryLoadingMessage": "Laddar bibliotek…",
@ -117,7 +117,7 @@
"edit": "Redigera",
"undo": "Ångra",
"redo": "Gör om",
"roomDialog": "Starta live-samarbete",
"resetLibrary": "Återställ bibliotek",
"createNewRoom": "Skapa ett nytt rum",
"fullScreen": "Helskärm",
"darkMode": "Mörkt läge",
@ -140,7 +140,8 @@
"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": "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"
"cannotRestoreFromImage": "Skiss kunde inte återställas från denna bildfil",
"resetLibrary": "Detta kommer att rensa ditt bibliotek. Är du säker?"
},
"toolBar": {
"selection": "Markering",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "Kopierade stilar.",
"copyToClipboard": "Kopierad till urklipp.",
"copyToClipboardAsPng": "Kopierat till urklipp som PNG."
"copyToClipboardAsPng": "Kopierat till urklipp som PNG.",
"fileSaved": "Fil sparad.",
"fileSavedToFilename": "Sparad till {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "Katmanlar",
"actions": "Eylemler",
"language": "Dil",
"createRoom": "Ortak çalışma ortamını paylaş",
"liveCollaboration": "",
"duplicateSelection": "Çoğalt",
"untitled": "Adsız",
"name": "İsim",
@ -77,7 +77,7 @@
"group": "Seçimi grup yap",
"ungroup": "Seçilen grubu dağıt",
"collaborators": "Ortaklar",
"gridMode": "Izgara modu",
"showGrid": "",
"addToLibrary": "Kütüphaneye ekle",
"removeFromLibrary": "Kütüphaneden kaldır",
"libraryLoadingMessage": "Kütüphane yükleniyor…",
@ -117,7 +117,7 @@
"edit": "Düzenle",
"undo": "Geri Al",
"redo": "Yeniden yap",
"roomDialog": "Ortak çalışma ortamı yarat",
"resetLibrary": "",
"createNewRoom": "Yeni oda oluştur",
"fullScreen": "Tam ekran",
"darkMode": "Koyu tema",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "Üçüncü taraf kitaplığı yüklerken bir hata oluştu.",
"confirmAddLibrary": "Bu, kitaplığınıza {{numShapes}} tane şekil ekleyecek. Emin misiniz?",
"imageDoesNotContainScene": "Resim ekleme şuan için desteklenmiyor.\nBir sahneyi içeri aktarmak mı istediniz? Bu dosya herhangi bir sahne içeriyor gibi durmuyor. Çıktı alırken sahneyi dahil ettiniz mi?",
"cannotRestoreFromImage": "Sahne bu dosyadan oluşturulamıyor"
"cannotRestoreFromImage": "Sahne bu dosyadan oluşturulamıyor",
"resetLibrary": ""
},
"toolBar": {
"selection": "Seçme",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "",
"copyToClipboard": "",
"copyToClipboardAsPng": ""
"copyToClipboardAsPng": "",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "Шари",
"actions": "Дії",
"language": "Мова",
"createRoom": "Поділитися сесією для спільної роботи",
"liveCollaboration": "",
"duplicateSelection": "Дублювати",
"untitled": "Без назви",
"name": "Ім’я",
@ -77,7 +77,7 @@
"group": "Групувати виділене",
"ungroup": "Розгрупувати виділене",
"collaborators": "Співавтори",
"gridMode": "Режим сітки",
"showGrid": "Показати сітку",
"addToLibrary": "Додати до бібліотеки",
"removeFromLibrary": "Видалити з бібліотеки",
"libraryLoadingMessage": "Завантажити бібліотеку…",
@ -92,7 +92,7 @@
"centerHorizontally": "Центрувати по горизонталі",
"distributeHorizontally": "Розподілити по горизонталі",
"distributeVertically": "Розподілити вертикально",
"viewMode": ""
"viewMode": "Режим перегляду"
},
"buttons": {
"clearReset": "Очистити полотно",
@ -117,7 +117,7 @@
"edit": "Редагувати",
"undo": "Відмінити",
"redo": "Повторити",
"roomDialog": "Відкрити сесію спільної роботи",
"resetLibrary": "",
"createNewRoom": "Створити нову кімнату",
"fullScreen": "Повноекранний режим",
"darkMode": "Темний режим",
@ -136,11 +136,12 @@
"decryptFailed": "Не вдалося розшифрувати дані.",
"uploadedSecurly": "Це завантаження було захищене наскрізним шифруванням, а це означає що сервер Excalidraw та інші не зможуть прочитати вміст.",
"loadSceneOverridePrompt": "Завантаження зовнішнього креслення замінить ваш наявний контент. Продовжити?",
"collabStopOverridePrompt": "",
"collabStopOverridePrompt": "Зупинка сесії перезапише ваш попередній, локально збережений малюнок. Ви впевнені?\n\n(Якщо ви хочете зберегти локальний малюнок, просто закрийте замість нього вкладку браузера.)",
"errorLoadingLibrary": "Помилка при завантаженні сторонньої бібліотеки.",
"confirmAddLibrary": "Це призведе до додавання {{numShapes}} фігур до вашої бібліотеки. Ви впевнені?",
"imageDoesNotContainScene": "Імпортування зображень на даний момент не підтримується.\n\nЧи хочете ви імпортувати сцену? Це зображення не містить ніяких даних сцен. Ви увімкнули це під час експорту?",
"cannotRestoreFromImage": "Сцена не може бути відновлена з цього файлу зображення"
"cannotRestoreFromImage": "Сцена не може бути відновлена з цього файлу зображення",
"resetLibrary": ""
},
"toolBar": {
"selection": "Виділення",
@ -235,14 +236,16 @@
"storage": "Сховище",
"title": "Статистика",
"total": "Всього",
"version": "",
"versionCopy": "",
"versionNotAvailable": "",
"version": "Версія",
"versionCopy": "Натисніть, щоб скопіювати",
"versionNotAvailable": "Версія недоступна",
"width": "Ширина"
},
"toast": {
"copyStyles": "Скопійовані стилі.",
"copyToClipboard": "",
"copyToClipboardAsPng": "Скопійовано в буфер обміну як PNG."
"copyToClipboard": "Скопіювати до буферу обміну.",
"copyToClipboardAsPng": "Скопійовано в буфер обміну як PNG.",
"fileSaved": "Файл збережено.",
"fileSavedToFilename": "Збережено в {filename}"
}
}

View File

@ -68,7 +68,7 @@
"layers": "图层",
"actions": "操作",
"language": "语言",
"createRoom": "分享实时协作会议",
"liveCollaboration": "",
"duplicateSelection": "复制",
"untitled": "无标题",
"name": "名字",
@ -77,7 +77,7 @@
"group": "组选",
"ungroup": "取消组选",
"collaborators": "协作者",
"gridMode": "网格模式",
"showGrid": "",
"addToLibrary": "添加到库中",
"removeFromLibrary": "从库中移除",
"libraryLoadingMessage": "正在加载库…",
@ -117,7 +117,7 @@
"edit": "编辑",
"undo": "撤销",
"redo": "重做",
"roomDialog": "开始实时协作",
"resetLibrary": "",
"createNewRoom": "新建会议室",
"fullScreen": "全屏",
"darkMode": "暗色主题",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "加载第三方库时出错。",
"confirmAddLibrary": "这将添加 {{numShapes}} 个形状到您的库。您确定吗?",
"imageDoesNotContainScene": "当前不支持导入图片。\n\n您想要导入画布数据吗此图像似乎不包含任何画布数据。您是否在导出过程中启用了嵌入画布的选项",
"cannotRestoreFromImage": "无法从此图像文件恢复画布"
"cannotRestoreFromImage": "无法从此图像文件恢复画布",
"resetLibrary": ""
},
"toolBar": {
"selection": "选择",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "复制样式",
"copyToClipboard": "",
"copyToClipboardAsPng": "复制为 PNG 到剪贴板"
"copyToClipboardAsPng": "复制为 PNG 到剪贴板",
"fileSaved": "",
"fileSavedToFilename": ""
}
}

View File

@ -68,7 +68,7 @@
"layers": "圖層",
"actions": "動作",
"language": "語言",
"createRoom": "建立新協作會議室",
"liveCollaboration": "即時協作",
"duplicateSelection": "複製",
"untitled": "無標題",
"name": "名稱",
@ -77,7 +77,7 @@
"group": "建立群組",
"ungroup": "取消群組",
"collaborators": "協作者",
"gridMode": "網格模式",
"showGrid": "顯示格線",
"addToLibrary": "加入資料庫",
"removeFromLibrary": "從資料庫中移除",
"libraryLoadingMessage": "資料庫讀取中…",
@ -117,7 +117,7 @@
"edit": "編輯",
"undo": "復原",
"redo": "重做",
"roomDialog": "開始即時協作",
"resetLibrary": "重設資料庫",
"createNewRoom": "建立新協作會議室",
"fullScreen": "全螢幕",
"darkMode": "深色模式",
@ -140,7 +140,8 @@
"errorLoadingLibrary": "載入第三方套件時出現錯誤。",
"confirmAddLibrary": "這將會將 {{numShapes}} 個圖形加入你的資料庫,你確定嗎?",
"imageDoesNotContainScene": "目前尚不支援載入圖片。\n您是否要載入場景此圖片中並無任何場景資料輸出時是否有選擇包含",
"cannotRestoreFromImage": "無法由此檔案回復場景。"
"cannotRestoreFromImage": "無法由此檔案回復場景。",
"resetLibrary": "這會清除您的資料庫,是否確定?"
},
"toolBar": {
"selection": "選取",
@ -243,6 +244,8 @@
"toast": {
"copyStyles": "已複製樣式",
"copyToClipboard": "複製至剪貼簿。",
"copyToClipboardAsPng": "已複製 PNG 至剪貼簿"
"copyToClipboardAsPng": "已複製 PNG 至剪貼簿",
"fileSaved": "已儲存檔案。",
"fileSavedToFilename": "儲存為 {filename}"
}
}

View File

@ -1,4 +1,4 @@
import { Point } from "./types";
import { NormalizedZoomValue, Point, Zoom } from "./types";
import { LINE_CONFIRM_THRESHOLD } from "./constants";
import { ExcalidrawLinearElement } from "./element/types";
@ -147,13 +147,16 @@ export const centerPoint = (a: Point, b: Point): Point => {
// to be considered a loop
export const isPathALoop = (
points: ExcalidrawLinearElement["points"],
/** supply if you want the loop detection to account for current zoom */
zoomValue: Zoom["value"] = 1 as NormalizedZoomValue,
): boolean => {
if (points.length >= 3) {
const [firstPoint, lastPoint] = [points[0], points[points.length - 1]];
return (
distance2d(firstPoint[0], firstPoint[1], lastPoint[0], lastPoint[1]) <=
LINE_CONFIRM_THRESHOLD
);
const [first, last] = [points[0], points[points.length - 1]];
const distance = distance2d(first[0], first[1], last[0], last[1]);
// Adjusting LINE_CONFIRM_THRESHOLD to current zoom so that when zoomed in
// really close we make the threshold smaller, and vice versa.
return distance <= LINE_CONFIRM_THRESHOLD / zoomValue;
}
return false;
};

View File

@ -12,29 +12,91 @@ The change should be grouped under one of the below section and must contain PR
Please add the latest change on the top under the correct section.
-->
## [Unreleased]
## 0.3.1
## Excalidraw API
### Fixes
- Support Excalidraw inside scrollable container [#3018](https://github.com/excalidraw/excalidraw/pull/3018)
## Excalidraw Library
### Fixes
- Allow to toggle between modes when view only mode to make UI consistent [#3009](https://github.com/excalidraw/excalidraw/pull/3009)
## 0.3.0
## Excalidraw API
### Features
- Allow host to pass [color](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L36) for [collaborator](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L27) [#2943](https://github.com/excalidraw/excalidraw/pull/2943). The unused prop `user` is now removed.
- Add `zenModeEnabled` and `gridModeEnabled` prop which enables zen mode and grid mode respectively [#2901](https://github.com/excalidraw/excalidraw/pull/2901). When this prop is used, the zen mode / grid mode will be fully controlled by the host app.
- Allow host to pass [userState](https://github.com/excalidraw/excalidraw/blob/6967d8c9851c65bb8873e2f97387749976bbe326/src/types.ts#L35) for [collaborator](https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L27) to show the current user state [#2877](https://github.com/excalidraw/excalidraw/pull/2877).
- Add `viewModeEnabled` prop which enabled the view mode [#2840](https://github.com/excalidraw/excalidraw/pull/2840). When this prop is used, the view mode will not show up in context menu is so it is fully controlled by host.
- Expose `getAppState` on `excalidrawRef` [#2834](https://github.com/excalidraw/excalidraw/pull/2834).
### Build
- Remove publicPath so host can use `__webpack_public_path__` to host the assets[#2835](https://github.com/excalidraw/excalidraw/pull/2835)
## Excalidraw Library
### Features
- Add the ability to clear library [#2997](https://github.com/excalidraw/excalidraw/pull/2997)
- Updates to Collaboration and RTL UX [#2994](https://github.com/excalidraw/excalidraw/pull/2994)
- Show toast when saving to existing file [#2988](https://github.com/excalidraw/excalidraw/pull/2988)
- Support supplying custom scale when exporting canvas [#2904](https://github.com/excalidraw/excalidraw/pull/2904)
- Show version in the stats dialog [#2908](https://github.com/excalidraw/excalidraw/pull/2908)
- Add idle detection to collaboration feature [#2877](https://github.com/excalidraw/excalidraw/pull/2877)
- Add view mode in Excalidraw [#2840](https://github.com/excalidraw/excalidraw/pull/2840)
- Increase max zoom [#2881](https://github.com/excalidraw/excalidraw/pull/2881)
- Remove copy & paste from context menu on desktop [#2872](https://github.com/excalidraw/excalidraw/pull/2872)
- Add separators on context menu [#2659](https://github.com/excalidraw/excalidraw/pull/2659)
- Add ctrl-y to redo [#2831](https://github.com/excalidraw/excalidraw/pull/2831)
- Add view mode [#2840](https://github.com/excalidraw/excalidraw/pull/2840).
- Remove `copy`, `cut`, and `paste` actions from contextmenu [#2872](https://github.com/excalidraw/excalidraw/pull/2872)
- Support `Ctrl-Y` shortcut to redo on Windows [#2831](https://github.com/excalidraw/excalidraw/pull/2831).
### Fixes
- Refresh wysiwyg position on canvas resize [#3008](https://github.com/excalidraw/excalidraw/pull/3008)
- Update the `lang` attribute with the current lang. [#2995](https://github.com/excalidraw/excalidraw/pull/2995)
- Rename 'Grid mode' to 'Show grid' [#2944](https://github.com/excalidraw/excalidraw/pull/2944)
- Deal with users on systems that don't handle emoji [#2941](https://github.com/excalidraw/excalidraw/pull/2941)
- Mobile toolbar tooltip regression [#2939](https://github.com/excalidraw/excalidraw/pull/2939)
- Hide collaborator list on mobile if empty [#2938](https://github.com/excalidraw/excalidraw/pull/2938)
- Toolbar unnecessarily eats too much width [#2924](https://github.com/excalidraw/excalidraw/pull/2924)
- Mistakenly hardcoding scale [#2925](https://github.com/excalidraw/excalidraw/pull/2925)
- Text editor not visible in dark mode [#2920](https://github.com/excalidraw/excalidraw/pull/2920)
- Incorrect z-index of text editor [#2914](https://github.com/excalidraw/excalidraw/pull/2914)
- Make scrollbars draggable when offsets are set [#2916](https://github.com/excalidraw/excalidraw/pull/2916)
- Pointer-events being disabled on free-draw [#2912](https://github.com/excalidraw/excalidraw/pull/2912)
- Track zenmode and grid mode usage [#2900](https://github.com/excalidraw/excalidraw/pull/2900)
- Disable UI pointer-events on canvas drag [#2856](https://github.com/excalidraw/excalidraw/pull/2856)
- Stop flooring scroll positions [#2883](https://github.com/excalidraw/excalidraw/pull/2883)
- Apply initialData appState for zenmode and grid stats and refactor check param for actions [#2871](https://github.com/excalidraw/excalidraw/pull/2871)
- Show correct state of Nerd stats in context menu when nerd stats dialog closed [#2874](https://github.com/excalidraw/excalidraw/pull/2874)
- Remote pointers not accounting for offset [#2855](https://github.com/excalidraw/excalidraw/pull/2855)
- Toggle help dialog when "shift+?" is pressed [#2828](https://github.com/excalidraw/excalidraw/pull/2828)
- Add safe check for process so Excalidraw can be loaded via script [#2824](https://github.com/excalidraw/excalidraw/pull/2824)
- Fix UI pointer-events not disabled when dragging on canvas [#2856](https://github.com/excalidraw/excalidraw/pull/2856).
- Fix remote pointers not accounting for offset [#2855](https://github.com/excalidraw/excalidraw/pull/2855).
### Refactor
- Remove duplicate key handling [#2878](https://github.com/excalidraw/excalidraw/pull/2878)
- Reuse scss variables in js for SSOT [#2867](https://github.com/excalidraw/excalidraw/pull/2867)
- Rename browser-nativefs to browser-fs-access [#2862](https://github.com/excalidraw/excalidraw/pull/2862)
- Rewrite collabWrapper to remove TDZs and simplify [#2834](https://github.com/excalidraw/excalidraw/pull/2834)
### Chore
- Use `Sentence case` for `Live collaboration`
## 0.2.1
## Excalidraw API

View File

@ -18,7 +18,15 @@ yarn add react react-dom @excalidraw/excalidraw
After installation you will see a folder `excalidraw-assets` in `dist` directory which contains the assets needed for this app.
Move the folder `excalidraw-assets` to the path where your assets are served. In the example its served from `public/excalidraw-assets`
Move the folder `excalidraw-assets` to the path where your assets are served.
By default it will try to load the files from `{rootUrl}/excalidraw-assets/`
With **Webpack**, if you want to load the files from different path you can use <pre><a href="https://webpack.js.org/guides/public-path/#on-the-fly">`__webpack_public_path__`</a></pre>.
With **create-react-app**, the assets can be served from `public/static/js/excalidraw-assets`since CRA tries to load the assets from `{rootUrl}/static/js` path by default.
You can update the value of `PUBLIC_URL` if you want to serve it from a different URL.
### Demo
@ -26,31 +34,43 @@ Move the folder `excalidraw-assets` to the path where your assets are served. In
### Usage
1. If you are using a Web bundler (for instance, Webpack), you can import it as an ES6 module as shown below
```js
import React, { useEffect, useState, createRef } from "react";
import React, { useEffect, useState, useRef } from "react";
import Excalidraw from "@excalidraw/excalidraw";
import InitialData from "./initialData";
import "./styles.css";
import "./styles.scss";
export default function App() {
const excalidrawRef = createRef();
const excalidrawRef = useRef(null);
const excalidrawWrapperRef = useRef(null);
const [dimensions, setDimensions] = useState({
width: window.innerWidth,
height: window.innerHeight,
width: undefined,
height: undefined,
});
const [viewModeEnabled, setViewModeEnabled] = useState(false);
const [zenModeEnabled, setZenModeEnabled] = useState(false);
const [gridModeEnabled, setGridModeEnabled] = useState(false);
useEffect(() => {
setDimensions({
width: excalidrawWrapperRef.current.getBoundingClientRect().width,
height: excalidrawWrapperRef.current.getBoundingClientRect().height,
});
const onResize = () => {
setDimensions({
width: window.innerWidth,
height: window.innerHeight,
width: excalidrawWrapperRef.current.getBoundingClientRect().width,
height: excalidrawWrapperRef.current.getBoundingClientRect().height,
});
};
window.addEventListener("resize", onResize);
return () => window.removeEventListener("resize", onResize);
}, []);
}, [excalidrawWrapperRef]);
const updateScene = () => {
const sceneData = {
@ -86,31 +106,60 @@ export default function App() {
return (
<div className="App">
<button className="update-scene" onClick={updateScene}>
Update Scene
</button>
<button
className="reset-scene"
onClick={() => {
excalidrawRef.current.resetScene();
}}
>
Reset Scene
</button>
<div className="excalidraw-wrapper">
<h1> Excalidraw Example</h1>
<div className="button-wrapper">
<button className="update-scene" onClick={updateScene}>
Update Scene
</button>
<button
className="reset-scene"
onClick={() => {
excalidrawRef.current.resetScene();
}}
>
Reset Scene
</button>
<label>
<input
type="checkbox"
checked={viewModeEnabled}
onChange={() => setViewModeEnabled(!viewModeEnabled)}
/>
View mode
</label>
<label>
<input
type="checkbox"
checked={zenModeEnabled}
onChange={() => setZenModeEnabled(!zenModeEnabled)}
/>
Zen mode
</label>
<label>
<input
type="checkbox"
checked={gridModeEnabled}
onChange={() => setGridModeEnabled(!gridModeEnabled)}
/>
Grid mode
</label>
</div>
<div className="excalidraw-wrapper" ref={excalidrawWrapperRef}>
<Excalidraw
ref={excalidrawRef}
width={dimensions.width}
height={dimensions.height}
initialData={InitialData}
onChange={(elements, state) => {
console.log("Latest elements:", elements, "Latest state:", state);
}}
user={{ name: "Excalidraw User" }}
onPointerUpdate={(pointerData) => console.log(pointerData)}
onCollabButtonClick={() => {
window.alert("You clicked on collab button");
}}
onChange={(elements, state) =>
console.log("Elements :", elements, "State : ", state)
}
onPointerUpdate={(payload) => console.log(payload)}
onCollabButtonClick={() =>
window.alert("You clicked on collab button")
}
viewModeEnabled={viewModeEnabled}
zenModeEnabled={zenModeEnabled}
gridModeEnabled={gridModeEnabled}
/>
</div>
</div>
@ -120,6 +169,68 @@ export default function App() {
[![Edit excalidraw](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/excalidraw-ehlz3?fontsize=14&hidenavigation=1&theme=dark)
2. To use it in a browser directly:
You will need to make sure `react`, `react-dom` is available as shown below.
```html
<!DOCTYPE html>
<html>
<head>
<title>Excalidraw in browser</title>
<meta charset="UTF-8" />
<script src="https://unpkg.com/react@16.14.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.13.1/umd/react-dom.development.js"></script>
<script
type="text/javascript"
src="https://unpkg.com/@excalidraw/excalidraw@0.2.2/dist/excalidraw.min.js"
></script>
</head>
<body>
<div class="container">
<h4>Excalidraw Embed Example</h4>
<div id="app"></div>
</div>
<script type="text/javascript" src="src/index.js"></script>
</body>
</html>
```
```js
import "./styles.css";
const excalidrawWrapper = document.getElementById("app");
const props = {
onChange: (data, appState) => {
console.log(data, appState);
},
};
/*eslint-disable */
ReactDOM.render(
React.createElement(Excalidraw.default, props),
excalidrawWrapper,
);
```
[![Edit excalidraw-in-browser](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/excalidraw-in-browser-tlqom?fontsize=14&hidenavigation=1&theme=dark)
Since Excalidraw doesn't support server side rendering yet so you will have to make sure the component is rendered once host is mounted.
```js
import { useState, useEffect } from "react";
export default function IndexPage() {
const [Comp, setComp] = useState(null);
useEffect(() => {
import("@excalidraw/excalidraw").then((comp) => setComp(comp.default));
});
return <>{Comp && <Comp />}</>;
}
```
### Props
| Name | Type | Default | Description |
@ -130,7 +241,6 @@ export default function App() {
| [`offsetTop`](#offsetTop) | Number | `0` | top position relative to which Excalidraw should render |
| [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. |
| [`initialData`](#initialData) | <pre>{elements?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>, appState?: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L37">AppState<a> } </pre> | null | The initial data with which app loads. |
| [`user`](#user) | `{ name?: string }` | | User details. The name refers to the name of the user to be shown |
| [`excalidrawRef`](#excalidrawRef) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) or [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) or <pre>{ current: { readyPromise: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317">resolvablePromise</a> } }</pre> | | Ref to be passed to Excalidraw |
| [`onCollabButtonClick`](#onCollabButtonClick) | Function | | Callback to be triggered when the collab button is clicked |
| [`isCollaborating`](#isCollaborating) | `boolean` | | This implies if the app is in collaboration mode |
@ -257,10 +367,6 @@ This helps to load Excalidraw with `initialData`. It must be an object or a [pro
You might want to use this when you want to load excalidraw with some initial elements and app state.
#### `user`
This is the user name which shows during collaboration. Defaults to `{name: ''}`.
#### `excalidrawRef`
You can pass a `ref` when you want to access some excalidraw APIs. We expose the below APIs:
@ -269,7 +375,7 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the
| --- | --- | --- |
| ready | `boolean` | This is set to true once Excalidraw is rendered |
| readyPromise | [resolvablePromise](https://github.com/excalidraw/excalidraw/blob/master/src/utils.ts#L317) | This promise will be resolved with the api once excalidraw has rendered. This will be helpful when you want do some action on the host app once this promise resolves. For this to work you will have to pass ref as shown [here](#readyPromise) |
| updateScene | <pre>(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L189">sceneData</a>)) => void </pre> | updates the scene with the sceneData |
| updateScene | <pre>(<a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L192">sceneData</a>)) => void </pre> | updates the scene with the sceneData |
| resetScene | `({ resetLoadingState: boolean }) => void` | Resets the scene. If `resetLoadingState` is passed as true then it will also force set the loading state to false. |
| getSceneElementsIncludingDeleted | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements including the deleted in the scene |
| getSceneElements | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a></pre> | Returns all the elements excluding the deleted in the scene |

View File

@ -18,7 +18,6 @@ const Excalidraw = (props: ExcalidrawProps) => {
offsetTop,
onChange,
initialData,
user,
excalidrawRef,
onCollabButtonClick,
isCollaborating,
@ -59,7 +58,6 @@ const Excalidraw = (props: ExcalidrawProps) => {
offsetTop={offsetTop}
onChange={onChange}
initialData={initialData}
user={user}
excalidrawRef={excalidrawRef}
onCollabButtonClick={onCollabButtonClick}
isCollaborating={isCollaborating}
@ -82,13 +80,12 @@ const areEqual = (
prevProps: PublicExcalidrawProps,
nextProps: PublicExcalidrawProps,
) => {
const { initialData: prevInitialData, user: prevUser, ...prev } = prevProps;
const { initialData: nextInitialData, user: nextUser, ...next } = nextProps;
const { initialData: prevInitialData, ...prev } = prevProps;
const { initialData: nextInitialData, ...next } = nextProps;
const prevKeys = Object.keys(prevProps) as (keyof typeof prev)[];
const nextKeys = Object.keys(nextProps) as (keyof typeof next)[];
return (
prevUser?.name === nextUser?.name &&
prevKeys.length === nextKeys.length &&
prevKeys.every((key) => prev[key] === next[key])
);

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "@excalidraw/excalidraw",
"version": "0.2.1",
"version": "0.3.1",
"main": "dist/excalidraw.min.js",
"files": [
"dist/*"
@ -41,26 +41,26 @@
"react-dom": "^17.0.1"
},
"devDependencies": {
"@babel/core": "7.12.10",
"@babel/plugin-transform-arrow-functions": "7.12.1",
"@babel/plugin-transform-async-to-generator": "7.12.1",
"@babel/plugin-transform-runtime": "7.12.10",
"@babel/plugin-transform-typescript": "7.12.1",
"@babel/preset-env": "7.12.11",
"@babel/preset-react": "7.12.10",
"@babel/preset-typescript": "7.12.7",
"@babel/core": "7.12.16",
"@babel/plugin-transform-arrow-functions": "7.12.13",
"@babel/plugin-transform-async-to-generator": "7.12.13",
"@babel/plugin-transform-runtime": "7.12.15",
"@babel/plugin-transform-typescript": "7.12.16",
"@babel/preset-env": "7.12.16",
"@babel/preset-react": "7.12.13",
"@babel/preset-typescript": "7.12.16",
"babel-loader": "8.2.2",
"babel-plugin-transform-class-properties": "6.24.1",
"cross-env": "7.0.3",
"css-loader": "5.0.1",
"css-loader": "5.0.2",
"file-loader": "6.2.0",
"mini-css-extract-plugin": "1.3.5",
"sass-loader": "10.1.1",
"mini-css-extract-plugin": "1.3.6",
"sass-loader": "11.0.1",
"terser-webpack-plugin": "5.1.1",
"ts-loader": "8.0.14",
"webpack": "5.19.0",
"ts-loader": "8.0.17",
"webpack": "5.21.2",
"webpack-bundle-analyzer": "4.4.0",
"webpack-cli": "4.4.0"
"webpack-cli": "4.5.0"
},
"bugs": "https://github.com/excalidraw/excalidraw/issues",
"repository": "https://github.com/excalidraw/excalidraw",

View File

@ -13,7 +13,6 @@ module.exports = {
library: "Excalidraw",
libraryTarget: "umd",
filename: "[name].js",
publicPath: "/",
chunkFilename: "excalidraw-assets/[name].js",
},
resolve: {

File diff suppressed because it is too large Load Diff

View File

@ -34,21 +34,21 @@
]
},
"devDependencies": {
"@babel/core": "7.12.10",
"@babel/plugin-transform-arrow-functions": "7.12.1",
"@babel/plugin-transform-async-to-generator": "7.12.1",
"@babel/core": "7.12.16",
"@babel/plugin-transform-arrow-functions": "7.12.13",
"@babel/plugin-transform-async-to-generator": "7.12.13",
"@babel/plugin-transform-runtime": "^7.12.10",
"@babel/plugin-transform-typescript": "7.12.1",
"@babel/preset-env": "7.12.11",
"@babel/preset-typescript": "7.12.7",
"@babel/plugin-transform-typescript": "7.12.16",
"@babel/preset-env": "7.12.16",
"@babel/preset-typescript": "7.12.16",
"babel-loader": "8.2.2",
"babel-plugin-transform-class-properties": "6.24.1",
"cross-env": "7.0.3",
"file-loader": "6.2.0",
"ts-loader": "8.0.14",
"webpack": "5.19.0",
"ts-loader": "8.0.17",
"webpack": "5.21.2",
"webpack-bundle-analyzer": "4.4.0",
"webpack-cli": "4.4.0"
"webpack-cli": "4.5.0"
},
"bugs": "https://github.com/excalidraw/excalidraw/issues",
"repository": "https://github.com/excalidraw/excalidraw",

View File

@ -313,7 +313,7 @@ export const renderScene = (
if (sceneState.remoteSelectedElementIds[element.id]) {
selectionColors.push(
...sceneState.remoteSelectedElementIds[element.id].map((socketId) => {
const { background } = getClientColors(socketId);
const { background } = getClientColors(socketId, appState);
return background;
}),
);
@ -441,7 +441,7 @@ export const renderScene = (
y = Math.max(y, 0);
y = Math.min(y, normalizedCanvasHeight - height);
const { background, stroke } = getClientColors(clientId);
const { background, stroke } = getClientColors(clientId, appState);
const strokeStyle = context.strokeStyle;
const fillStyle = context.fillStyle;

View File

@ -33,6 +33,10 @@ export type Collaborator = {
selectedElementIds?: AppState["selectedElementIds"];
username?: string | null;
userState?: UserIdleState;
color?: {
background: string;
stroke: string;
};
};
export type AppState = {
@ -166,9 +170,6 @@ export interface ExcalidrawProps {
appState: AppState,
) => void;
initialData?: ImportedDataState | null | Promise<ImportedDataState | null>;
user?: {
name?: string | null;
};
excalidrawRef?: ForwardRef<ExcalidrawAPIRefValue>;
onCollabButtonClick?: () => void;
isCollaborating?: boolean;

View File

@ -1,25 +1,32 @@
{
"headers": [
"routes": [
{
"source": "/(.*)",
"headers": [
{
"key": "Access-Control-Allow-Origin",
"value": "*"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "Feature-Policy",
"value": "*"
},
{
"key": "Referrer-Policy",
"value": "origin"
}
]
"src": "/",
"dest": "/",
"headers": {
"Access-Control-Allow-Origin": "*",
"X-Content-Type-Options": "nosniff",
"Feature-Policy": "*",
"Referrer-Policy": "origin"
}
},
{
"src": "/#json=.*",
"dest": "/",
"headers": {
"Access-Control-Allow-Origin": "*",
"X-Content-Type-Options": "nosniff",
"Feature-Policy": "*",
"Referrer-Policy": "origin"
}
},
{
"handle": "filesystem"
},
{
"src": "/(.+)",
"dest": "/",
"status": 301
}
]
}