@excalidraw/excalidraw 0.18.0-4e758db → 0.18.0-4f68076

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/dev/{chunk-NSFXTDWY.js → chunk-FEJNYWVA.js} +20 -3
  3. package/dist/dev/chunk-FEJNYWVA.js.map +7 -0
  4. package/dist/dev/{chunk-AO643733.js → chunk-KMZYJ2CN.js} +153 -80
  5. package/dist/dev/chunk-KMZYJ2CN.js.map +7 -0
  6. package/dist/dev/data/{image-OGAD6TRQ.js → image-GQWXOMCO.js} +2 -2
  7. package/dist/dev/index.css +469 -167
  8. package/dist/dev/index.css.map +3 -3
  9. package/dist/dev/index.js +9683 -7504
  10. package/dist/dev/index.js.map +4 -4
  11. package/dist/dev/locales/{en-DACNMKF5.js → en-XCQUEBFE.js} +4 -2
  12. package/dist/prod/chunk-3UZ67F5C.js +12 -0
  13. package/dist/prod/chunk-H5A3YXKD.js +4 -0
  14. package/dist/prod/data/image-6XY3GD3F.js +1 -0
  15. package/dist/prod/index.css +1 -1
  16. package/dist/prod/index.js +31 -31
  17. package/dist/prod/locales/en-APPZPZFQ.js +1 -0
  18. package/dist/types/common/src/constants.d.ts +10 -0
  19. package/dist/types/common/src/utils.d.ts +5 -0
  20. package/dist/types/element/src/binding.d.ts +13 -7
  21. package/dist/types/element/src/collision.d.ts +14 -5
  22. package/dist/types/element/src/duplicate.d.ts +60 -0
  23. package/dist/types/element/src/index.d.ts +1 -0
  24. package/dist/types/element/src/listMarker.d.ts +34 -0
  25. package/dist/types/element/src/newElement.d.ts +15 -1
  26. package/dist/types/element/src/renderElement.d.ts +21 -4
  27. package/dist/types/element/src/shape.d.ts +15 -1
  28. package/dist/types/element/src/textElement.d.ts +7 -0
  29. package/dist/types/element/src/utils.d.ts +8 -1
  30. package/dist/types/element/src/zindex.d.ts +1 -1
  31. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +30 -3
  32. package/dist/types/excalidraw/actions/actionBoundText.d.ts +20 -2
  33. package/dist/types/excalidraw/actions/actionCanvas.d.ts +70 -7
  34. package/dist/types/excalidraw/actions/actionClipboard.d.ts +20 -2
  35. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +10 -1
  36. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +30 -3
  37. package/dist/types/excalidraw/actions/actionDeselect.d.ts +13 -1
  38. package/dist/types/excalidraw/actions/actionElementLink.d.ts +10 -1
  39. package/dist/types/excalidraw/actions/actionElementLock.d.ts +20 -2
  40. package/dist/types/excalidraw/actions/actionExport.d.ts +20 -2
  41. package/dist/types/excalidraw/actions/actionFrame.d.ts +30 -3
  42. package/dist/types/excalidraw/actions/actionGroup.d.ts +20 -2
  43. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +10 -1
  44. package/dist/types/excalidraw/actions/actionLink.d.ts +10 -1
  45. package/dist/types/excalidraw/actions/actionMenu.d.ts +10 -1
  46. package/dist/types/excalidraw/actions/actionProperties.d.ts +20 -2
  47. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +10 -1
  48. package/dist/types/excalidraw/actions/actionStyles.d.ts +10 -1
  49. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +10 -1
  50. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +10 -1
  51. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +10 -1
  52. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +10 -1
  53. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +10 -1
  54. package/dist/types/excalidraw/actions/actionToggleShowHints.d.ts +197 -0
  55. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +10 -1
  56. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +10 -1
  57. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +10 -1
  58. package/dist/types/excalidraw/actions/index.d.ts +1 -0
  59. package/dist/types/excalidraw/actions/types.d.ts +1 -1
  60. package/dist/types/excalidraw/appState.d.ts +2 -0
  61. package/dist/types/excalidraw/components/App.arrowText.d.ts +5 -39
  62. package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
  63. package/dist/types/excalidraw/components/App.d.ts +82 -262
  64. package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -0
  65. package/dist/types/excalidraw/components/App.modifiers.d.ts +38 -0
  66. package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
  67. package/dist/types/excalidraw/components/App.selectionTool.d.ts +57 -0
  68. package/dist/types/excalidraw/components/App.text.d.ts +146 -0
  69. package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
  70. package/dist/types/excalidraw/components/App.viewport.d.ts +41 -1
  71. package/dist/types/excalidraw/components/App.wheel.d.ts +3 -10
  72. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +2 -0
  73. package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
  74. package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
  75. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
  76. package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
  77. package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
  78. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
  79. package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
  80. package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
  81. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
  82. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
  83. package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
  84. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +1 -0
  85. package/dist/types/excalidraw/data/blob.d.ts +20 -2
  86. package/dist/types/excalidraw/data/json.d.ts +10 -1
  87. package/dist/types/excalidraw/index.d.ts +1 -1
  88. package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
  89. package/dist/types/excalidraw/scene/Renderer.d.ts +14 -1
  90. package/dist/types/excalidraw/scene/types.d.ts +2 -1
  91. package/dist/types/excalidraw/types.d.ts +92 -19
  92. package/dist/types/excalidraw/viewport.d.ts +23 -1
  93. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +12 -1
  94. package/package.json +4 -4
  95. package/dist/dev/chunk-AO643733.js.map +0 -7
  96. package/dist/dev/chunk-NSFXTDWY.js.map +0 -7
  97. package/dist/prod/chunk-ISPTBLVO.js +0 -12
  98. package/dist/prod/chunk-URQHFSVW.js +0 -4
  99. package/dist/prod/data/image-ZKZKKFBR.js +0 -1
  100. package/dist/prod/locales/en-JTHJ2SIP.js +0 -1
  101. package/dist/types/excalidraw/components/ColorPicker/topPicksDnD.d.ts +0 -31
  102. /package/dist/dev/data/{image-OGAD6TRQ.js.map → image-GQWXOMCO.js.map} +0 -0
  103. /package/dist/dev/locales/{en-DACNMKF5.js.map → en-XCQUEBFE.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -16,7 +16,7 @@ Please add the latest change on the top under the correct section.
16
16
  ### Wheel navigation (2026-09-13) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
17
17
 
18
18
  - Scrolling while holding the wheel (middle) mouse button zooms the canvas around the pointer, the same as ctrl/cmd+wheel — a wheel-button pan can be zoomed one-handed, without reaching for a modifier.
19
- - New `appState.inputDevice` preference (`"auto" | "mouse" | "trackpad"`, default `"auto"`, persisted in browser storage) selecting the wheel mappings. With `"trackpad"` a plain wheel pans and ctrl/cmd+wheel (how a pinch is delivered) zooms, as before; with `"mouse"` a plain wheel zooms and ctrl/cmd+wheel pans vertically instead, while shift+wheel keeps panning horizontally and the wheel-button zoom above is unaffected. `"auto"` is reserved for detecting the device from the wheel events and resolves to `"trackpad"` until that is implemented (`resolveInputDevice()`). Set it from the new "Input device" radio in the main menu's preferences submenu, also exposed as `MainMenu.DefaultItems.Preferences.InputDevice`.
19
+ - New `appState.inputDevice` preference (`"auto" | "mouse" | "trackpad"`, default `"auto"`, persisted in browser storage) selecting the wheel mappings. With `"trackpad"` a plain wheel pans; with `"mouse"` a plain wheel zooms. Ctrl/cmd+wheel (how a pinch is delivered) zooms with either device. Shift+wheel pans horizontally, and ctrl/cmd+shift+wheel pans vertically. The wheel-button zoom above is unaffected. `"auto"` is reserved for detecting the device from the wheel events and resolves to `"trackpad"` until that is implemented (`resolveInputDevice()`). Set it from the new "Input device" radio in the main menu's preferences submenu, also exposed as `MainMenu.DefaultItems.Preferences.InputDevice`.
20
20
 
21
21
  ### Sticky notes (2026-09-06) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
22
22
 
@@ -31,6 +31,18 @@ Please add the latest change on the top under the correct section.
31
31
 
32
32
  ## Excalidraw API
33
33
 
34
+ ### `setViewport` stops following a collaborator (2026-09-26) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
35
+
36
+ - `setViewport` now asks to stop following a collaborator whenever it navigates (`onUserFollow` with `action: "UNFOLLOW"`, if `userToFollow` is set), as a user's pan or zoom does. `setViewport(null)` (clearing a lock) and a target that doesn't resolve don't navigate, and leave following alone.
37
+
38
+ ### `onDuplicate` can replace and veto duplicates (2026-09-18) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
39
+
40
+ - `props.onDuplicate` may now return new objects for the duplicated elements in every duplication path. Previously the editor kept using the objects it created, so on paste (and library insert) the frame assignment and bound text redraw went to objects that were no longer in the scene, and alt-drag dragged an element that wasn't in the scene. The returned changes are now merged into the editor's duplicates, so they're part of the duplication's own undo entry and durable increment (no follow-up `updateScene` needed).
41
+ - When pasting or inserting onto a frame, the duplicates passed to `onDuplicate` already have their `frameId` set (and are ordered under the frame).
42
+ - Omitting a duplicate from the returned array (or returning it as deleted) now reliably prevents that element from being duplicated — previously pasting over a frame brought it back, and alt-drag broke. References to it from the remaining duplicates (bindings, `boundElements`, `frameId`) are cleared, and a bound text isn't duplicated without its container. If no duplicate remains, the duplication is cancelled and the returned elements are ignored: paste and the duplicate action do nothing, and alt-drag moves the original elements instead. When only some duplicates are vetoed during alt-drag, their originals stay where they were.
43
+ - `onDuplicate` may return `false` to prevent the duplication as a whole (same as omitting every duplicate, without having to find them).
44
+ - `onDuplicate` receives a third argument with lookups covering just the elements taking part in the duplication, so you don't have to derive them by scanning the scene: `{ duplicateElements, originalElements, origIdToDuplicateId, duplicateIdToOrigId }` — the duplicates by id, the elements they were made from by id, and their ids mapped in both directions (`duplicateIdToOrigId` to look up a duplicate's original while modifying it, `origIdToDuplicateId` e.g. for remapping element ids you keep in `customData`). On paste and library insert the originals are the inserted elements, which aren't part of the scene. The maps are read-only.
45
+
34
46
  ### Host-controlled active tool (2026-07-14) [#11665](https://github.com/excalidraw/excalidraw/pull/11665)
35
47
 
36
48
  - Added `activeTool` prop (`{ type: ToolType } | { type: "custom"; customType: string }`) for forcing the active editor tool (controlled). While set, user- and API-driven tool switching is ignored — `setActiveTool` refuses non-matching activations with a console warning, non-forced toolbar buttons render disabled, and the tool-lock toggle (`Q`) is inert — and the editor snaps back if internal flows reset the tool (e.g. `restore()` on scene load). The forced tool behaves as if locked — it doesn't revert to selection after use and drawn elements aren't auto-selected — without mutating `appState.activeTool.locked`, so the user's persisted padlock preference stays untouched. Unset the prop to return tool control to the editor (the current tool stays active). The forced tool must be activatable to take effect — not disabled via `UIOptions.tools`, and (while non-interactive) allowed via `interaction.enabled.tools`; otherwise the editor stays on the `selection` tool and applies the forced tool once it becomes activatable. `image` cannot be forced (its activation opens the file picker). Composes with `interaction.enabled.tools` for presentation-style hosts: force `laser` for the presenter, `selection` + `interaction={false}` for viewers.
@@ -2,6 +2,7 @@
2
2
  var labels = {
3
3
  signUp: "Sign up",
4
4
  signIn: "Sign in",
5
+ upgrade: "Upgrade",
5
6
  paste: "Paste",
6
7
  pasteAsPlaintext: "Paste as plaintext",
7
8
  pasteCharts: "Paste charts",
@@ -197,6 +198,7 @@ var labels = {
197
198
  boxSelectionOverlap: "Overlap",
198
199
  arrowBinding: "Arrow binding",
199
200
  midpointSnapping: "Snap to midpoints",
201
+ showHints: "Show hints",
200
202
  inputDevice: "Input",
201
203
  inputDeviceTrackpad: "Trackpad",
202
204
  inputDeviceMouse: "Mouse"
@@ -249,6 +251,7 @@ var buttons = {
249
251
  undo: "Undo",
250
252
  redo: "Redo",
251
253
  resetLibrary: "Reset library",
254
+ reset: "Reset",
252
255
  createNewRoom: "Create new room",
253
256
  fullScreen: "Full screen",
254
257
  darkMode: "Dark mode",
@@ -400,6 +403,7 @@ var hints = {
400
403
  bindTextToElement: "{{shortcut}} to add text",
401
404
  createFlowchart: "{{shortcut}} to create a flowchart",
402
405
  deepBoxSelect: "Hold {{shortcut}} to deep select, and to prevent dragging",
406
+ cycleSelection: "{{shortcut}}-click to cycle selection, or drag to duplicate",
403
407
  eraserRevert: "Hold {{shortcut}} to revert the elements marked for deletion",
404
408
  firefox_clipboard_write: 'This feature can likely be enabled by setting the "dom.events.asyncClipboard.clipboardItem" flag to "true". To change the browser flags in Firefox, visit the "about:config" page.',
405
409
  disableSnapping: "Hold {{shortcut}} to disable snapping",
@@ -657,6 +661,15 @@ var overwriteConfirm = {
657
661
  }
658
662
  }
659
663
  };
664
+ var fileDrop = {
665
+ replace: "Drop to replace content",
666
+ add: "Drop to add to canvas",
667
+ importLibrary: "Drop to import library",
668
+ replaceHint: "Hold <shift>Shift</shift> to keep existing content",
669
+ keepHint: "Your existing content will be kept",
670
+ libraryHint: "Library files will append",
671
+ replacedToast: "Content replaced. {{shortcut}} to undo"
672
+ };
660
673
  var mermaid = {
661
674
  title: "Mermaid to Excalidraw",
662
675
  button: "Insert",
@@ -664,7 +677,7 @@ var mermaid = {
664
677
  syntax: "Mermaid Syntax",
665
678
  preview: "Preview",
666
679
  label: "Mermaid",
667
- inputPlaceholder: "Write Mermaid diagram defintion here...",
680
+ inputPlaceholder: "Write Mermaid diagram definition here...",
668
681
  autoFixAvailable: "Auto-fix is available"
669
682
  };
670
683
  var ttd = {
@@ -722,7 +735,9 @@ var fontList = {
722
735
  },
723
736
  sceneFonts: "In this scene",
724
737
  availableFonts: "Available fonts",
725
- empty: "No fonts found"
738
+ empty: "No fonts found",
739
+ topPicksTip: "Tip: drag any font onto your top picks to pin it",
740
+ resetTopPicks: "Reset to default top picks"
726
741
  };
727
742
  var userList = {
728
743
  empty: "No users found",
@@ -794,6 +809,7 @@ var en_default = {
794
809
  welcomeScreen,
795
810
  colorPicker,
796
811
  overwriteConfirm,
812
+ fileDrop,
797
813
  mermaid,
798
814
  ttd,
799
815
  chat,
@@ -837,6 +853,7 @@ export {
837
853
  welcomeScreen,
838
854
  colorPicker,
839
855
  overwriteConfirm,
856
+ fileDrop,
840
857
  mermaid,
841
858
  ttd,
842
859
  chat,
@@ -847,4 +864,4 @@ export {
847
864
  keys,
848
865
  en_default
849
866
  };
850
- //# sourceMappingURL=chunk-NSFXTDWY.js.map
867
+ //# sourceMappingURL=chunk-FEJNYWVA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../locales/en.json"],
4
+ "sourcesContent": ["{\n \"labels\": {\n \"signUp\": \"Sign up\",\n \"signIn\": \"Sign in\",\n \"upgrade\": \"Upgrade\",\n \"paste\": \"Paste\",\n \"pasteAsPlaintext\": \"Paste as plaintext\",\n \"pasteCharts\": \"Paste charts\",\n \"chartType_bar\": \"Bar chart\",\n \"chartType_line\": \"Line chart\",\n \"chartType_radar\": \"Radar chart\",\n \"chartType_plaintext\": \"Plain text\",\n \"selectAll\": \"Select all\",\n \"multiSelect\": \"Add element to selection\",\n \"moveCanvas\": \"Move canvas\",\n \"cut\": \"Cut\",\n \"copy\": \"Copy\",\n \"copyAsPng\": \"Copy to clipboard as PNG\",\n \"copyAsSvg\": \"Copy to clipboard as SVG\",\n \"copyText\": \"Copy to clipboard as text\",\n \"copySource\": \"Copy source to clipboard\",\n \"convertToCode\": \"Convert to code\",\n \"bringForward\": \"Bring forward\",\n \"sendToBack\": \"Send to back\",\n \"bringToFront\": \"Bring to front\",\n \"sendBackward\": \"Send backward\",\n \"delete\": \"Delete\",\n \"copyStyles\": \"Copy styles\",\n \"pasteStyles\": \"Paste styles\",\n \"stroke\": \"Stroke\",\n \"textColor\": \"Text color\",\n \"changeStroke\": \"Change stroke color\",\n \"background\": \"Background\",\n \"changeBackground\": \"Change background color\",\n \"fill\": \"Fill\",\n \"strokeWidth\": \"Stroke width\",\n \"strokeStyle\": \"Stroke style\",\n \"strokeStyle_solid\": \"Solid\",\n \"strokeStyle_dashed\": \"Dashed\",\n \"strokeStyle_dotted\": \"Dotted\",\n \"sloppiness\": \"Sloppiness\",\n \"pressure\": \"Pressure\",\n \"pressure_constant\": \"Constant\",\n \"pressure_variable\": \"Variable\",\n \"opacity\": \"Opacity\",\n \"textAlign\": \"Text align\",\n \"edges\": \"Edges\",\n \"sharp\": \"Sharp\",\n \"round\": \"Round\",\n \"arrowheads\": \"Arrowheads\",\n \"arrowhead_none\": \"None\",\n \"arrowhead_arrow\": \"Arrow\",\n \"arrowhead_bar\": \"Bar\",\n \"arrowhead_circle\": \"Circle\",\n \"arrowhead_circle_outline\": \"Circle (outline)\",\n \"arrowhead_triangle\": \"Triangle\",\n \"arrowhead_triangle_outline\": \"Triangle (outline)\",\n \"arrowhead_diamond\": \"Diamond\",\n \"arrowhead_diamond_outline\": \"Diamond (outline)\",\n \"arrowhead_crowfoot_many\": \"Crow's foot (many)\",\n \"arrowhead_crowfoot_one\": \"Crow's foot (one)\",\n \"arrowhead_crowfoot_one_or_many\": \"Crow's foot (one or many)\",\n \"arrowhead_cardinality_one\": \"Cardinality (one)\",\n \"arrowhead_cardinality_many\": \"Cardinality (many)\",\n \"arrowhead_cardinality_one_or_many\": \"Cardinality (one or many)\",\n \"arrowhead_cardinality_exactly_one\": \"Cardinality (exactly one)\",\n \"arrowhead_cardinality_zero_or_one\": \"Cardinality (zero or one)\",\n \"arrowhead_cardinality_zero_or_many\": \"Cardinality (zero or many)\",\n \"more_options\": \"More options\",\n \"cardinality\": \"Cardinality\",\n \"arrowtypes\": \"Arrow type\",\n \"arrowtype_sharp\": \"Sharp arrow\",\n \"arrowtype_round\": \"Curved arrow\",\n \"arrowtype_elbowed\": \"Elbow arrow\",\n \"fontSize\": \"Font size\",\n \"fontFamily\": \"Font family\",\n \"addWatermark\": \"Add \\\"Made with Excalidraw\\\"\",\n \"handDrawn\": \"Hand-drawn\",\n \"normal\": \"Normal\",\n \"code\": \"Code\",\n \"small\": \"Small\",\n \"medium\": \"Medium\",\n \"large\": \"Large\",\n \"veryLarge\": \"Very large\",\n \"solid\": \"Solid\",\n \"hachure\": \"Hachure\",\n \"zigzag\": \"Zigzag\",\n \"crossHatch\": \"Cross-hatch\",\n \"thin\": \"Thin\",\n \"bold\": \"Bold\",\n \"left\": \"Left\",\n \"center\": \"Center\",\n \"right\": \"Right\",\n \"extraBold\": \"Extra bold\",\n \"architect\": \"Architect\",\n \"artist\": \"Artist\",\n \"cartoonist\": \"Cartoonist\",\n \"fileTitle\": \"File name\",\n \"colorPicker\": \"Color picker\",\n \"canvasColors\": \"Used on canvas\",\n \"canvasBackground\": \"Canvas background\",\n \"drawingCanvas\": \"Drawing canvas\",\n \"clearCanvas\": \"Clear canvas\",\n \"layers\": \"Layers\",\n \"actions\": \"Actions\",\n \"language\": \"Language\",\n \"liveCollaboration\": \"Live collaboration...\",\n \"duplicateSelection\": \"Duplicate\",\n \"untitled\": \"Untitled\",\n \"name\": \"Name\",\n \"yourName\": \"Your name\",\n \"madeWithExcalidraw\": \"Made with Excalidraw\",\n \"group\": \"Group selection\",\n \"ungroup\": \"Ungroup selection\",\n \"collaborators\": \"Collaborators\",\n \"you\": \"You\",\n \"toggleGrid\": \"Toggle grid\",\n \"addToLibrary\": \"Add to library\",\n \"removeFromLibrary\": \"Remove from library\",\n \"libraryLoadingMessage\": \"Loading library\u2026\",\n \"libraries\": \"Browse libraries\",\n \"loadingScene\": \"Loading scene\u2026\",\n \"loadScene\": \"Load scene from file\",\n \"align\": \"Align\",\n \"alignTop\": \"Align top\",\n \"alignBottom\": \"Align bottom\",\n \"alignLeft\": \"Align left\",\n \"alignRight\": \"Align right\",\n \"centerVertically\": \"Center vertically\",\n \"centerHorizontally\": \"Center horizontally\",\n \"distributeHorizontally\": \"Distribute horizontally\",\n \"distributeVertically\": \"Distribute vertically\",\n \"flipHorizontal\": \"Flip horizontal\",\n \"flipVertical\": \"Flip vertical\",\n \"viewMode\": \"View mode\",\n \"share\": \"Share\",\n \"showStroke\": \"Show stroke color picker\",\n \"showBackground\": \"Show background color picker\",\n \"showFonts\": \"Show font picker\",\n \"toggleTheme\": \"Toggle light/dark theme\",\n \"theme\": \"Theme\",\n \"personalLib\": \"Personal Library\",\n \"excalidrawLib\": \"Excalidraw Library\",\n \"decreaseFontSize\": \"Decrease font size\",\n \"increaseFontSize\": \"Increase font size\",\n \"unbindText\": \"Unbind text\",\n \"bindText\": \"Bind text to the container\",\n \"createContainerFromText\": \"Wrap text in a container\",\n \"link\": {\n \"edit\": \"Edit link\",\n \"editEmbed\": \"Edit embeddable link\",\n \"create\": \"Add link\",\n \"label\": \"Link\",\n \"labelEmbed\": \"Link & embed\",\n \"empty\": \"No link is set\",\n \"hint\": \"Type or paste your link here\",\n \"goToElement\": \"Go to target element\"\n },\n \"lineEditor\": {\n \"edit\": \"Edit line\",\n \"editArrow\": \"Edit arrow\"\n },\n \"polygon\": {\n \"breakPolygon\": \"Break polygon\",\n \"convertToPolygon\": \"Convert to polygon\"\n },\n \"elementLock\": {\n \"lock\": \"Lock\",\n \"unlock\": \"Unlock\",\n \"lockAll\": \"Lock all\",\n \"unlockAll\": \"Unlock all\"\n },\n \"statusPublished\": \"Published\",\n \"sidebarLock\": \"Keep sidebar open\",\n \"selectAllElementsInFrame\": \"Select all elements in frame\",\n \"removeAllElementsFromFrame\": \"Remove all elements from frame\",\n \"eyeDropper\": \"Pick color from canvas\",\n \"textToDiagram\": \"Text to diagram\",\n \"prompt\": \"Prompt\",\n \"followUs\": \"Follow us\",\n \"discordChat\": \"Discord chat\",\n \"zoomToFitViewport\": \"Zoom to fit in viewport\",\n \"zoomToFitSelection\": \"Zoom to fit selection\",\n \"zoomToFit\": \"Zoom to fit all elements\",\n \"installPWA\": \"Install Excalidraw locally (PWA)\",\n \"autoResize\": \"Enable text auto-resizing\",\n \"imageCropping\": \"Image cropping\",\n \"unCroppedDimension\": \"Uncropped dimension\",\n \"copyElementLink\": \"Copy link to object\",\n \"linkToElement\": \"Link to object\",\n \"wrapSelectionInFrame\": \"Wrap selection in frame\",\n \"tab\": \"Tab\",\n \"shapeSwitch\": \"Switch shape\",\n \"preferences\": \"Preferences\",\n \"preferences_toolLock\": \"Tool lock\",\n \"boxSelectionMode\": \"Select on\",\n \"boxSelectionContain\": \"Wrap\",\n \"boxSelectionOverlap\": \"Overlap\",\n \"arrowBinding\": \"Arrow binding\",\n \"midpointSnapping\": \"Snap to midpoints\",\n \"showHints\": \"Show hints\",\n \"inputDevice\": \"Input\",\n \"inputDeviceTrackpad\": \"Trackpad\",\n \"inputDeviceMouse\": \"Mouse\"\n },\n \"elementLink\": {\n \"title\": \"Link to object\",\n \"desc\": \"Click on a shape on canvas or paste a link.\",\n \"notFound\": \"Linked object wasn't found on canvas.\"\n },\n \"library\": {\n \"noItems\": \"No items added yet...\",\n \"hint_emptyLibrary\": \"Select an item on canvas to add it here, or install a library from the public repository, below.\",\n \"hint_emptyPrivateLibrary\": \"Select an item on canvas to add it here.\",\n \"search\": {\n \"inputPlaceholder\": \"Search library\",\n \"heading\": \"Library matches\",\n \"noResults\": \"No matching items found...\",\n \"clearSearch\": \"Clear search\"\n }\n },\n \"search\": {\n \"title\": \"Find on canvas\",\n \"noMatch\": \"No matches found...\",\n \"singleResult\": \"result\",\n \"multipleResults\": \"results\",\n \"placeholder\": \"Find text on canvas...\",\n \"frames\": \"Frames\",\n \"texts\": \"Texts\"\n },\n \"buttons\": {\n \"clearReset\": \"Reset the canvas\",\n \"exportJSON\": \"Export to file\",\n \"exportImage\": \"Export image...\",\n \"export\": \"Save to...\",\n \"copyToClipboard\": \"Copy to clipboard\",\n \"copyLink\": \"Copy link\",\n \"save\": \"Save to current file\",\n \"saveAs\": \"Save as\",\n \"load\": \"Open\",\n \"getShareableLink\": \"Get shareable link\",\n \"close\": \"Close\",\n \"selectLanguage\": \"Select language\",\n \"scrollBackToContent\": \"Scroll back to content\",\n \"zoomIn\": \"Zoom in\",\n \"zoomOut\": \"Zoom out\",\n \"resetZoom\": \"Reset zoom\",\n \"menu\": \"Menu\",\n \"done\": \"Done\",\n \"edit\": \"Edit\",\n \"undo\": \"Undo\",\n \"redo\": \"Redo\",\n \"resetLibrary\": \"Reset library\",\n \"reset\": \"Reset\",\n \"createNewRoom\": \"Create new room\",\n \"fullScreen\": \"Full screen\",\n \"darkMode\": \"Dark mode\",\n \"lightMode\": \"Light mode\",\n \"systemMode\": \"System mode\",\n \"zenMode\": \"Zen mode\",\n \"objectsSnapMode\": \"Snap to objects\",\n \"exitZenMode\": \"Exit zen mode\",\n \"cancel\": \"Cancel\",\n \"saveLibNames\": \"Save name(s) and exit\",\n \"clear\": \"Clear\",\n \"remove\": \"Remove\",\n \"embed\": \"Toggle embedding\",\n \"publishLibrary\": \"Rename or publish\",\n \"submit\": \"Submit\",\n \"confirm\": \"Confirm\",\n \"embeddableInteractionButton\": \"Click to interact\"\n },\n \"alerts\": {\n \"clearReset\": \"This will clear the whole canvas. Are you sure?\",\n \"couldNotCreateShareableLink\": \"Couldn't create shareable link.\",\n \"couldNotCreateShareableLinkTooBig\": \"Couldn't create shareable link: the scene is too big\",\n \"couldNotLoadInvalidFile\": \"Couldn't load invalid file\",\n \"importBackendFailed\": \"Importing from backend failed.\",\n \"cannotExportEmptyCanvas\": \"Cannot export empty canvas.\",\n \"couldNotCopyToClipboard\": \"Couldn't copy to clipboard.\",\n \"decryptFailed\": \"Couldn't decrypt data.\",\n \"uploadedSecurly\": \"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can't read the content.\",\n \"loadSceneOverridePrompt\": \"Loading external drawing will replace your existing content. Do you wish to continue?\",\n \"collabStopOverridePrompt\": \"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)\",\n \"errorAddingToLibrary\": \"Couldn't add item to the library\",\n \"errorRemovingFromLibrary\": \"Couldn't remove item from the library\",\n \"confirmAddLibrary\": \"This will add {{numShapes}} shape(s) to your library. Are you sure?\",\n \"imageDoesNotContainScene\": \"This image does not seem to contain any scene data. Have you enabled scene embedding during export?\",\n \"cannotRestoreFromImage\": \"Scene couldn't be restored from this image file\",\n \"invalidSceneUrl\": \"Couldn't import scene from the supplied URL. It's either malformed, or doesn't contain valid Excalidraw JSON data.\",\n \"resetLibrary\": \"This will clear your library. Are you sure?\",\n \"removeItemsFromsLibrary\": \"Delete {{count}} item(s) from library?\",\n \"invalidEncryptionKey\": \"Encryption key must be of 22 characters. Live collaboration is disabled.\",\n \"collabOfflineWarning\": \"No internet connection available.\\nYour changes will not be saved!\",\n \"localStorageQuotaExceeded\": \"Browser storage quota exceeded. Changes will not be saved.\"\n },\n \"errors\": {\n \"unsupportedFileType\": \"Unsupported file type.\",\n \"imageInsertError\": \"Couldn't insert image. Try again later...\",\n \"fileTooBig\": \"File is too big. Maximum allowed size is {{maxSize}}.\",\n \"svgImageInsertError\": \"Couldn't insert SVG image. The SVG markup looks invalid.\",\n \"failedToFetchImage\": \"Failed to fetch image.\",\n \"cannotResolveCollabServer\": \"Couldn't connect to the collab server. Please reload the page and try again.\",\n \"importLibraryError\": \"Couldn't load library\",\n \"saveLibraryError\": \"Couldn't save library to storage. Please save your library to a file locally to make sure you don't lose changes.\",\n \"collabSaveFailed\": \"Couldn't save to the backend database. If problems persist, you should save your file locally to ensure you don't lose your work.\",\n \"collabSaveFailed_sizeExceeded\": \"Couldn't save to the backend database, the canvas seems to be too big. You should save the file locally to ensure you don't lose your work.\",\n \"imageToolNotSupported\": \"Images are disabled.\",\n \"brave_measure_text_error\": {\n \"line1\": \"Looks like you are using Brave browser with the <bold>Aggressively Block Fingerprinting</bold> setting enabled.\",\n \"line2\": \"This could result in breaking the <bold>Text Elements</bold> in your drawings.\",\n \"line3\": \"We strongly recommend disabling this setting. You can follow <link>these steps</link> on how to do so.\",\n \"line4\": \"If disabling this setting doesn't fix the display of text elements, please open an <issueLink>issue</issueLink> on our GitHub, or write us on <discordLink>Discord</discordLink>\"\n },\n \"libraryElementTypeError\": {\n \"embeddable\": \"Embeddable elements cannot be added to the library.\",\n \"iframe\": \"IFrame elements cannot be added to the library.\",\n \"image\": \"Support for adding images to the library coming soon!\"\n },\n \"asyncPasteFailedOnRead\": \"Couldn't paste (couldn't read from system clipboard).\",\n \"asyncPasteFailedOnParse\": \"Couldn't paste.\",\n \"copyToSystemClipboardFailed\": \"Couldn't copy to clipboard.\"\n },\n \"toolBar\": {\n \"selection\": \"Selection\",\n \"lasso\": \"Lasso selection\",\n \"image\": \"Insert image\",\n \"rectangle\": \"Rectangle\",\n \"diamond\": \"Diamond\",\n \"ellipse\": \"Ellipse\",\n \"arrow\": \"Arrow\",\n \"line\": \"Line\",\n \"freedraw\": \"Draw\",\n \"text\": \"Text\",\n \"library\": \"Library\",\n \"lock\": \"Keep selected tool active after drawing\",\n \"penMode\": \"Pen mode - prevent touch\",\n \"link\": \"Add / Update link for a selected shape\",\n \"eraser\": \"Eraser\",\n \"frame\": \"Frame tool\",\n \"magicframe\": \"Wireframe to code\",\n \"stickynote\": \"Sticky note\",\n \"embeddable\": \"Web Embed\",\n \"laser\": \"Laser pointer\",\n \"autoshape\": \"Draw to shape\",\n \"bucketfill\": \"Bucket fill\",\n \"hand\": \"Hand (panning tool)\",\n \"extraTools\": \"More tools\",\n \"mermaidToExcalidraw\": \"Mermaid to Excalidraw\",\n \"convertElementType\": \"Toggle shape type\"\n },\n \"bucketfill\": {\n \"noRegion\": \"Couldn't find an enclosed region to fill here.\",\n \"tooComplex\": \"This region is too complex to fill.\"\n },\n \"element\": {\n \"rectangle\": \"Rectangle\",\n \"diamond\": \"Diamond\",\n \"ellipse\": \"Ellipse\",\n \"arrow\": \"Arrow\",\n \"line\": \"Line\",\n \"freedraw\": \"Freedraw\",\n \"text\": \"Text\",\n \"image\": \"Image\",\n \"group\": \"Group\",\n \"frame\": \"Frame\",\n \"magicframe\": \"Wireframe to code\",\n \"stickynote\": \"Sticky note\",\n \"embeddable\": \"Web Embed\",\n \"selection\": \"Selection\",\n \"iframe\": \"IFrame\"\n },\n \"headings\": {\n \"canvasActions\": \"Canvas actions\",\n \"selectedShapeActions\": \"Selected shape actions\",\n \"shapes\": \"Shapes\"\n },\n \"hints\": {\n \"dismissSearch\": \"{{shortcut}} to dismiss search\",\n \"canvasPanning\": \"To move canvas, hold {{shortcut_1}} or {{shortcut_2}} while dragging, or use the hand tool\",\n \"linearElement\": \"Click to start multiple points, drag for single line\",\n \"arrowTool\": \"Click to start multiple points, drag for single line. Press {{shortcut}} again to change arrow type.\",\n \"arrowBindModifiers\": \"Hold {{shortcut_1}} to disable binding, or {{shortcut_2}} to bind at a fixed point\",\n \"freeDraw\": \"Click and drag, release when you're finished\",\n \"text\": \"Tip: you can also add text by double-clicking anywhere with the selection tool\",\n \"embeddable\": \"Click-drag to create a website embed\",\n \"stickynote\": \"Click to place a note, or drag to size it\",\n \"autoshape\": \"Draw rectangles, circles, diamonds, lines and arrows\",\n \"text_selected\": \"Double-click or press {{shortcut}} to edit text\",\n \"text_editing\": \"Press {{shortcut_1}} or {{shortcut_2}} to finish editing\",\n \"linearElementMulti\": \"Click on last point or press {{shortcut_1}} or {{shortcut_2}} to finish\",\n \"lockAngle\": \"You can constrain angle by holding {{shortcut}}\",\n \"resize\": \"You can constrain proportions by holding {{shortcut_1}} while resizing,\\nhold {{shortcut_2}} to resize from the center\",\n \"resizeImage\": \"You can resize freely by holding {{shortcut_1}},\\nhold {{shortcut_2}} to resize from the center\",\n \"resizeStickyNote\": \"hold {{shortcut_1}} to resize freely, {{shortcut_2}} to resize from the center\",\n \"rotate\": \"You can constrain angles by holding {{shortcut}} while rotating\",\n \"toggleArrowhead\": \"Double-click to toggle the arrowhead\",\n \"lineEditor_info\": \"Hold {{shortcut_1}} and Double-click or press {{shortcut_2}} to edit points\",\n \"lineEditor_line_info\": \"Double-click or press {{shortcut}} to edit points\",\n \"lineEditor_pointSelected\": \"Press {{shortcut_1}} to remove point(s),\\n{{shortcut_2}} to duplicate, or drag to move\",\n \"lineEditor_nothingSelected\": \"Select a point to edit (hold {{shortcut_1}} to select multiple),\\nor hold {{shortcut_2}} and click to add new points\",\n \"publishLibrary\": \"Publish your own library\",\n \"bindTextToElement\": \"{{shortcut}} to add text\",\n \"createFlowchart\": \"{{shortcut}} to create a flowchart\",\n \"deepBoxSelect\": \"Hold {{shortcut}} to deep select, and to prevent dragging\",\n \"cycleSelection\": \"{{shortcut}}-click to cycle selection, or drag to duplicate\",\n \"eraserRevert\": \"Hold {{shortcut}} to revert the elements marked for deletion\",\n \"firefox_clipboard_write\": \"This feature can likely be enabled by setting the \\\"dom.events.asyncClipboard.clipboardItem\\\" flag to \\\"true\\\". To change the browser flags in Firefox, visit the \\\"about:config\\\" page.\",\n \"disableSnapping\": \"Hold {{shortcut}} to disable snapping\",\n \"enterCropEditor\": \"Double click the image or press {{shortcut}} to crop the image\",\n \"leaveCropEditor\": \"Click outside the image or press {{shortcut_1}} or {{shortcut_2}} to finish cropping\"\n },\n \"canvasError\": {\n \"cannotShowPreview\": \"Cannot show preview\",\n \"canvasTooBig\": \"The canvas may be too big.\",\n \"canvasTooBigTip\": \"Tip: try moving the farthest elements a bit closer together.\"\n },\n \"errorSplash\": {\n \"headingMain\": \"Encountered an error. Try <button>reloading the page</button>.\",\n \"clearCanvasMessage\": \"If reloading doesn't work, try <button>clearing the canvas</button>.\",\n \"clearCanvasCaveat\": \" This will result in loss of work \",\n \"trackedToSentry\": \"The error with identifier {{eventId}} was tracked on our system.\",\n \"openIssueMessage\": \"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our <button>bug tracker</button>. Please include information below by copying and pasting into the GitHub issue.\",\n \"sceneContent\": \"Scene content:\"\n },\n \"shareDialog\": {\n \"or\": \"Or\"\n },\n \"roomDialog\": {\n \"desc_intro\": \"Invite people to collaborate on your drawing.\",\n \"desc_privacy\": \"Don't worry, the session is end-to-end encrypted, and fully private. Not even our server can see what you draw.\",\n \"button_startSession\": \"Start session\",\n \"button_stopSession\": \"Stop session\",\n \"desc_inProgressIntro\": \"Live-collaboration session is now in progress.\",\n \"desc_shareLink\": \"Share this link with anyone you want to collaborate with:\",\n \"desc_exitSession\": \"Stopping the session will disconnect you from the room, but you'll be able to continue working with the scene, locally. Note that this won't affect other people, and they'll still be able to collaborate on their version.\",\n \"shareTitle\": \"Join a live collaboration session on Excalidraw\"\n },\n \"errorDialog\": {\n \"title\": \"Error\"\n },\n \"progressDialog\": {\n \"title\": \"Saving\",\n \"defaultMessage\": \"Preparing to save...\"\n },\n \"exportDialog\": {\n \"disk_title\": \"Save to disk\",\n \"disk_details\": \"Export the scene data to a file from which you can import later.\",\n \"disk_button\": \"Save to file\",\n \"link_title\": \"Shareable link\",\n \"link_details\": \"Export as a read-only link.\",\n \"link_button\": \"Export to Link\",\n \"excalidrawplus_description\": \"Save the scene to your Excalidraw+ workspace.\",\n \"excalidrawplus_button\": \"Export\",\n \"excalidrawplus_exportError\": \"Couldn't export to Excalidraw+ at this moment...\"\n },\n \"helpDialog\": {\n \"blog\": \"Read our blog\",\n \"click\": \"click\",\n \"deepSelect\": \"Deep select\",\n \"deepBoxSelect\": \"Deep select within box, and prevent dragging\",\n \"createFlowchart\": \"Create a flowchart from a generic element\",\n \"navigateFlowchart\": \"Navigate a flowchart\",\n \"curvedArrow\": \"Curved arrow\",\n \"curvedLine\": \"Curved line\",\n \"documentation\": \"Documentation\",\n \"doubleClick\": \"double-click\",\n \"drag\": \"drag\",\n \"editor\": \"Editor\",\n \"editLineArrowPoints\": \"Edit line/arrow points\",\n \"editText\": \"Edit text / add label\",\n \"github\": \"Found an issue? Submit\",\n \"howto\": \"Follow our guides\",\n \"or\": \"or\",\n \"preventBinding\": \"Prevent arrow binding\",\n \"tools\": \"Tools\",\n \"shortcuts\": \"Keyboard shortcuts\",\n \"textFinish\": \"Finish editing (text editor)\",\n \"textNewLine\": \"Add new line (text editor)\",\n \"title\": \"Help\",\n \"view\": \"View\",\n \"zoomToFit\": \"Zoom to fit all elements\",\n \"zoomToSelection\": \"Zoom to selection\",\n \"toggleElementLock\": \"Lock/unlock selection\",\n \"movePageUpDown\": \"Move page up/down\",\n \"movePageLeftRight\": \"Move page left/right\",\n \"cropStart\": \"Crop image\",\n \"cropFinish\": \"Finish image cropping\"\n },\n \"clearCanvasDialog\": {\n \"title\": \"Clear canvas\"\n },\n \"publishDialog\": {\n \"title\": \"Publish library\",\n \"itemName\": \"Item name\",\n \"authorName\": \"Author name\",\n \"githubUsername\": \"GitHub username\",\n \"twitterUsername\": \"Twitter username\",\n \"libraryName\": \"Library name\",\n \"libraryDesc\": \"Library description\",\n \"website\": \"Website\",\n \"placeholder\": {\n \"authorName\": \"Your name or username\",\n \"libraryName\": \"Name of your library\",\n \"libraryDesc\": \"Description of your library to help people understand its usage\",\n \"githubHandle\": \"GitHub handle (optional), so you can edit the library once submitted for review\",\n \"twitterHandle\": \"Twitter username (optional), so we know who to credit when promoting over Twitter\",\n \"website\": \"Link to your personal website or elsewhere (optional)\"\n },\n \"errors\": {\n \"required\": \"Required\",\n \"website\": \"Enter a valid URL\"\n },\n \"noteDescription\": \"Submit your library to be included in the <link>public library repository</link> for other people to use in their drawings.\",\n \"noteGuidelines\": \"The library needs to be manually approved first. Please read the <link>guidelines</link> before submitting. You will need a GitHub account to communicate and make changes if requested, but it is not strictly required.\",\n \"noteLicense\": \"By submitting, you agree the library will be published under the <link>MIT License</link>, which in short means anyone can use them without restrictions.\",\n \"noteItems\": \"Each library item must have its own name so it's filterable. The following library items will be included:\",\n \"atleastOneLibItem\": \"Please select at least one library item to get started\",\n \"republishWarning\": \"Note: some of the selected items are marked as already published/submitted. You should only resubmit items when updating an existing library or submission.\"\n },\n \"publishSuccessDialog\": {\n \"title\": \"Library submitted\",\n \"content\": \"Thank you {{authorName}}. Your library has been submitted for review. You can track the status <link>here</link>\"\n },\n \"confirmDialog\": {\n \"resetLibrary\": \"Reset library\",\n \"removeItemsFromLib\": \"Remove selected items from library\"\n },\n \"imageExportDialog\": {\n \"header\": \"Export image\",\n \"label\": {\n \"withBackground\": \"Background\",\n \"onlySelected\": \"Only selected\",\n \"darkMode\": \"Dark mode\",\n \"embedScene\": \"Embed scene\",\n \"scale\": \"Scale\",\n \"padding\": \"Padding\"\n },\n \"tooltip\": {\n \"embedScene\": \"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.\"\n },\n \"title\": {\n \"exportToPng\": \"Export to PNG\",\n \"exportToSvg\": \"Export to SVG\",\n \"copyPngToClipboard\": \"Copy PNG to clipboard\"\n },\n \"button\": {\n \"exportToPng\": \"PNG\",\n \"exportToSvg\": \"SVG\",\n \"copyPngToClipboard\": \"Copy to clipboard\"\n }\n },\n \"encrypted\": {\n \"tooltip\": \"Your drawings are end-to-end encrypted so Excalidraw's servers will never see them.\",\n \"link\": \"Blog post on end-to-end encryption in Excalidraw\"\n },\n \"stats\": {\n \"angle\": \"Angle\",\n \"shapes\": \"Shapes\",\n \"height\": \"Height\",\n \"scene\": \"Scene\",\n \"selected\": \"Selected\",\n \"storage\": \"Storage\",\n \"fullTitle\": \"Canvas & Shape properties\",\n \"title\": \"Properties\",\n \"generalStats\": \"General\",\n \"elementProperties\": \"Shape properties\",\n \"total\": \"Total\",\n \"version\": \"Version\",\n \"versionCopy\": \"Click to copy\",\n \"versionNotAvailable\": \"Version not available\",\n \"width\": \"Width\"\n },\n \"toast\": {\n \"addedToLibrary\": \"Added to library\",\n \"copyStyles\": \"Copied styles.\",\n \"copyToClipboard\": \"Copied to clipboard.\",\n \"copyToClipboardAsPng\": \"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})\",\n \"copyToClipboardAsSvg\": \"Copied {{exportSelection}} to clipboard as SVG\\n({{exportColorScheme}})\",\n \"fileSaved\": \"File saved.\",\n \"fileSavedToFilename\": \"Saved to {filename}\",\n \"canvas\": \"canvas\",\n \"selection\": \"selection\",\n \"pasteAsSingleElement\": \"Use {{shortcut}} to paste as a single element,\\nor paste into an existing text editor\",\n \"unableToEmbed\": \"Embedding this url is currently not allowed. Raise an issue on GitHub to request the url whitelisted\",\n \"unrecognizedLinkFormat\": \"The link you embedded does not match the expected format. Please try to paste the 'embed' string provided by the source site\",\n \"elementLinkCopied\": \"Link copied to clipboard\"\n },\n \"colors\": {\n \"transparent\": \"Transparent\",\n \"black\": \"Black\",\n \"white\": \"White\",\n \"red\": \"Red\",\n \"pink\": \"Pink\",\n \"grape\": \"Grape\",\n \"violet\": \"Violet\",\n \"gray\": \"Gray\",\n \"blue\": \"Blue\",\n \"cyan\": \"Cyan\",\n \"teal\": \"Teal\",\n \"green\": \"Green\",\n \"yellow\": \"Yellow\",\n \"orange\": \"Orange\",\n \"bronze\": \"Bronze\"\n },\n \"welcomeScreen\": {\n \"app\": {\n \"center_heading\": \"Your drawings are saved in your browser's storage.\",\n \"center_heading_line2\": \"Browser storage can be cleared unexpectedly.\",\n \"center_heading_line3\": \"Save your work to a file regularly to avoid losing it.\",\n \"center_heading_plus\": \"Did you want to go to the Excalidraw+ instead?\",\n \"menuHint\": \"Export, preferences, languages, ...\"\n },\n \"defaults\": {\n \"menuHint\": \"Export, preferences, and more...\",\n \"center_heading\": \"Diagrams. Made. Simple.\",\n \"toolbarHint\": \"Pick a tool & Start drawing!\",\n \"helpHint\": \"Shortcuts & help\"\n }\n },\n \"colorPicker\": {\n \"color\": \"Color\",\n \"mostUsedCustomColors\": \"Most used custom colors\",\n \"colors\": \"Colors\",\n \"shades\": \"Shades\",\n \"hexCode\": \"Hex code\",\n \"noShades\": \"No shades available for this color\",\n \"invalidColor\": \"Not a valid color\",\n \"invalidHexLength\": \"Hex code must be 3, 4, 6, or 8 characters\",\n \"topPicksTip\": \"Tip: drag any color onto your top picks to pin it\",\n \"resetTopPicks\": \"Reset to default top picks\"\n },\n \"overwriteConfirm\": {\n \"action\": {\n \"exportToImage\": {\n \"title\": \"Export as image\",\n \"button\": \"Export as image\",\n \"description\": \"Export the scene data as an image from which you can import later.\"\n },\n \"saveToDisk\": {\n \"title\": \"Save to disk\",\n \"button\": \"Save to disk\",\n \"description\": \"Export the scene data to a file from which you can import later.\"\n },\n \"excalidrawPlus\": {\n \"title\": \"Excalidraw+\",\n \"button\": \"Export to Excalidraw+\",\n \"description\": \"Save the scene to your Excalidraw+ workspace.\"\n }\n },\n \"modal\": {\n \"loadFromFile\": {\n \"title\": \"Load from file\",\n \"button\": \"Load from file\",\n \"description\": \"Loading from a file will <bold>replace your existing content</bold>.<br></br>You can back up your drawing first using one of the options below.\"\n },\n \"shareableLink\": {\n \"title\": \"Load from link\",\n \"button\": \"Replace my content\",\n \"description\": \"Loading external drawing will <bold>replace your existing content</bold>.<br></br>You can back up your drawing first by using one of the options below.\"\n }\n }\n },\n \"fileDrop\": {\n \"replace\": \"Drop to replace content\",\n \"add\": \"Drop to add to canvas\",\n \"importLibrary\": \"Drop to import library\",\n \"replaceHint\": \"Hold <shift>Shift</shift> to keep existing content\",\n \"keepHint\": \"Your existing content will be kept\",\n \"libraryHint\": \"Library files will append\",\n \"replacedToast\": \"Content replaced. {{shortcut}} to undo\"\n },\n \"mermaid\": {\n \"title\": \"Mermaid to Excalidraw\",\n \"button\": \"Insert\",\n \"description\": \"Currently only <flowchartLink>Flowchart</flowchartLink>, <sequenceLink>Sequence</sequenceLink>, <classLink>Class</classLink>, and <erdLink>Entity Relationship</erdLink> Diagrams are supported. The other types will be rendered as image in Excalidraw.\",\n \"syntax\": \"Mermaid Syntax\",\n \"preview\": \"Preview\",\n \"label\": \"Mermaid\",\n \"inputPlaceholder\": \"Write Mermaid diagram definition here...\",\n \"autoFixAvailable\": \"Auto-fix is available\"\n },\n \"ttd\": {\n \"error\": \"Error!\"\n },\n \"chat\": {\n \"inputPlaceholder\": \"Start typing your diagram idea here... ({{shortcut}} for new line)\",\n \"inputPlaceholderWithMessages\": \"Continue refining your diagram...\",\n \"generating\": \"Generating...\",\n \"rateLimitRemaining\": \"{{count}} requests left today\",\n \"role\": {\n \"user\": \"You\",\n \"assistant\": \"AI Assistant\",\n \"system\": \"System\"\n },\n \"aiBeta\": \"AI Beta\",\n \"label\": \"Chat\",\n \"menu\": \"Menu\",\n \"newChat\": \"New Chat\",\n \"deleteChat\": \"Delete chat\",\n \"deleteMessage\": \"Delete message\",\n \"viewAsMermaid\": \"View as Mermaid\",\n \"placeholder\": {\n \"title\": \"Let's design your diagram\",\n \"description\": \"Describe the diagram you want to create, and we'll generate it for you.\",\n \"hint\": \"At the moment we know Flowchart, Sequence, Class, State, and Entity Relationship diagrams.\"\n },\n \"preview\": \"Preview\",\n \"insert\": \"Insert\",\n \"retry\": \"Retry\",\n \"errors\": {\n \"promptTooShort\": \"Prompt is too short (min {{min}} characters)\",\n \"promptTooLong\": \"Prompt is too long (max {{max}} characters)\",\n \"generationFailed\": \"Generation failed\",\n \"invalidDiagram\": \"Generated an invalid diagram :(. You may edit manually, retry with auto-fix, or try a different prompt.\",\n \"fixInMermaid\": \"Edit Mermaid manually \u2192\",\n \"aiRepair\": \"Regenerate (auto-fix) \u2192\",\n \"requestAborted\": \"Request aborted\",\n \"requestFailed\": \"Request failed\",\n \"mermaidParseError\": \"Mermaid syntax error\"\n },\n \"rateLimit\": {\n \"messageLimit\": \"You've hit your AI limit on the free plan. Try out Excalidraw+ for more or come back tomorrow.\",\n \"generalRateLimit\": \"Hold your horses, you're too fast for us! Please wait a moment before trying again.\",\n \"messageLimitInputPlaceholder\": \"You've reached your message limit\"\n },\n \"upsellBtnLabel\": \"Upgrade to Plus\"\n },\n \"quickSearch\": {\n \"placeholder\": \"Quick search\"\n },\n \"fontList\": {\n \"badge\": {\n \"old\": \"old\"\n },\n \"sceneFonts\": \"In this scene\",\n \"availableFonts\": \"Available fonts\",\n \"empty\": \"No fonts found\",\n \"topPicksTip\": \"Tip: drag any font onto your top picks to pin it\",\n \"resetTopPicks\": \"Reset to default top picks\"\n },\n \"userList\": {\n \"empty\": \"No users found\",\n \"hint\": {\n \"text\": \"Click on user to follow\",\n \"followStatus\": \"You're currently following this user\",\n \"inCall\": \"User is in a voice call\",\n \"micMuted\": \"User's microphone is muted\",\n \"isSpeaking\": \"User is speaking\"\n }\n },\n \"commandPalette\": {\n \"title\": \"Command palette\",\n \"shortcuts\": {\n \"select\": \"Select\",\n \"confirm\": \"Confirm\",\n \"close\": \"Close\"\n },\n \"recents\": \"Recently used\",\n \"search\": {\n \"placeholder\": \"Search menus, commands, and discover hidden gems\",\n \"noMatch\": \"No matching commands...\"\n },\n \"itemNotAvailable\": \"Command is not available...\",\n \"shortcutHint\": \"For Command palette, use {{shortcut}}\"\n },\n \"keys\": {\n \"ctrl\": \"Ctrl\",\n \"option\": \"Option\",\n \"cmd\": \"Cmd\",\n \"alt\": \"Alt\",\n \"escape\": \"Esc\",\n \"enter\": \"Enter\",\n \"shift\": \"Shift\",\n \"spacebar\": \"Space\",\n \"delete\": \"Delete\",\n \"mmb\": \"Scroll wheel\"\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -91,6 +91,7 @@ var getDefaultAppState = () => {
91
91
  isBindingEnabled: true,
92
92
  bindingPreference: "enabled",
93
93
  isMidpointSnappingEnabled: true,
94
+ showHints: true,
94
95
  inputDevice: "auto",
95
96
  defaultSidebarDockedPreference: false,
96
97
  isLoading: false,
@@ -121,7 +122,7 @@ var getDefaultAppState = () => {
121
122
  panels: STATS_PANELS.generalStats | STATS_PANELS.elementProperties
122
123
  },
123
124
  suggestedBinding: null,
124
- hoveredArrowTextAnchor: null,
125
+ textToolHover: null,
125
126
  frameRendering: { enabled: true, clip: true, name: true, outline: true },
126
127
  frameToHighlight: null,
127
128
  editingFrame: null,
@@ -154,7 +155,8 @@ var getDefaultAppState = () => {
154
155
  bucketFill: null,
155
156
  stickyNoteStroke: null,
156
157
  stickyNoteBackground: null
157
- }
158
+ },
159
+ fontTopPicks: null
158
160
  };
159
161
  };
160
162
  var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
@@ -222,6 +224,7 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
222
224
  boxSelectionMode: { browser: true, export: false, server: false },
223
225
  bindingPreference: { browser: true, export: false, server: false },
224
226
  isMidpointSnappingEnabled: { browser: true, export: false, server: false },
227
+ showHints: { browser: true, export: false, server: false },
225
228
  inputDevice: { browser: true, export: false, server: false },
226
229
  defaultSidebarDockedPreference: {
227
230
  browser: true,
@@ -259,7 +262,7 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
259
262
  shouldCacheIgnoreZoom: { browser: true, export: false, server: false },
260
263
  stats: { browser: true, export: false, server: false },
261
264
  suggestedBinding: { browser: false, export: false, server: false },
262
- hoveredArrowTextAnchor: { browser: false, export: false, server: false },
265
+ textToolHover: { browser: false, export: false, server: false },
263
266
  frameRendering: { browser: false, export: false, server: false },
264
267
  frameToHighlight: { browser: false, export: false, server: false },
265
268
  editingFrame: { browser: false, export: false, server: false },
@@ -281,7 +284,8 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
281
284
  lockedMultiSelections: { browser: true, export: true, server: true },
282
285
  activeLockedId: { browser: false, export: false, server: false },
283
286
  bindMode: { browser: true, export: false, server: false },
284
- colorTopPicks: { browser: true, export: false, server: false }
287
+ colorTopPicks: { browser: true, export: false, server: false },
288
+ fontTopPicks: { browser: true, export: false, server: false }
285
289
  });
286
290
  var _clearAppStateForStorage = (appState, exportType) => {
287
291
  const stateForExport = {};
@@ -592,6 +596,43 @@ var centerScrollOn = ({
592
596
  scrollY
593
597
  };
594
598
  };
599
+ var scrollBoundsIntoView = ({
600
+ bounds: [x1, y1, x2, y2],
601
+ appState: { scrollX, scrollY, zoom, width, height },
602
+ offsets,
603
+ tooLarge = "alignStart"
604
+ }) => {
605
+ const viewLeft = offsets?.left ?? 0;
606
+ const viewRight = width - (offsets?.right ?? 0);
607
+ const viewTop = offsets?.top ?? 0;
608
+ const viewBottom = height - (offsets?.bottom ?? 0);
609
+ if (viewRight <= viewLeft || viewBottom <= viewTop) {
610
+ return null;
611
+ }
612
+ const shift = (spanStart, spanEnd, scroll, start, end) => {
613
+ const screenStart = (spanStart + scroll) * zoom.value;
614
+ const screenEnd = (spanEnd + scroll) * zoom.value;
615
+ if (screenEnd - screenStart > end - start) {
616
+ return tooLarge === "alignStart" ? start - screenStart : 0;
617
+ }
618
+ if (screenEnd > end) {
619
+ return end - screenEnd;
620
+ }
621
+ if (screenStart < start) {
622
+ return start - screenStart;
623
+ }
624
+ return 0;
625
+ };
626
+ const dx = shift(x1, x2, scrollX, viewLeft, viewRight);
627
+ const dy = shift(y1, y2, scrollY, viewTop, viewBottom);
628
+ if (!dx && !dy) {
629
+ return null;
630
+ }
631
+ return {
632
+ scrollX: scrollX + dx / zoom.value,
633
+ scrollY: scrollY + dy / zoom.value
634
+ };
635
+ };
595
636
  var getScrollToContentState = (elements, appState) => {
596
637
  elements = getVisibleElements(elements);
597
638
  if (!elements.length) {
@@ -3304,7 +3345,11 @@ import {
3304
3345
  getTargetFrame,
3305
3346
  shouldApplyFrameClip
3306
3347
  } from "@excalidraw/element";
3307
- import { renderElement } from "@excalidraw/element";
3348
+ import {
3349
+ getRenderElementWithPositionOverride,
3350
+ resolveElementRenderState,
3351
+ renderElement
3352
+ } from "@excalidraw/element";
3308
3353
  import { getElementAbsoluteCoords as getElementAbsoluteCoords2 } from "@excalidraw/element";
3309
3354
 
3310
3355
  // components/hyperlink/helpers.ts
@@ -3536,11 +3581,16 @@ var linkIconCanvasCache = {
3536
3581
  regularLink: null,
3537
3582
  elementLink: null
3538
3583
  };
3539
- var renderLinkIcon = (element, context, appState, elementsMap) => {
3584
+ var renderLinkIcon = (element, context, appState, elementsMap, renderState) => {
3540
3585
  if (element.link && !appState.selectedElementIds[element.id]) {
3541
3586
  const [x1, y1, x2, y2] = getElementAbsoluteCoords2(element, elementsMap);
3542
3587
  const [x, y, width, height] = getLinkHandleFromCoords(
3543
- [x1, y1, x2, y2],
3588
+ [
3589
+ x1 + renderState.offset.x,
3590
+ y1 + renderState.offset.y,
3591
+ x2 + renderState.offset.x,
3592
+ y2 + renderState.offset.y
3593
+ ],
3544
3594
  element.angle,
3545
3595
  appState
3546
3596
  );
@@ -3579,7 +3629,7 @@ var renderLinkIcon = (element, context, appState, elementsMap) => {
3579
3629
  }
3580
3630
  linkCanvasCacheContext.restore();
3581
3631
  }
3582
- context.globalAlpha = element.opacity / 100;
3632
+ context.globalAlpha = renderState.opacity;
3583
3633
  context.drawImage(linkCanvas, x - centerX, y - centerY, width, height);
3584
3634
  context.restore();
3585
3635
  }
@@ -3640,45 +3690,55 @@ var _renderStaticScene = ({
3640
3690
  }
3641
3691
  });
3642
3692
  const inFrameGroupsMap = /* @__PURE__ */ new Map();
3693
+ const getRenderState = (element) => resolveElementRenderState(
3694
+ element,
3695
+ elementsMap,
3696
+ renderConfig,
3697
+ allElementsMap
3698
+ );
3699
+ const clipElementToFrame = (element, renderState) => {
3700
+ if (!(element.frameId || appState.frameToHighlight?.id) || !appState.frameRendering.enabled || !appState.frameRendering.clip) {
3701
+ return;
3702
+ }
3703
+ const targetFrame = getTargetFrame(element, elementsMap, appState);
3704
+ if (!targetFrame) {
3705
+ return;
3706
+ }
3707
+ const frameState = getRenderState(targetFrame);
3708
+ const frame = getRenderElementWithPositionOverride(
3709
+ targetFrame,
3710
+ frameState.offset
3711
+ );
3712
+ const isTranslated = (state) => state.offset.x !== 0 || state.offset.y !== 0;
3713
+ if (element.frameId === frame.id && (isTranslated(renderState) || isTranslated(frameState)) || shouldApplyFrameClip(
3714
+ getRenderElementWithPositionOverride(element, renderState.offset),
3715
+ frame,
3716
+ appState,
3717
+ elementsMap,
3718
+ inFrameGroupsMap
3719
+ )) {
3720
+ frameClip(frame, context, renderConfig, appState);
3721
+ }
3722
+ };
3643
3723
  visibleElements.filter((el) => !isIframeLikeElement(el)).forEach((element) => {
3644
3724
  try {
3645
- const frameId = element.frameId || appState.frameToHighlight?.id;
3646
3725
  if (isTextElement2(element) && element.containerId && elementsMap.has(element.containerId)) {
3647
3726
  return;
3648
3727
  }
3649
3728
  context.save();
3650
- if (frameId && appState.frameRendering.enabled && appState.frameRendering.clip) {
3651
- const frame = getTargetFrame(element, elementsMap, appState);
3652
- if (frame && shouldApplyFrameClip(
3653
- element,
3654
- frame,
3655
- appState,
3656
- elementsMap,
3657
- inFrameGroupsMap
3658
- )) {
3659
- frameClip(frame, context, renderConfig, appState);
3660
- }
3661
- renderElement(
3662
- element,
3663
- elementsMap,
3664
- allElementsMap,
3665
- rc,
3666
- context,
3667
- renderConfig,
3668
- appState
3669
- );
3670
- } else {
3671
- renderElement(
3672
- element,
3673
- elementsMap,
3674
- allElementsMap,
3675
- rc,
3676
- context,
3677
- renderConfig,
3678
- appState
3679
- );
3680
- }
3681
3729
  const boundTextElement = getBoundTextElement(element, elementsMap);
3730
+ const renderState = getRenderState(element);
3731
+ clipElementToFrame(element, renderState);
3732
+ renderElement(
3733
+ element,
3734
+ elementsMap,
3735
+ allElementsMap,
3736
+ rc,
3737
+ context,
3738
+ renderConfig,
3739
+ appState,
3740
+ renderState
3741
+ );
3682
3742
  if (boundTextElement) {
3683
3743
  renderElement(
3684
3744
  boundTextElement,
@@ -3692,7 +3752,7 @@ var _renderStaticScene = ({
3692
3752
  }
3693
3753
  context.restore();
3694
3754
  if (!isExporting && renderConfig.renderLinks !== false) {
3695
- renderLinkIcon(element, context, appState, elementsMap);
3755
+ renderLinkIcon(element, context, appState, elementsMap, renderState);
3696
3756
  }
3697
3757
  } catch (error) {
3698
3758
  console.error(
@@ -3707,9 +3767,29 @@ var _renderStaticScene = ({
3707
3767
  });
3708
3768
  visibleElements.filter((el) => isIframeLikeElement(el)).forEach((element) => {
3709
3769
  try {
3710
- const render = () => {
3770
+ const renderState = getRenderState(element);
3771
+ context.save();
3772
+ clipElementToFrame(element, renderState);
3773
+ renderElement(
3774
+ element,
3775
+ elementsMap,
3776
+ allElementsMap,
3777
+ rc,
3778
+ context,
3779
+ renderConfig,
3780
+ appState,
3781
+ renderState
3782
+ );
3783
+ if (isIframeLikeElement(element) && (isExporting || isEmbeddableElement(element) && renderConfig.embedsValidationStatus.get(element.id) !== true) && element.width && element.height) {
3784
+ const label = {
3785
+ ...createPlaceholderEmbeddableLabel(element),
3786
+ // Synthetic visual: resolve overrides and frame opacity through
3787
+ // its owner, without creating another animation target.
3788
+ id: element.id,
3789
+ frameId: element.frameId
3790
+ };
3711
3791
  renderElement(
3712
- element,
3792
+ label,
3713
3793
  elementsMap,
3714
3794
  allElementsMap,
3715
3795
  rc,
@@ -3717,40 +3797,11 @@ var _renderStaticScene = ({
3717
3797
  renderConfig,
3718
3798
  appState
3719
3799
  );
3720
- if (isIframeLikeElement(element) && (isExporting || isEmbeddableElement(element) && renderConfig.embedsValidationStatus.get(element.id) !== true) && element.width && element.height) {
3721
- const label = createPlaceholderEmbeddableLabel(element);
3722
- renderElement(
3723
- label,
3724
- elementsMap,
3725
- allElementsMap,
3726
- rc,
3727
- context,
3728
- renderConfig,
3729
- appState
3730
- );
3731
- }
3732
- if (!isExporting && renderConfig.renderLinks !== false) {
3733
- renderLinkIcon(element, context, appState, elementsMap);
3734
- }
3735
- };
3736
- const frameId = element.frameId || appState.frameToHighlight?.id;
3737
- if (frameId && appState.frameRendering.enabled && appState.frameRendering.clip) {
3738
- context.save();
3739
- const frame = getTargetFrame(element, elementsMap, appState);
3740
- if (frame && shouldApplyFrameClip(
3741
- element,
3742
- frame,
3743
- appState,
3744
- elementsMap,
3745
- inFrameGroupsMap
3746
- )) {
3747
- frameClip(frame, context, renderConfig, appState);
3748
- }
3749
- render();
3750
- context.restore();
3751
- } else {
3752
- render();
3753
3800
  }
3801
+ if (!isExporting && renderConfig.renderLinks !== false) {
3802
+ renderLinkIcon(element, context, appState, elementsMap, renderState);
3803
+ }
3804
+ context.restore();
3754
3805
  } catch (error) {
3755
3806
  console.error(error);
3756
3807
  }
@@ -4853,6 +4904,8 @@ import {
4853
4904
  DEFAULT_TEXT_ALIGN as DEFAULT_TEXT_ALIGN2,
4854
4905
  DEFAULT_VERTICAL_ALIGN,
4855
4906
  FONT_FAMILY as FONT_FAMILY3,
4907
+ FONT_METADATA as FONT_METADATA2,
4908
+ FONT_TOP_PICKS_SLOTS,
4856
4909
  ROUNDNESS,
4857
4910
  DEFAULT_SIDEBAR,
4858
4911
  DEFAULT_ELEMENT_PROPS as DEFAULT_ELEMENT_PROPS2,
@@ -4867,7 +4920,8 @@ import {
4867
4920
  getLineHeight,
4868
4921
  STROKE_WIDTH,
4869
4922
  STROKE_WIDTH_KEYS,
4870
- isTransparent
4923
+ isTransparent,
4924
+ DEFAULT_ZOOM
4871
4925
  } from "@excalidraw/common";
4872
4926
  import {
4873
4927
  calculateFixedPointForNonElbowArrowBinding,
@@ -5071,7 +5125,7 @@ var repairBinding = (element, binding, targetElementsMap, existingElementsMap, s
5071
5125
  boundElement,
5072
5126
  startOrEnd,
5073
5127
  elementsMap,
5074
- { value: 1 }
5128
+ DEFAULT_ZOOM
5075
5129
  ) || p;
5076
5130
  const { fixedPoint } = calculateFixedPointForNonElbowArrowBinding(
5077
5131
  safeElement,
@@ -5581,6 +5635,23 @@ var restoreColorTopPicksList = (value) => {
5581
5635
  }
5582
5636
  return colors.size ? [...colors.values()] : null;
5583
5637
  };
5638
+ var restoreFontTopPicks = (value) => {
5639
+ if (!Array.isArray(value)) {
5640
+ return null;
5641
+ }
5642
+ const fontFamilies = /* @__PURE__ */ new Set();
5643
+ for (const fontFamily of value) {
5644
+ const metadata = typeof fontFamily === "number" ? FONT_METADATA2[fontFamily] : void 0;
5645
+ if (!metadata || metadata.private || metadata.fallback) {
5646
+ continue;
5647
+ }
5648
+ fontFamilies.add(fontFamily);
5649
+ if (fontFamilies.size >= FONT_TOP_PICKS_SLOTS) {
5650
+ break;
5651
+ }
5652
+ }
5653
+ return fontFamilies.size ? [...fontFamilies] : null;
5654
+ };
5584
5655
  var restoreAppState = (appState, localAppState) => {
5585
5656
  appState = appState || {};
5586
5657
  const defaultAppState = getDefaultAppState();
@@ -5622,6 +5693,7 @@ var restoreAppState = (appState, localAppState) => {
5622
5693
  nextAppState.colorTopPicks?.stickyNoteBackground
5623
5694
  )
5624
5695
  };
5696
+ nextAppState.fontTopPicks = restoreFontTopPicks(nextAppState.fontTopPicks);
5625
5697
  if (appState.currentItemStrokeWidth !== void 0) {
5626
5698
  nextAppState.currentItemStrokeWidthKey = getStrokeWidthKey(appState.currentItemStrokeWidth) ?? defaultAppState.currentItemStrokeWidthKey;
5627
5699
  }
@@ -5703,7 +5775,7 @@ var parseFileContents = async (blob) => {
5703
5775
  let contents;
5704
5776
  if (blob.type === MIME_TYPES6.png) {
5705
5777
  try {
5706
- return await (await import("./data/image-OGAD6TRQ.js")).decodePngMetadata(blob);
5778
+ return await (await import("./data/image-GQWXOMCO.js")).decodePngMetadata(blob);
5707
5779
  } catch (error) {
5708
5780
  if (error.message === "INVALID") {
5709
5781
  throw new ImageSceneDataError(
@@ -6112,6 +6184,7 @@ export {
6112
6184
  constrainScrollState,
6113
6185
  getViewportForZoomWithScrollConstraints,
6114
6186
  zoomToFitBounds,
6187
+ scrollBoundsIntoView,
6115
6188
  getScrollToContentState,
6116
6189
  getNormalizedZoom,
6117
6190
  getNormalizedGridStep,
@@ -6185,4 +6258,4 @@ export {
6185
6258
  createFile,
6186
6259
  normalizeFile
6187
6260
  };
6188
- //# sourceMappingURL=chunk-AO643733.js.map
6261
+ //# sourceMappingURL=chunk-KMZYJ2CN.js.map