tldraw 4.3.0-next.705b6ec94f43 → 4.3.0-next.7f179bd04d6c

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 (202) hide show
  1. package/dist-cjs/index.d.ts +14 -5
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/bindings/arrow/ArrowBindingUtil.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +2 -2
  5. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  6. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  7. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  9. package/dist-cjs/lib/shapes/arrow/elbow/elbowArrowSnapLines.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/shared.js.map +2 -2
  11. package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +2 -2
  12. package/dist-cjs/lib/shapes/bookmark/bookmarks.js.map +2 -2
  13. package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +2 -2
  14. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +2 -2
  15. package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
  16. package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +2 -2
  17. package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +2 -2
  18. package/dist-cjs/lib/shapes/note/noteHelpers.js.map +2 -2
  19. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  20. package/dist-cjs/lib/shapes/shared/RichTextLabel.js.map +2 -2
  21. package/dist-cjs/lib/shapes/shared/crop.js +1 -0
  22. package/dist-cjs/lib/shapes/shared/crop.js.map +2 -2
  23. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  24. package/dist-cjs/lib/shapes/shared/useEditableRichText.js.map +2 -2
  25. package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +2 -2
  26. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  27. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  28. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +1 -4
  29. package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +2 -2
  30. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  31. package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
  32. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +1 -1
  33. package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +2 -2
  34. package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +2 -2
  35. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  36. package/dist-cjs/lib/tools/SelectTool/childStates/PointingArrowLabel.js.map +2 -2
  37. package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
  38. package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
  39. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  40. package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +2 -2
  41. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  42. package/dist-cjs/lib/ui/components/EditLinkDialog.js +11 -1
  43. package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +2 -2
  44. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  45. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  46. package/dist-cjs/lib/ui/context/actions.js +1 -2
  47. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  48. package/dist-cjs/lib/ui/hooks/menu-hooks.js.map +2 -2
  49. package/dist-cjs/lib/ui/hooks/useFlatten.js.map +2 -2
  50. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  51. package/dist-cjs/lib/ui/version.js +3 -3
  52. package/dist-cjs/lib/ui/version.js.map +1 -1
  53. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js +8 -0
  54. package/dist-cjs/lib/utils/excalidraw/putExcalidrawContent.js.map +2 -2
  55. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  56. package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
  57. package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +2 -2
  58. package/dist-esm/index.d.mts +14 -5
  59. package/dist-esm/index.mjs +1 -1
  60. package/dist-esm/lib/bindings/arrow/ArrowBindingUtil.mjs.map +2 -2
  61. package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +2 -2
  62. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  63. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  64. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +2 -2
  65. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  66. package/dist-esm/lib/shapes/arrow/elbow/elbowArrowSnapLines.mjs.map +2 -2
  67. package/dist-esm/lib/shapes/arrow/shared.mjs.map +2 -2
  68. package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +2 -2
  69. package/dist-esm/lib/shapes/bookmark/bookmarks.mjs.map +2 -2
  70. package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +2 -2
  71. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +2 -2
  72. package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
  73. package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +2 -2
  74. package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +2 -2
  75. package/dist-esm/lib/shapes/note/noteHelpers.mjs.map +2 -2
  76. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  77. package/dist-esm/lib/shapes/shared/RichTextLabel.mjs.map +2 -2
  78. package/dist-esm/lib/shapes/shared/crop.mjs +1 -0
  79. package/dist-esm/lib/shapes/shared/crop.mjs.map +2 -2
  80. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  81. package/dist-esm/lib/shapes/shared/useEditableRichText.mjs.map +2 -2
  82. package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +2 -2
  83. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  84. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +1 -4
  85. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  86. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +1 -4
  87. package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +2 -2
  88. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  89. package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
  90. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +1 -1
  91. package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +2 -2
  92. package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +2 -2
  93. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  94. package/dist-esm/lib/tools/SelectTool/childStates/PointingArrowLabel.mjs.map +2 -2
  95. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +1 -4
  96. package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
  97. package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
  98. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  99. package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +2 -2
  100. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  101. package/dist-esm/lib/ui/components/EditLinkDialog.mjs +11 -1
  102. package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +2 -2
  103. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  104. package/dist-esm/lib/ui/components/menu-items.mjs +1 -4
  105. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  106. package/dist-esm/lib/ui/context/actions.mjs +1 -2
  107. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  108. package/dist-esm/lib/ui/hooks/menu-hooks.mjs +1 -4
  109. package/dist-esm/lib/ui/hooks/menu-hooks.mjs.map +2 -2
  110. package/dist-esm/lib/ui/hooks/useFlatten.mjs.map +2 -2
  111. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  112. package/dist-esm/lib/ui/version.mjs +3 -3
  113. package/dist-esm/lib/ui/version.mjs.map +1 -1
  114. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs +8 -0
  115. package/dist-esm/lib/utils/excalidraw/putExcalidrawContent.mjs.map +2 -2
  116. package/dist-esm/lib/utils/export/exportAs.mjs +1 -3
  117. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  118. package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
  119. package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +2 -2
  120. package/package.json +10 -10
  121. package/src/lib/bindings/arrow/ArrowBindingUtil.ts +1 -1
  122. package/src/lib/canvas/TldrawSelectionForeground.tsx +4 -9
  123. package/src/lib/defaultExternalContentHandlers.ts +3 -4
  124. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +2 -2
  125. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +1 -1
  126. package/src/lib/shapes/arrow/arrowLabel.ts +1 -1
  127. package/src/lib/shapes/arrow/arrowTargetState.ts +1 -1
  128. package/src/lib/shapes/arrow/elbow/elbowArrowSnapLines.tsx +3 -3
  129. package/src/lib/shapes/arrow/shared.ts +4 -4
  130. package/src/lib/shapes/arrow/toolStates/Pointing.tsx +1 -1
  131. package/src/lib/shapes/bookmark/bookmarks.ts +3 -3
  132. package/src/lib/shapes/draw/toolStates/Drawing.ts +4 -4
  133. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  134. package/src/lib/shapes/frame/FrameShapeTool.ts +1 -1
  135. package/src/lib/shapes/geo/GeoShapeUtil.test.tsx +10 -2
  136. package/src/lib/shapes/geo/toolStates/Pointing.ts +3 -3
  137. package/src/lib/shapes/line/LineShapeTool.test.ts +6 -6
  138. package/src/lib/shapes/line/LineShapeUtil.test.tsx +5 -5
  139. package/src/lib/shapes/line/toolStates/Pointing.ts +1 -1
  140. package/src/lib/shapes/note/NoteShapeTool.test.ts +2 -1
  141. package/src/lib/shapes/note/noteHelpers.ts +2 -2
  142. package/src/lib/shapes/shared/PlainTextLabel.tsx +2 -1
  143. package/src/lib/shapes/shared/RichTextLabel.tsx +2 -1
  144. package/src/lib/shapes/shared/crop.ts +1 -0
  145. package/src/lib/shapes/shared/useEditablePlainText.ts +7 -3
  146. package/src/lib/shapes/shared/useEditableRichText.ts +7 -3
  147. package/src/lib/shapes/text/TextShapeTool.test.ts +4 -4
  148. package/src/lib/shapes/text/toolStates/Pointing.ts +1 -1
  149. package/src/lib/tools/EraserTool/childStates/Erasing.ts +3 -5
  150. package/src/lib/tools/EraserTool/childStates/Pointing.ts +3 -16
  151. package/src/lib/tools/SelectTool/DragAndDropManager.ts +2 -4
  152. package/src/lib/tools/SelectTool/childStates/Brushing.ts +2 -6
  153. package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +2 -3
  154. package/src/lib/tools/SelectTool/childStates/DraggingHandle.tsx +4 -7
  155. package/src/lib/tools/SelectTool/childStates/EditingShape.ts +2 -4
  156. package/src/lib/tools/SelectTool/childStates/Idle.ts +6 -10
  157. package/src/lib/tools/SelectTool/childStates/PointingArrowLabel.ts +1 -1
  158. package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +4 -12
  159. package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -2
  160. package/src/lib/tools/SelectTool/childStates/Resizing.ts +2 -4
  161. package/src/lib/tools/SelectTool/childStates/ScribbleBrushing.ts +2 -4
  162. package/src/lib/tools/SelectTool/childStates/Translating.ts +1 -3
  163. package/src/lib/ui/components/EditLinkDialog.tsx +16 -6
  164. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +2 -2
  165. package/src/lib/ui/components/menu-items.tsx +6 -14
  166. package/src/lib/ui/context/actions.tsx +9 -13
  167. package/src/lib/ui/hooks/menu-hooks.ts +9 -19
  168. package/src/lib/ui/hooks/useFlatten.ts +1 -2
  169. package/src/lib/ui/hooks/useTools.tsx +1 -2
  170. package/src/lib/ui/version.ts +3 -3
  171. package/src/lib/utils/excalidraw/putExcalidrawContent.ts +8 -0
  172. package/src/lib/utils/export/exportAs.ts +2 -9
  173. package/src/lib/utils/frames/frames.ts +1 -1
  174. package/src/lib/utils/tldr/buildFromV1Document.ts +12 -17
  175. package/src/test/Editor.test.tsx +38 -12
  176. package/src/test/SelectTool.test.ts +11 -19
  177. package/src/test/TestEditor.ts +1 -4
  178. package/src/test/TldrawEditor.test.tsx +21 -18
  179. package/src/test/bindings.test.tsx +29 -25
  180. package/src/test/bindingsIndex.test.tsx +4 -4
  181. package/src/test/commands/createShape.test.ts +64 -0
  182. package/src/test/commands/createShapes.test.ts +15 -1
  183. package/src/test/commands/getSvgString.test.ts +2 -2
  184. package/src/test/commands/isShapeOfType.test.ts +44 -0
  185. package/src/test/commands/putContent.test.ts +1 -0
  186. package/src/test/commands/updateShape.test.ts +67 -0
  187. package/src/test/commands/updateShapes.test.ts +21 -5
  188. package/src/test/custom-clipping.test.ts +36 -35
  189. package/src/test/customSnapping.test.tsx +77 -62
  190. package/src/test/duplicate.test.ts +1 -1
  191. package/src/test/frames.test.ts +2 -2
  192. package/src/test/getCulledShapes.test.tsx +11 -3
  193. package/src/test/getShapeAtPoint.test.ts +2 -2
  194. package/src/test/groups.test.tsx +6 -3
  195. package/src/test/resizing.test.ts +9 -13
  196. package/src/test/selection-omnibus.test.ts +11 -11
  197. package/src/test/shapeutils.test.ts +1 -1
  198. package/src/test/styles2.test.tsx +1 -1
  199. package/src/test/styles3.test.ts +5 -5
  200. package/src/test/test-jsx.tsx +69 -57
  201. package/src/test/text.test.ts +15 -17
  202. package/src/test/translating.test.ts +6 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/ui/context/actions.tsx"],
4
- "sourcesContent": ["import {\n\tBox,\n\tDefaultColorStyle,\n\tDefaultFillStyle,\n\tEditor,\n\tHALF_PI,\n\tPageRecordType,\n\tResult,\n\tTLBookmarkShape,\n\tTLEmbedShape,\n\tTLFrameShape,\n\tTLGroupShape,\n\tTLImageShape,\n\tTLShape,\n\tTLShapeId,\n\tTLShapePartial,\n\tTLTextShape,\n\tTLVideoShape,\n\tVec,\n\tapproximately,\n\tcompact,\n\tcreateShapeId,\n\tkickoutOccludedShapes,\n\topenWindow,\n\tuseMaybeEditor,\n} from '@tldraw/editor'\nimport * as React from 'react'\nimport { createBookmarkFromUrl } from '../../shapes/bookmark/bookmarks'\nimport { fitFrameToContent, removeFrame } from '../../utils/frames/frames'\nimport { generateShapeAnnouncementMessage } from '../components/A11y'\nimport { EditLinkDialog } from '../components/EditLinkDialog'\nimport { EmbedDialog } from '../components/EmbedDialog'\nimport { DefaultKeyboardShortcutsDialog } from '../components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialog'\nimport { useShowCollaborationUi } from '../hooks/useCollaborationStatus'\nimport { flattenShapesToImages } from '../hooks/useFlatten'\nimport { TLUiTranslationKey } from '../hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../hooks/useTranslation/useTranslation'\nimport { TLUiIconType } from '../icon-types'\nimport { TLUiOverrideHelpers, useDefaultHelpers } from '../overrides'\nimport { useA11y } from './a11y'\nimport { useTldrawUiComponents } from './components'\nimport { TLUiEventSource, useUiEvents } from './events'\n\n/** @public */\nexport interface TLUiActionItem<\n\tTransationKey extends string = string,\n\tIconType extends string = string,\n> {\n\ticon?: IconType | React.ReactElement\n\tid: string\n\tkbd?: string\n\tlabel?: TransationKey | { [key: string]: TransationKey }\n\treadonlyOk?: boolean\n\tcheckbox?: boolean\n\tisRequiredA11yAction?: boolean\n\tonSelect(source: TLUiEventSource): Promise<void> | void\n}\n\n/** @public */\nexport type TLUiActionsContextType = Record<string, TLUiActionItem>\n\n/** @internal */\nexport const ActionsContext = React.createContext<TLUiActionsContextType | null>(null)\n\n/** @public */\nexport interface ActionsProviderProps {\n\toverrides?(\n\t\teditor: Editor,\n\t\tactions: TLUiActionsContextType,\n\t\thelpers: TLUiOverrideHelpers\n\t): TLUiActionsContextType\n\tchildren: React.ReactNode\n}\n\n/** @public */\nexport function supportsDownloadingOriginal(\n\tshape: TLShape,\n\teditor: Editor\n): shape is TLImageShape | TLVideoShape {\n\treturn (\n\t\t(editor.isShapeOfType(shape, 'image') || editor.isShapeOfType(shape, 'video')) &&\n\t\t!!(shape as any).props.assetId\n\t)\n}\n\nfunction makeActions(actions: TLUiActionItem[]) {\n\treturn Object.fromEntries(actions.map((action) => [action.id, action])) as TLUiActionsContextType\n}\n\nfunction getExportName(editor: Editor, defaultName: string) {\n\tconst selectedShapes = editor.getSelectedShapes()\n\t// When we don't have any shapes selected, we want to use the document name\n\tif (selectedShapes.length === 0) {\n\t\treturn editor.getDocumentSettings().name || defaultName\n\t}\n\treturn undefined\n}\n\n/** @internal */\nexport function ActionsProvider({ overrides, children }: ActionsProviderProps) {\n\tconst _editor = useMaybeEditor()\n\tconst showCollaborationUi = useShowCollaborationUi()\n\tconst helpers = useDefaultHelpers()\n\tconst components = useTldrawUiComponents()\n\tconst trackEvent = useUiEvents()\n\tconst a11y = useA11y()\n\tconst msg = useTranslation()\n\n\tconst defaultDocumentName = helpers.msg('document.default-name')\n\n\t// should this be a useMemo? looks like it doesn't actually deref any reactive values\n\tconst actions = React.useMemo<TLUiActionsContextType>(() => {\n\t\tconst editor = _editor as Editor\n\t\tif (!editor) return {}\n\t\tfunction mustGoBackToSelectToolFirst() {\n\t\t\tif (!editor.isIn('select')) {\n\t\t\t\teditor.complete()\n\t\t\t\teditor.setCurrentTool('select')\n\t\t\t\treturn false // false will still let the action happen, true will stop it\n\t\t\t\t// todo: remove this return value once we're suuuuure\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\n\t\tfunction canApplySelectionAction() {\n\t\t\treturn editor.isIn('select') && editor.getSelectedShapeIds().length > 0\n\t\t}\n\n\t\tfunction scaleShapes(scaleFactor: number) {\n\t\t\tif (!canApplySelectionAction()) return\n\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\teditor.markHistoryStoppingPoint('resize shapes')\n\n\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\tif (selectedShapeIds.length === 0) return\n\n\t\t\teditor.run(() => {\n\t\t\t\t// Get the selected shapes\n\t\t\t\tconst shapes = selectedShapeIds\n\t\t\t\t\t.map((id) => editor.getShape(id))\n\t\t\t\t\t.filter(Boolean) as TLShape[]\n\n\t\t\t\t// Update each shape\n\t\t\t\tshapes.forEach((shape) => {\n\t\t\t\t\teditor.resizeShape(shape.id, new Vec(scaleFactor, scaleFactor), {\n\t\t\t\t\t\tscaleOrigin: editor.getSelectionPageBounds()?.center,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\tconst actionItems: TLUiActionItem<TLUiTranslationKey, TLUiIconType>[] = [\n\t\t\t{\n\t\t\t\tid: 'edit-link',\n\t\t\t\tlabel: 'action.edit-link',\n\t\t\t\ticon: 'link',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('edit-link', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('edit-link')\n\t\t\t\t\thelpers.addDialog({ component: EditLinkDialog })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'insert-embed',\n\t\t\t\tlabel: 'action.insert-embed',\n\t\t\t\tkbd: 'cmd+i,ctrl+i',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('insert-embed', { source })\n\t\t\t\t\thelpers.addDialog({ component: EmbedDialog })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'open-kbd-shortcuts',\n\t\t\t\tlabel: 'action.open-kbd-shortcuts',\n\t\t\t\tkbd: 'cmd+alt+/,ctrl+alt+/',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('open-kbd-shortcuts', { source })\n\t\t\t\t\thelpers.addDialog({\n\t\t\t\t\t\tcomponent: components.KeyboardShortcutsDialog ?? DefaultKeyboardShortcutsDialog,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'insert-media',\n\t\t\t\tlabel: 'action.insert-media',\n\t\t\t\tkbd: 'cmd+u,ctrl+u',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('insert-media', { source })\n\t\t\t\t\thelpers.insertMedia()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'undo',\n\t\t\t\tlabel: 'action.undo',\n\t\t\t\ticon: 'undo',\n\t\t\t\tkbd: 'cmd+z,ctrl+z',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('undo', { source })\n\t\t\t\t\teditor.undo()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'redo',\n\t\t\t\tlabel: 'action.redo',\n\t\t\t\ticon: 'redo',\n\t\t\t\tkbd: 'cmd+shift+z,ctrl+shift+z',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('redo', { source })\n\t\t\t\t\teditor.redo()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-as-svg',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-as-svg',\n\t\t\t\t\tmenu: 'action.export-as-svg.short',\n\t\t\t\t\t['context-menu']: 'action.export-as-svg.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-as', { format: 'svg', source })\n\t\t\t\t\thelpers.exportAs(ids, { format: 'svg', name: getExportName(editor, defaultDocumentName) })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-as-png',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-as-png',\n\t\t\t\t\tmenu: 'action.export-as-png.short',\n\t\t\t\t\t['context-menu']: 'action.export-as-png.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-as', { format: 'png', source })\n\t\t\t\t\thelpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-all-as-svg',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-all-as-svg',\n\t\t\t\t\tmenu: 'action.export-all-as-svg.short',\n\t\t\t\t\t['context-menu']: 'action.export-all-as-svg.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-all-as', { format: 'svg', source })\n\t\t\t\t\thelpers.exportAs(Array.from(editor.getCurrentPageShapeIds()), {\n\t\t\t\t\t\tformat: 'svg',\n\t\t\t\t\t\tname: getExportName(editor, defaultDocumentName),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-all-as-png',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-all-as-png',\n\t\t\t\t\tmenu: 'action.export-all-as-png.short',\n\t\t\t\t\t['context-menu']: 'action.export-all-as-png.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-all-as', { format: 'png', source })\n\t\t\t\t\thelpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'copy-as-svg',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.copy-as-svg',\n\t\t\t\t\tmenu: 'action.copy-as-svg.short',\n\t\t\t\t\t['context-menu']: 'action.copy-as-svg.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'cmd+shift+c,ctrl+shift+c',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('copy-as', { format: 'svg', source })\n\t\t\t\t\thelpers.copyAs(ids, 'svg')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'copy-as-png',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.copy-as-png',\n\t\t\t\t\tmenu: 'action.copy-as-png.short',\n\t\t\t\t\t['context-menu']: 'action.copy-as-png.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('copy-as', { format: 'png', source })\n\t\t\t\t\thelpers.copyAs(ids, 'png')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-auto-size',\n\t\t\t\tlabel: 'action.toggle-auto-size',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('toggle-auto-size', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('toggling auto size')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst shapes = editor\n\t\t\t\t\t\t\t.getSelectedShapes()\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(shape): shape is TLTextShape =>\n\t\t\t\t\t\t\t\t\teditor.isShapeOfType<TLTextShape>(shape, 'text') && shape.props.autoSize === false\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\teditor.updateShapes(\n\t\t\t\t\t\t\tshapes.map((shape) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: shape.id,\n\t\t\t\t\t\t\t\t\ttype: shape.type,\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\t\t\t\t\tw: 8,\n\t\t\t\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t\tkickoutOccludedShapes(\n\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\tshapes.map((shape) => shape.id)\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'open-embed-link',\n\t\t\t\tlabel: 'action.open-embed-link',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('open-embed-link', { source })\n\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\tconst warnMsg = 'No embed shapes selected'\n\t\t\t\t\tif (ids.length !== 1) {\n\t\t\t\t\t\tconsole.error(warnMsg)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst shape = editor.getShape(ids[0])\n\t\t\t\t\tif (!shape || !editor.isShapeOfType<TLEmbedShape>(shape, 'embed')) {\n\t\t\t\t\t\tconsole.error(warnMsg)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\topenWindow(shape.props.url, '_blank')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-zoom-tool',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: 'z',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (editor.root.getCurrent()?.id === 'zoom') return\n\n\t\t\t\t\ttrackEvent('zoom-tool', { source })\n\t\t\t\t\tif (!(editor.inputs.shiftKey || editor.inputs.ctrlKey)) {\n\t\t\t\t\t\tconst currentTool = editor.root.getCurrent()\n\t\t\t\t\t\tif (currentTool && currentTool.getCurrent()?.id === 'idle') {\n\t\t\t\t\t\t\teditor.setCurrentTool('zoom', { onInteractionEnd: currentTool.id, maskAs: 'zoom' })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'convert-to-bookmark',\n\t\t\t\tlabel: 'action.convert-to-bookmark',\n\t\t\t\tasync onSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('convert-to-bookmark', { source })\n\t\t\t\t\tconst shapes = editor.getSelectedShapes()\n\n\t\t\t\t\tconst markId = editor.markHistoryStoppingPoint('convert shapes to bookmark')\n\n\t\t\t\t\tconst creationPromises: Promise<Result<any, any>>[] = []\n\n\t\t\t\t\tfor (const shape of shapes) {\n\t\t\t\t\t\tif (!shape || !editor.isShapeOfType<TLEmbedShape>(shape, 'embed') || !shape.props.url)\n\t\t\t\t\t\t\tcontinue\n\n\t\t\t\t\t\tconst center = editor.getShapePageBounds(shape)?.center\n\n\t\t\t\t\t\tif (!center) continue\n\t\t\t\t\t\teditor.deleteShapes([shape.id])\n\n\t\t\t\t\t\tcreationPromises.push(\n\t\t\t\t\t\t\tcreateBookmarkFromUrl(editor, { url: shape.props.url, center }).then((res) => {\n\t\t\t\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\t\t\t\tthrow new Error(res.error)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn res\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creationPromises).catch((error) => {\n\t\t\t\t\t\teditor.bailToMark(markId)\n\t\t\t\t\t\tconsole.error(error)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'convert-to-embed',\n\t\t\t\tlabel: 'action.convert-to-embed',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('convert-to-embed', { source })\n\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\t\tconst shapes = compact(ids.map((id) => editor.getShape(id)))\n\n\t\t\t\t\t\tconst createList: TLShapePartial[] = []\n\t\t\t\t\t\tconst deleteList: TLShapeId[] = []\n\t\t\t\t\t\tfor (const shape of shapes) {\n\t\t\t\t\t\t\tif (!editor.isShapeOfType<TLBookmarkShape>(shape, 'bookmark')) continue\n\n\t\t\t\t\t\t\tconst { url } = shape.props\n\n\t\t\t\t\t\t\tconst embedInfo = helpers.getEmbedDefinition(url)\n\n\t\t\t\t\t\t\tif (!embedInfo) continue\n\t\t\t\t\t\t\tif (!embedInfo.definition) continue\n\n\t\t\t\t\t\t\tconst { width, height } = embedInfo.definition\n\n\t\t\t\t\t\t\tconst newPos = new Vec(shape.x, shape.y)\n\t\t\t\t\t\t\tnewPos.rot(-shape.rotation)\n\t\t\t\t\t\t\tnewPos.add(new Vec(shape.props.w / 2 - width / 2, shape.props.h / 2 - height / 2))\n\t\t\t\t\t\t\tnewPos.rot(shape.rotation)\n\n\t\t\t\t\t\t\tconst shapeToCreate: TLShapePartial<TLEmbedShape> = {\n\t\t\t\t\t\t\t\tid: createShapeId(),\n\t\t\t\t\t\t\t\ttype: 'embed',\n\t\t\t\t\t\t\t\tx: newPos.x,\n\t\t\t\t\t\t\t\ty: newPos.y,\n\t\t\t\t\t\t\t\trotation: shape.rotation,\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\turl: url,\n\t\t\t\t\t\t\t\t\tw: width,\n\t\t\t\t\t\t\t\t\th: height,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcreateList.push(shapeToCreate)\n\t\t\t\t\t\t\tdeleteList.push(shape.id)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('convert shapes to embed')\n\t\t\t\t\t\teditor.deleteShapes(deleteList)\n\t\t\t\t\t\teditor.createShapes(createList)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'duplicate',\n\t\t\t\tkbd: 'cmd+d,ctrl+d',\n\t\t\t\tlabel: 'action.duplicate',\n\t\t\t\ticon: 'duplicate',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('duplicate-shapes', { source })\n\t\t\t\t\tconst instanceState = editor.getInstanceState()\n\t\t\t\t\tlet ids: TLShapeId[]\n\t\t\t\t\tlet offset: { x: number; y: number }\n\n\t\t\t\t\tif (instanceState.duplicateProps) {\n\t\t\t\t\t\tids = instanceState.duplicateProps.shapeIds\n\t\t\t\t\t\toffset = instanceState.duplicateProps.offset\n\t\t\t\t\t} else {\n\t\t\t\t\t\tids = editor.getSelectedShapeIds()\n\t\t\t\t\t\tconst commonBounds = Box.Common(compact(ids.map((id) => editor.getShapePageBounds(id))))\n\t\t\t\t\t\toffset = editor.getCameraOptions().isLocked\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t// same as the adjacent note margin\n\t\t\t\t\t\t\t\t\tx: editor.options.adjacentShapeMargin,\n\t\t\t\t\t\t\t\t\ty: editor.options.adjacentShapeMargin,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tx: commonBounds.width + editor.options.adjacentShapeMargin,\n\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.markHistoryStoppingPoint('duplicate shapes')\n\t\t\t\t\teditor.duplicateShapes(ids, offset)\n\n\t\t\t\t\tif (instanceState.duplicateProps) {\n\t\t\t\t\t\t// If we are using duplicate props then we update the shape ids to the\n\t\t\t\t\t\t// ids of the newly created shapes to keep the duplication going\n\t\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\t\tduplicateProps: {\n\t\t\t\t\t\t\t\t...instanceState.duplicateProps,\n\t\t\t\t\t\t\t\tshapeIds: editor.getSelectedShapeIds(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'ungroup',\n\t\t\t\tlabel: 'action.ungroup',\n\t\t\t\tkbd: 'cmd+shift+g,ctrl+shift+g',\n\t\t\t\ticon: 'ungroup',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('ungroup-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('ungroup')\n\t\t\t\t\teditor.ungroupShapes(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'group',\n\t\t\t\tlabel: 'action.group',\n\t\t\t\tkbd: 'cmd+g,ctrl+g',\n\t\t\t\ticon: 'group',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('group-shapes', { source })\n\t\t\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\t\t\tif (onlySelectedShape && editor.isShapeOfType<TLGroupShape>(onlySelectedShape, 'group')) {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('ungroup')\n\t\t\t\t\t\teditor.ungroupShapes(editor.getSelectedShapeIds())\n\t\t\t\t\t} else {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('group')\n\t\t\t\t\t\teditor.groupShapes(editor.getSelectedShapeIds())\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'remove-frame',\n\t\t\t\tlabel: 'action.remove-frame',\n\t\t\t\tkbd: 'cmd+shift+f,ctrl+shift+f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\ttrackEvent('remove-frame', { source })\n\t\t\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\t\t\t\t\tif (\n\t\t\t\t\t\tselectedShapes.length > 0 &&\n\t\t\t\t\t\tselectedShapes.every((shape) => editor.isShapeOfType<TLFrameShape>(shape, 'frame'))\n\t\t\t\t\t) {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('remove-frame')\n\t\t\t\t\t\tremoveFrame(\n\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\tselectedShapes.map((shape) => shape.id)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'fit-frame-to-content',\n\t\t\t\tlabel: 'action.fit-frame-to-content',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\ttrackEvent('fit-frame-to-content', { source })\n\t\t\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\t\t\tif (onlySelectedShape && editor.isShapeOfType<TLFrameShape>(onlySelectedShape, 'frame')) {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('fit-frame-to-content')\n\t\t\t\t\t\tfitFrameToContent(editor, onlySelectedShape.id)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-left',\n\t\t\t\tlabel: 'action.align-left',\n\t\t\t\tkbd: 'alt+A',\n\t\t\t\ticon: 'align-left',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'left', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align left')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'left')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-center-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.align-center-horizontal',\n\t\t\t\t\t['context-menu']: 'action.align-center-horizontal.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'alt+H',\n\t\t\t\ticon: 'align-center-horizontal',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'center-horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align center horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'center-horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-right',\n\t\t\t\tlabel: 'action.align-right',\n\t\t\t\tkbd: 'alt+D',\n\t\t\t\ticon: 'align-right',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'right', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align right')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'right')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-center-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.align-center-vertical',\n\t\t\t\t\t['context-menu']: 'action.align-center-vertical.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'alt+V',\n\t\t\t\ticon: 'align-center-vertical',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'center-vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align center vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'center-vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-top',\n\t\t\t\tlabel: 'action.align-top',\n\t\t\t\ticon: 'align-top',\n\t\t\t\tkbd: 'alt+W',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'top', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align top')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'top')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-bottom',\n\t\t\t\tlabel: 'action.align-bottom',\n\t\t\t\ticon: 'align-bottom',\n\t\t\t\tkbd: 'alt+S',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'bottom', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align bottom')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'bottom')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'distribute-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.distribute-horizontal',\n\t\t\t\t\t['context-menu']: 'action.distribute-horizontal.short',\n\t\t\t\t},\n\t\t\t\ticon: 'distribute-horizontal',\n\t\t\t\tkbd: 'alt+shift+h',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('distribute-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('distribute horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.distributeShapes(selectedShapeIds, 'horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'distribute-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.distribute-vertical',\n\t\t\t\t\t['context-menu']: 'action.distribute-vertical.short',\n\t\t\t\t},\n\t\t\t\ticon: 'distribute-vertical',\n\t\t\t\tkbd: 'alt+shift+V',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('distribute-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('distribute vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.distributeShapes(selectedShapeIds, 'vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stretch-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stretch-horizontal',\n\t\t\t\t\t['context-menu']: 'action.stretch-horizontal.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stretch-horizontal',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stretch-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stretch horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stretchShapes(selectedShapeIds, 'horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stretch-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stretch-vertical',\n\t\t\t\t\t['context-menu']: 'action.stretch-vertical.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stretch-vertical',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stretch-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stretch vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stretchShapes(selectedShapeIds, 'vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'flip-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.flip-horizontal',\n\t\t\t\t\t['context-menu']: 'action.flip-horizontal.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'shift+h',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('flip-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('flip horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.flipShapes(selectedShapeIds, 'horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'flip-vertical',\n\t\t\t\tlabel: { default: 'action.flip-vertical', ['context-menu']: 'action.flip-vertical.short' },\n\t\t\t\tkbd: 'shift+v',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('flip-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('flip vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.flipShapes(selectedShapeIds, 'vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'pack',\n\t\t\t\tlabel: 'action.pack',\n\t\t\t\ticon: 'pack',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('pack-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('pack')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.packShapes(selectedShapeIds, editor.options.adjacentShapeMargin)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stack-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stack-vertical',\n\t\t\t\t\t['context-menu']: 'action.stack-vertical.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stack-vertical',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stack-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stack-vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stackShapes(selectedShapeIds, 'vertical', editor.options.adjacentShapeMargin)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stack-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stack-horizontal',\n\t\t\t\t\t['context-menu']: 'action.stack-horizontal.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stack-horizontal',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stack-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stack-horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stackShapes(selectedShapeIds, 'horizontal', editor.options.adjacentShapeMargin)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bring-to-front',\n\t\t\t\tlabel: 'action.bring-to-front',\n\t\t\t\tkbd: ']',\n\t\t\t\ticon: 'bring-to-front',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'toFront', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('bring to front')\n\t\t\t\t\teditor.bringToFront(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bring-forward',\n\t\t\t\tlabel: 'action.bring-forward',\n\t\t\t\ticon: 'bring-forward',\n\t\t\t\tkbd: 'alt+]',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'forward', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('bring forward')\n\t\t\t\t\teditor.bringForward(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'send-backward',\n\t\t\t\tlabel: 'action.send-backward',\n\t\t\t\ticon: 'send-backward',\n\t\t\t\tkbd: 'alt+[',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'backward', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('send backward')\n\t\t\t\t\teditor.sendBackward(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'send-to-back',\n\t\t\t\tlabel: 'action.send-to-back',\n\t\t\t\ticon: 'send-to-back',\n\t\t\t\tkbd: '[',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'toBack', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('send to back')\n\t\t\t\t\teditor.sendToBack(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'cut',\n\t\t\t\tlabel: 'action.cut',\n\t\t\t\tkbd: 'cmd+x,ctrl+x',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\teditor.markHistoryStoppingPoint('cut')\n\t\t\t\t\thelpers.cut(source)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'copy',\n\t\t\t\tlabel: 'action.copy',\n\t\t\t\tkbd: 'cmd+c,ctrl+c',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\thelpers.copy(source)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'paste',\n\t\t\t\tlabel: 'action.paste',\n\t\t\t\tkbd: 'cmd+v,ctrl+v',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tnavigator.clipboard\n\t\t\t\t\t\t?.read()\n\t\t\t\t\t\t.then((clipboardItems) => {\n\t\t\t\t\t\t\thelpers.paste(\n\t\t\t\t\t\t\t\tclipboardItems,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\tsource === 'context-menu' ? editor.inputs.currentPagePoint : undefined\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\thelpers.addToast({\n\t\t\t\t\t\t\t\ttitle: helpers.msg('action.paste-error-title'),\n\t\t\t\t\t\t\t\tdescription: helpers.msg('action.paste-error-description'),\n\t\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-all',\n\t\t\t\tlabel: 'action.select-all',\n\t\t\t\tkbd: 'cmd+a,ctrl+a',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\t\ttrackEvent('select-all-shapes', { source })\n\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('select all kbd')\n\t\t\t\t\t\teditor.selectAll()\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-none',\n\t\t\t\tlabel: 'action.select-none',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('select-none-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('select none')\n\t\t\t\t\teditor.selectNone()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'delete',\n\t\t\t\tlabel: 'action.delete',\n\t\t\t\tkbd: '\u232B,del',\n\t\t\t\ticon: 'trash',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('delete-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('delete')\n\t\t\t\t\teditor.deleteShapes(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'rotate-cw',\n\t\t\t\tlabel: 'action.rotate-cw',\n\t\t\t\ticon: 'rotate-cw',\n\t\t\t\tkbd: 'shift+.,shift+alt+.',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\tconst isFine = editor.inputs.altKey\n\t\t\t\t\ttrackEvent('rotate-cw', { source, fine: isFine })\n\t\t\t\t\teditor.markHistoryStoppingPoint('rotate-cw')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst rotation = HALF_PI / (isFine ? 96 : 6)\n\t\t\t\t\t\tconst offset = editor.getSelectionRotation() % rotation\n\t\t\t\t\t\tconst dontUseOffset = approximately(offset, 0) || approximately(offset, rotation)\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.rotateShapesBy(selectedShapeIds, rotation - (dontUseOffset ? 0 : offset))\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'rotate-ccw',\n\t\t\t\tlabel: 'action.rotate-ccw',\n\t\t\t\ticon: 'rotate-ccw',\n\t\t\t\t// omg double comma\n\t\t\t\tkbd: 'shift+,,shift+alt+,',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\tconst isFine = editor.inputs.altKey\n\t\t\t\t\ttrackEvent('rotate-ccw', { source, fine: isFine })\n\t\t\t\t\teditor.markHistoryStoppingPoint('rotate-ccw')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst rotation = HALF_PI / (isFine ? 96 : 6)\n\t\t\t\t\t\tconst offset = editor.getSelectionRotation() % rotation\n\t\t\t\t\t\tconst offsetCloseToZero = approximately(offset, 0)\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.rotateShapesBy(selectedShapeIds, offsetCloseToZero ? -rotation : -offset)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-in',\n\t\t\t\tlabel: 'action.zoom-in',\n\t\t\t\tkbd: 'cmd+=,ctrl+=,=',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-in', { source, towardsCursor: false })\n\t\t\t\t\teditor.zoomIn(undefined, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-in-on-cursor',\n\t\t\t\tlabel: 'action.zoom-in',\n\t\t\t\tkbd: 'shift+cmd+=,shift+ctrl+=,shift+=',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-in', { source, towardsCursor: true })\n\t\t\t\t\teditor.zoomIn(editor.inputs.currentScreenPoint, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-out',\n\t\t\t\tlabel: 'action.zoom-out',\n\t\t\t\tkbd: 'cmd+-,ctrl+-,-',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-out', { source, towardsCursor: false })\n\t\t\t\t\teditor.zoomOut(undefined, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-out-on-cursor',\n\t\t\t\tlabel: 'action.zoom-out',\n\t\t\t\tkbd: 'shift+cmd+-,shift+ctrl+-,shift+-',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-out', { source, towardsCursor: true })\n\t\t\t\t\teditor.zoomOut(editor.inputs.currentScreenPoint, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-to-100',\n\t\t\t\tlabel: 'action.zoom-to-100',\n\t\t\t\ticon: 'reset-zoom',\n\t\t\t\tkbd: 'shift+0',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('reset-zoom', { source })\n\t\t\t\t\teditor.resetZoom(undefined, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-to-fit',\n\t\t\t\tlabel: 'action.zoom-to-fit',\n\t\t\t\tkbd: 'shift+1',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-to-fit', { source })\n\t\t\t\t\teditor.zoomToFit({ animation: { duration: editor.options.animationMediumMs } })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-to-selection',\n\t\t\t\tlabel: 'action.zoom-to-selection',\n\t\t\t\tkbd: 'shift+2',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('zoom-to-selection', { source })\n\t\t\t\t\teditor.zoomToSelection({ animation: { duration: editor.options.animationMediumMs } })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-snap-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-snap-mode',\n\t\t\t\t\tmenu: 'action.toggle-snap-mode.menu',\n\t\t\t\t},\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-snap-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({ isSnapMode: !editor.user.getIsSnapMode() })\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-dark-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-dark-mode',\n\t\t\t\t\tmenu: 'action.toggle-dark-mode.menu',\n\t\t\t\t},\n\t\t\t\tkbd: 'cmd+/,ctrl+/',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst value = editor.user.getIsDarkMode() ? 'light' : 'dark'\n\t\t\t\t\ttrackEvent('color-scheme', { source, value })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tcolorScheme: value,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-wrap-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-wrap-mode',\n\t\t\t\t\tmenu: 'action.toggle-wrap-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-wrap-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tisWrapMode: !editor.user.getIsWrapMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-dynamic-size-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-dynamic-size-mode',\n\t\t\t\t\tmenu: 'action.toggle-dynamic-size-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-dynamic-size-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tisDynamicSizeMode: !editor.user.getIsDynamicResizeMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-paste-at-cursor',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-paste-at-cursor',\n\t\t\t\t\tmenu: 'action.toggle-paste-at-cursor.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-paste-at-cursor', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tisPasteAtCursorMode: !editor.user.getIsPasteAtCursorMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-reduce-motion',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-reduce-motion',\n\t\t\t\t\tmenu: 'action.toggle-reduce-motion.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-reduce-motion', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tanimationSpeed: editor.user.getAnimationSpeed() === 0 ? 1 : 0,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-keyboard-shortcuts',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-keyboard-shortcuts',\n\t\t\t\t\tmenu: 'action.toggle-keyboard-shortcuts.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-keyboard-shortcuts', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tareKeyboardShortcutsEnabled: !editor.user.getAreKeyboardShortcutsEnabled(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'enhanced-a11y-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.enhanced-a11y-mode',\n\t\t\t\t\tmenu: 'action.enhanced-a11y-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('enhanced-a11y-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tenhancedA11yMode: !editor.user.getEnhancedA11yMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-edge-scrolling',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-edge-scrolling',\n\t\t\t\t\tmenu: 'action.toggle-edge-scrolling.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-edge-scrolling', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tedgeScrollSpeed: editor.user.getEdgeScrollSpeed() === 0 ? 1 : 0,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-transparent',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-transparent',\n\t\t\t\t\tmenu: 'action.toggle-transparent.menu',\n\t\t\t\t\t['context-menu']: 'action.toggle-transparent.context-menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-transparent', { source })\n\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\texportBackground: !editor.getInstanceState().exportBackground,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-tool-lock',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-tool-lock',\n\t\t\t\t\tmenu: 'action.toggle-tool-lock.menu',\n\t\t\t\t},\n\t\t\t\tkbd: 'q',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-tool-lock', { source })\n\t\t\t\t\teditor.updateInstanceState({ isToolLocked: !editor.getInstanceState().isToolLocked })\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'unlock-all',\n\t\t\t\tlabel: 'action.unlock-all',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('unlock-all', { source })\n\t\t\t\t\tconst updates = [] as TLShapePartial[]\n\t\t\t\t\tfor (const shape of editor.getCurrentPageShapes()) {\n\t\t\t\t\t\tif (shape.isLocked) {\n\t\t\t\t\t\t\tupdates.push({ id: shape.id, type: shape.type, isLocked: false })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (updates.length > 0) {\n\t\t\t\t\t\teditor.updateShapes(updates)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-focus-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-focus-mode',\n\t\t\t\t\tmenu: 'action.toggle-focus-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: 'cmd+.,ctrl+.',\n\t\t\t\tcheckbox: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\t// this needs to be deferred because it causes the menu\n\t\t\t\t\t// UI to unmount which puts us in a dodgy state\n\t\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\t\ttrackEvent('toggle-focus-mode', { source })\n\t\t\t\t\t\t\thelpers.clearDialogs()\n\t\t\t\t\t\t\thelpers.clearToasts()\n\t\t\t\t\t\t\teditor.updateInstanceState({ isFocusMode: !editor.getInstanceState().isFocusMode })\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-grid',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-grid',\n\t\t\t\t\tmenu: 'action.toggle-grid.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: \"cmd+',ctrl+'\",\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-grid-mode', { source })\n\t\t\t\t\teditor.updateInstanceState({ isGridMode: !editor.getInstanceState().isGridMode })\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-debug-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-debug-mode',\n\t\t\t\t\tmenu: 'action.toggle-debug-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-debug-mode', { source })\n\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\tisDebugMode: !editor.getInstanceState().isDebugMode,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'print',\n\t\t\t\tlabel: 'action.print',\n\t\t\t\tkbd: 'cmd+p,ctrl+p',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('print', { source })\n\t\t\t\t\thelpers.printSelectionOrPages()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'exit-pen-mode',\n\t\t\t\tlabel: 'action.exit-pen-mode',\n\t\t\t\ticon: 'cross-2',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('exit-pen-mode', { source })\n\t\t\t\t\teditor.updateInstanceState({ isPenMode: false })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stop-following',\n\t\t\t\tlabel: 'action.stop-following',\n\t\t\t\ticon: 'cross-2',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('stop-following', { source })\n\t\t\t\t\teditor.stopFollowingUser()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'back-to-content',\n\t\t\t\tlabel: 'action.back-to-content',\n\t\t\t\ticon: 'arrow-left',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-to-content', { source })\n\t\t\t\t\tconst bounds = editor.getSelectionPageBounds() ?? editor.getCurrentPageBounds()\n\t\t\t\t\tif (!bounds) return\n\t\t\t\t\teditor.zoomToBounds(bounds, {\n\t\t\t\t\t\ttargetZoom: Math.min(1, editor.getZoomLevel()),\n\t\t\t\t\t\tanimation: { duration: 220 },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-lock',\n\t\t\t\tlabel: 'action.toggle-lock',\n\t\t\t\tkbd: 'shift+l',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.markHistoryStoppingPoint('locking')\n\t\t\t\t\ttrackEvent('toggle-lock', { source })\n\t\t\t\t\teditor.toggleLock(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'move-to-new-page',\n\t\t\t\tlabel: 'context.pages.new-page',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst newPageId = PageRecordType.createId()\n\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('move_shapes_to_page')\n\t\t\t\t\t\teditor.createPage({\n\t\t\t\t\t\t\tname: helpers.msg('page-menu.new-page-initial-name'),\n\t\t\t\t\t\t\tid: newPageId,\n\t\t\t\t\t\t})\n\t\t\t\t\t\teditor.moveShapesToPage(ids, newPageId)\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('move-to-new-page', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-white-color',\n\t\t\t\tlabel: 'color-style.white',\n\t\t\t\tkbd: 'alt+t',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst style = DefaultColorStyle\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('change-color')\n\t\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t\teditor.setStyleForSelectedShapes(style, 'white')\n\t\t\t\t\t\t}\n\t\t\t\t\t\teditor.setStyleForNextShapes(style, 'white')\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('set-style', { source, id: style.id, value: 'white' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-fill-fill',\n\t\t\t\tlabel: 'fill-style.fill',\n\t\t\t\tkbd: 'alt+f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst style = DefaultFillStyle\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('change-fill')\n\t\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t\teditor.setStyleForSelectedShapes(style, 'fill')\n\t\t\t\t\t\t}\n\t\t\t\t\t\teditor.setStyleForNextShapes(style, 'fill')\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('set-style', { source, id: style.id, value: 'fill' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-fill-lined-fill',\n\t\t\t\tlabel: 'fill-style.lined-fill',\n\t\t\t\tkbd: 'alt+shift+f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst style = DefaultFillStyle\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('change-fill')\n\t\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t\teditor.setStyleForSelectedShapes(style, 'lined-fill')\n\t\t\t\t\t\t}\n\t\t\t\t\t\teditor.setStyleForNextShapes(style, 'lined-fill')\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('set-style', { source, id: style.id, value: 'lined-fill' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'flatten-to-image',\n\t\t\t\tlabel: 'action.flatten-to-image',\n\t\t\t\tkbd: 'shift+f',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) return\n\n\t\t\t\t\teditor.markHistoryStoppingPoint('flattening to image')\n\t\t\t\t\ttrackEvent('flatten-to-image', { source })\n\n\t\t\t\t\tconst newShapeIds = await flattenShapesToImages(\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tids,\n\t\t\t\t\t\teditor.options.flattenImageBoundsExpand\n\t\t\t\t\t)\n\n\t\t\t\t\tif (newShapeIds?.length) {\n\t\t\t\t\t\teditor.setSelectedShapes(newShapeIds)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-geo-tool',\n\t\t\t\tkbd: 'g',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\t// will select whatever the most recent geo tool was\n\t\t\t\t\ttrackEvent('select-tool', { source, id: `geo-previous` })\n\t\t\t\t\teditor.setCurrentTool('geo')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'change-page-prev',\n\t\t\t\tkbd: 'alt+left,alt+up',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\t// will select whatever the most recent geo tool was\n\t\t\t\t\tconst pages = editor.getPages()\n\t\t\t\t\tconst currentPageIndex = pages.findIndex((page) => page.id === editor.getCurrentPageId())\n\t\t\t\t\tif (currentPageIndex < 1) return\n\t\t\t\t\ttrackEvent('change-page', { source, direction: 'prev' })\n\t\t\t\t\teditor.setCurrentPage(pages[currentPageIndex - 1].id)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'change-page-next',\n\t\t\t\tkbd: 'alt+right,alt+down',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\t// will select whatever the most recent geo tool was\n\t\t\t\t\tconst pages = editor.getPages()\n\t\t\t\t\tconst currentPageIndex = pages.findIndex((page) => page.id === editor.getCurrentPageId())\n\n\t\t\t\t\t// If we're on the last page...\n\t\t\t\t\tif (currentPageIndex === -1 || currentPageIndex >= pages.length - 1) {\n\t\t\t\t\t\t// if the current page is blank or if we're in readonly mode, do nothing\n\t\t\t\t\t\tif (editor.getCurrentPageShapes().length <= 0 || editor.getIsReadonly()) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Otherwise, create a new page\n\t\t\t\t\t\ttrackEvent('new-page', { source })\n\t\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\t\teditor.markHistoryStoppingPoint('creating page')\n\t\t\t\t\t\t\tconst newPageId = PageRecordType.createId()\n\t\t\t\t\t\t\teditor.createPage({\n\t\t\t\t\t\t\t\tname: helpers.msg('page-menu.new-page-initial-name'),\n\t\t\t\t\t\t\t\tid: newPageId,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\teditor.setCurrentPage(newPageId)\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.setCurrentPage(pages[currentPageIndex + 1].id)\n\t\t\t\t\ttrackEvent('change-page', { source, direction: 'next' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'adjust-shape-styles',\n\t\t\t\tlabel: 'a11y.adjust-shape-styles',\n\t\t\t\tkbd: 'cmd+Enter,ctrl+Enter',\n\t\t\t\tisRequiredA11yAction: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\t\t\tif (\n\t\t\t\t\t\tonlySelectedShape &&\n\t\t\t\t\t\t(editor.isShapeOfType<TLImageShape>(onlySelectedShape, 'image') ||\n\t\t\t\t\t\t\teditor.isShapeOfType<TLVideoShape>(onlySelectedShape, 'video'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst firstToolbarButton = editor\n\t\t\t\t\t\t\t.getContainer()\n\t\t\t\t\t\t\t.querySelector('.tlui-contextual-toolbar button:first-child') as HTMLElement | null\n\t\t\t\t\t\tfirstToolbarButton?.focus()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst firstButton = editor\n\t\t\t\t\t\t.getContainer()\n\t\t\t\t\t\t.querySelector('.tlui-style-panel button') as HTMLElement | null\n\t\t\t\t\tfirstButton?.focus()\n\t\t\t\t\ttrackEvent('adjust-shape-styles', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'a11y-open-context-menu',\n\t\t\t\tkbd: 'cmd+shift+Enter,ctrl+shift+Enter',\n\t\t\t\tisRequiredA11yAction: true,\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\t// For multiple shapes or a single shape, get the selection bounds\n\t\t\t\t\tconst selectionBounds = editor.getSelectionPageBounds()\n\t\t\t\t\tif (!selectionBounds) return\n\n\t\t\t\t\t// Calculate the center point of the selection\n\t\t\t\t\tconst centerX = selectionBounds.x + selectionBounds.width / 2\n\t\t\t\t\tconst centerY = selectionBounds.y + selectionBounds.height / 2\n\n\t\t\t\t\t// Convert page coordinates to screen coordinates\n\t\t\t\t\tconst screenPoint = editor.pageToScreen(new Vec(centerX, centerY))\n\n\t\t\t\t\t// Dispatch a contextmenu event directly at the center of the selection\n\t\t\t\t\teditor\n\t\t\t\t\t\t.getContainer()\n\t\t\t\t\t\t.querySelector('.tl-canvas')\n\t\t\t\t\t\t?.dispatchEvent(\n\t\t\t\t\t\t\tnew PointerEvent('contextmenu', {\n\t\t\t\t\t\t\t\tclientX: screenPoint.x,\n\t\t\t\t\t\t\t\tclientY: screenPoint.y,\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\n\t\t\t\t\ttrackEvent('open-context-menu', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'enlarge-shapes',\n\t\t\t\tlabel: 'a11y.enlarge-shape',\n\t\t\t\tkbd: 'cmd+alt+shift+=,ctrl+alt+shift+=',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tscaleShapes(1.1)\n\t\t\t\t\ttrackEvent('enlarge-shapes', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'shrink-shapes',\n\t\t\t\tlabel: 'a11y.shrink-shape',\n\t\t\t\tkbd: 'cmd+alt+shift+-,ctrl+alt+shift+-',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tscaleShapes(1 / 1.1)\n\t\t\t\t\ttrackEvent('shrink-shapes', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'a11y-repeat-shape-announce',\n\t\t\t\tkbd: 'alt+r',\n\t\t\t\tlabel: 'a11y.repeat-shape',\n\t\t\t\tisRequiredA11yAction: true,\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\tif (!selectedShapeIds.length) return\n\t\t\t\t\tconst a11yLive = generateShapeAnnouncementMessage({\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tselectedShapeIds,\n\t\t\t\t\t\tmsg,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (a11yLive) {\n\t\t\t\t\t\ta11y.announce({ msg: '' })\n\t\t\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\t\t\ta11y.announce({ msg: a11yLive })\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttrackEvent('a11y-repeat-shape-announce', { source })\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'image-replace',\n\t\t\t\tlabel: 'tool.replace-media',\n\t\t\t\ticon: 'arrow-cycle',\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\ttrackEvent('image-replace', { source })\n\t\t\t\t\thelpers.replaceImage()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'video-replace',\n\t\t\t\tlabel: 'tool.replace-media',\n\t\t\t\ticon: 'arrow-cycle',\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\ttrackEvent('video-replace', { source })\n\t\t\t\t\thelpers.replaceVideo()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'download-original',\n\t\t\t\tlabel: 'action.download-original',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\t\t\t\t\tif (selectedShapes.length === 0) return\n\n\t\t\t\t\tconst mediaShapes = selectedShapes.filter((s): s is TLImageShape | TLVideoShape =>\n\t\t\t\t\t\tsupportsDownloadingOriginal(s, editor)\n\t\t\t\t\t)\n\n\t\t\t\t\tif (mediaShapes.length === 0) return\n\n\t\t\t\t\tfor (const mediaShape of mediaShapes) {\n\t\t\t\t\t\tconst asset = editor.getAsset(mediaShape.props.assetId!)\n\t\t\t\t\t\tif (!asset || !asset.props.src) continue\n\n\t\t\t\t\t\tconst url = await editor.resolveAssetUrl(asset.id, { shouldResolveToOriginal: true })\n\t\t\t\t\t\tif (!url) return\n\n\t\t\t\t\t\tconst link = document.createElement('a')\n\t\t\t\t\t\tlink.href = url\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(asset.type === 'video' || asset.type === 'image') &&\n\t\t\t\t\t\t\t!asset.props.src.startsWith('asset:')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlink.download = asset.props.name\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlink.download = 'download'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdocument.body.appendChild(link)\n\t\t\t\t\t\tlink.click()\n\t\t\t\t\t\tdocument.body.removeChild(link)\n\t\t\t\t\t}\n\n\t\t\t\t\ttrackEvent('download-original', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\tif (showCollaborationUi) {\n\t\t\tactionItems.push({\n\t\t\t\tid: 'open-cursor-chat',\n\t\t\t\tlabel: 'action.open-cursor-chat',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: '/',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('open-cursor-chat', { source })\n\n\t\t\t\t\t// Don't open cursor chat if we're on a touch device\n\t\t\t\t\tif (editor.getInstanceState().isCoarsePointer) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// wait a frame before opening as otherwise the open context menu will close it\n\t\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\t\teditor.updateInstanceState({ isChatting: true })\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tconst actions = makeActions(actionItems)\n\n\t\tif (overrides) {\n\t\t\treturn overrides(editor, actions, helpers)\n\t\t}\n\n\t\treturn actions\n\t}, [\n\t\thelpers,\n\t\t_editor,\n\t\ttrackEvent,\n\t\toverrides,\n\t\tdefaultDocumentName,\n\t\tshowCollaborationUi,\n\t\tmsg,\n\t\ta11y,\n\t\tcomponents,\n\t])\n\n\treturn <ActionsContext.Provider value={asActions(actions)}>{children}</ActionsContext.Provider>\n}\n\n/** @public */\nexport function useActions() {\n\tconst ctx = React.useContext(ActionsContext)\n\n\tif (!ctx) {\n\t\tthrow new Error('useTools must be used within a ToolProvider')\n\t}\n\n\treturn ctx\n}\n\nfunction asActions<T extends Record<string, TLUiActionItem>>(actions: T) {\n\treturn actions as Record<keyof typeof actions, TLUiActionItem>\n}\n\n/** @public */\nexport function unwrapLabel(label?: TLUiActionItem['label'], menuType?: string) {\n\treturn label\n\t\t? typeof label === 'string'\n\t\t\t? label\n\t\t\t: menuType\n\t\t\t\t? (label[menuType] ?? label['default'])\n\t\t\t\t: undefined\n\t\t: undefined\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tBox,\n\tDefaultColorStyle,\n\tDefaultFillStyle,\n\tEditor,\n\tHALF_PI,\n\tPageRecordType,\n\tResult,\n\tTLEmbedShape,\n\tTLImageShape,\n\tTLShape,\n\tTLShapeId,\n\tTLShapePartial,\n\tTLTextShape,\n\tTLVideoShape,\n\tVec,\n\tapproximately,\n\tcompact,\n\tcreateShapeId,\n\tkickoutOccludedShapes,\n\topenWindow,\n\tuseMaybeEditor,\n} from '@tldraw/editor'\nimport * as React from 'react'\nimport { createBookmarkFromUrl } from '../../shapes/bookmark/bookmarks'\nimport { fitFrameToContent, removeFrame } from '../../utils/frames/frames'\nimport { generateShapeAnnouncementMessage } from '../components/A11y'\nimport { EditLinkDialog } from '../components/EditLinkDialog'\nimport { EmbedDialog } from '../components/EmbedDialog'\nimport { DefaultKeyboardShortcutsDialog } from '../components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialog'\nimport { useShowCollaborationUi } from '../hooks/useCollaborationStatus'\nimport { flattenShapesToImages } from '../hooks/useFlatten'\nimport { TLUiTranslationKey } from '../hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../hooks/useTranslation/useTranslation'\nimport { TLUiIconType } from '../icon-types'\nimport { TLUiOverrideHelpers, useDefaultHelpers } from '../overrides'\nimport { useA11y } from './a11y'\nimport { useTldrawUiComponents } from './components'\nimport { TLUiEventSource, useUiEvents } from './events'\n\n/** @public */\nexport interface TLUiActionItem<\n\tTransationKey extends string = string,\n\tIconType extends string = string,\n> {\n\ticon?: IconType | React.ReactElement\n\tid: string\n\tkbd?: string\n\tlabel?: TransationKey | { [key: string]: TransationKey }\n\treadonlyOk?: boolean\n\tcheckbox?: boolean\n\tisRequiredA11yAction?: boolean\n\tonSelect(source: TLUiEventSource): Promise<void> | void\n}\n\n/** @public */\nexport type TLUiActionsContextType = Record<string, TLUiActionItem>\n\n/** @internal */\nexport const ActionsContext = React.createContext<TLUiActionsContextType | null>(null)\n\n/** @public */\nexport interface ActionsProviderProps {\n\toverrides?(\n\t\teditor: Editor,\n\t\tactions: TLUiActionsContextType,\n\t\thelpers: TLUiOverrideHelpers\n\t): TLUiActionsContextType\n\tchildren: React.ReactNode\n}\n\n/** @public */\nexport function supportsDownloadingOriginal(\n\tshape: TLShape,\n\teditor: Editor\n): shape is TLImageShape | TLVideoShape {\n\treturn (\n\t\t(editor.isShapeOfType(shape, 'image') || editor.isShapeOfType(shape, 'video')) &&\n\t\t!!(shape as any).props.assetId\n\t)\n}\n\nfunction makeActions(actions: TLUiActionItem[]) {\n\treturn Object.fromEntries(actions.map((action) => [action.id, action])) as TLUiActionsContextType\n}\n\nfunction getExportName(editor: Editor, defaultName: string) {\n\tconst selectedShapes = editor.getSelectedShapes()\n\t// When we don't have any shapes selected, we want to use the document name\n\tif (selectedShapes.length === 0) {\n\t\treturn editor.getDocumentSettings().name || defaultName\n\t}\n\treturn undefined\n}\n\n/** @internal */\nexport function ActionsProvider({ overrides, children }: ActionsProviderProps) {\n\tconst _editor = useMaybeEditor()\n\tconst showCollaborationUi = useShowCollaborationUi()\n\tconst helpers = useDefaultHelpers()\n\tconst components = useTldrawUiComponents()\n\tconst trackEvent = useUiEvents()\n\tconst a11y = useA11y()\n\tconst msg = useTranslation()\n\n\tconst defaultDocumentName = helpers.msg('document.default-name')\n\n\t// should this be a useMemo? looks like it doesn't actually deref any reactive values\n\tconst actions = React.useMemo<TLUiActionsContextType>(() => {\n\t\tconst editor = _editor as Editor\n\t\tif (!editor) return {}\n\t\tfunction mustGoBackToSelectToolFirst() {\n\t\t\tif (!editor.isIn('select')) {\n\t\t\t\teditor.complete()\n\t\t\t\teditor.setCurrentTool('select')\n\t\t\t\treturn false // false will still let the action happen, true will stop it\n\t\t\t\t// todo: remove this return value once we're suuuuure\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\n\t\tfunction canApplySelectionAction() {\n\t\t\treturn editor.isIn('select') && editor.getSelectedShapeIds().length > 0\n\t\t}\n\n\t\tfunction scaleShapes(scaleFactor: number) {\n\t\t\tif (!canApplySelectionAction()) return\n\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\teditor.markHistoryStoppingPoint('resize shapes')\n\n\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\tif (selectedShapeIds.length === 0) return\n\n\t\t\teditor.run(() => {\n\t\t\t\t// Get the selected shapes\n\t\t\t\tconst shapes = selectedShapeIds\n\t\t\t\t\t.map((id) => editor.getShape(id))\n\t\t\t\t\t.filter(Boolean) as TLShape[]\n\n\t\t\t\t// Update each shape\n\t\t\t\tshapes.forEach((shape) => {\n\t\t\t\t\teditor.resizeShape(shape.id, new Vec(scaleFactor, scaleFactor), {\n\t\t\t\t\t\tscaleOrigin: editor.getSelectionPageBounds()?.center,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\tconst actionItems: TLUiActionItem<TLUiTranslationKey, TLUiIconType>[] = [\n\t\t\t{\n\t\t\t\tid: 'edit-link',\n\t\t\t\tlabel: 'action.edit-link',\n\t\t\t\ticon: 'link',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('edit-link', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('edit-link')\n\t\t\t\t\thelpers.addDialog({ component: EditLinkDialog })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'insert-embed',\n\t\t\t\tlabel: 'action.insert-embed',\n\t\t\t\tkbd: 'cmd+i,ctrl+i',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('insert-embed', { source })\n\t\t\t\t\thelpers.addDialog({ component: EmbedDialog })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'open-kbd-shortcuts',\n\t\t\t\tlabel: 'action.open-kbd-shortcuts',\n\t\t\t\tkbd: 'cmd+alt+/,ctrl+alt+/',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('open-kbd-shortcuts', { source })\n\t\t\t\t\thelpers.addDialog({\n\t\t\t\t\t\tcomponent: components.KeyboardShortcutsDialog ?? DefaultKeyboardShortcutsDialog,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'insert-media',\n\t\t\t\tlabel: 'action.insert-media',\n\t\t\t\tkbd: 'cmd+u,ctrl+u',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('insert-media', { source })\n\t\t\t\t\thelpers.insertMedia()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'undo',\n\t\t\t\tlabel: 'action.undo',\n\t\t\t\ticon: 'undo',\n\t\t\t\tkbd: 'cmd+z,ctrl+z',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('undo', { source })\n\t\t\t\t\teditor.undo()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'redo',\n\t\t\t\tlabel: 'action.redo',\n\t\t\t\ticon: 'redo',\n\t\t\t\tkbd: 'cmd+shift+z,ctrl+shift+z',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('redo', { source })\n\t\t\t\t\teditor.redo()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-as-svg',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-as-svg',\n\t\t\t\t\tmenu: 'action.export-as-svg.short',\n\t\t\t\t\t['context-menu']: 'action.export-as-svg.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-as', { format: 'svg', source })\n\t\t\t\t\thelpers.exportAs(ids, { format: 'svg', name: getExportName(editor, defaultDocumentName) })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-as-png',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-as-png',\n\t\t\t\t\tmenu: 'action.export-as-png.short',\n\t\t\t\t\t['context-menu']: 'action.export-as-png.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-as', { format: 'png', source })\n\t\t\t\t\thelpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-all-as-svg',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-all-as-svg',\n\t\t\t\t\tmenu: 'action.export-all-as-svg.short',\n\t\t\t\t\t['context-menu']: 'action.export-all-as-svg.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-all-as', { format: 'svg', source })\n\t\t\t\t\thelpers.exportAs(Array.from(editor.getCurrentPageShapeIds()), {\n\t\t\t\t\t\tformat: 'svg',\n\t\t\t\t\t\tname: getExportName(editor, defaultDocumentName),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'export-all-as-png',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.export-all-as-png',\n\t\t\t\t\tmenu: 'action.export-all-as-png.short',\n\t\t\t\t\t['context-menu']: 'action.export-all-as-png.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('export-all-as', { format: 'png', source })\n\t\t\t\t\thelpers.exportAs(ids, { format: 'png', name: getExportName(editor, defaultDocumentName) })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'copy-as-svg',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.copy-as-svg',\n\t\t\t\t\tmenu: 'action.copy-as-svg.short',\n\t\t\t\t\t['context-menu']: 'action.copy-as-svg.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'cmd+shift+c,ctrl+shift+c',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('copy-as', { format: 'svg', source })\n\t\t\t\t\thelpers.copyAs(ids, 'svg')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'copy-as-png',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.copy-as-png',\n\t\t\t\t\tmenu: 'action.copy-as-png.short',\n\t\t\t\t\t['context-menu']: 'action.copy-as-png.short',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tlet ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) ids = Array.from(editor.getCurrentPageShapeIds().values())\n\t\t\t\t\tif (ids.length === 0) return\n\t\t\t\t\ttrackEvent('copy-as', { format: 'png', source })\n\t\t\t\t\thelpers.copyAs(ids, 'png')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-auto-size',\n\t\t\t\tlabel: 'action.toggle-auto-size',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('toggle-auto-size', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('toggling auto size')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst shapes = editor\n\t\t\t\t\t\t\t.getSelectedShapes()\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(shape): shape is TLTextShape =>\n\t\t\t\t\t\t\t\t\teditor.isShapeOfType(shape, 'text') && shape.props.autoSize === false\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\teditor.updateShapes(\n\t\t\t\t\t\t\tshapes.map((shape) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: shape.id,\n\t\t\t\t\t\t\t\t\ttype: shape.type,\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\t\t\t\t\tw: 8,\n\t\t\t\t\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t\tkickoutOccludedShapes(\n\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\tshapes.map((shape) => shape.id)\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'open-embed-link',\n\t\t\t\tlabel: 'action.open-embed-link',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('open-embed-link', { source })\n\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\tconst warnMsg = 'No embed shapes selected'\n\t\t\t\t\tif (ids.length !== 1) {\n\t\t\t\t\t\tconsole.error(warnMsg)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst shape = editor.getShape(ids[0])\n\t\t\t\t\tif (!shape || !editor.isShapeOfType(shape, 'embed')) {\n\t\t\t\t\t\tconsole.error(warnMsg)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\topenWindow(shape.props.url, '_blank')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-zoom-tool',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: 'z',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (editor.root.getCurrent()?.id === 'zoom') return\n\n\t\t\t\t\ttrackEvent('zoom-tool', { source })\n\t\t\t\t\tif (!(editor.inputs.shiftKey || editor.inputs.ctrlKey)) {\n\t\t\t\t\t\tconst currentTool = editor.root.getCurrent()\n\t\t\t\t\t\tif (currentTool && currentTool.getCurrent()?.id === 'idle') {\n\t\t\t\t\t\t\teditor.setCurrentTool('zoom', { onInteractionEnd: currentTool.id, maskAs: 'zoom' })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'convert-to-bookmark',\n\t\t\t\tlabel: 'action.convert-to-bookmark',\n\t\t\t\tasync onSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('convert-to-bookmark', { source })\n\t\t\t\t\tconst shapes = editor.getSelectedShapes()\n\n\t\t\t\t\tconst markId = editor.markHistoryStoppingPoint('convert shapes to bookmark')\n\n\t\t\t\t\tconst creationPromises: Promise<Result<any, any>>[] = []\n\n\t\t\t\t\tfor (const shape of shapes) {\n\t\t\t\t\t\tif (!shape || !editor.isShapeOfType(shape, 'embed') || !shape.props.url) continue\n\n\t\t\t\t\t\tconst center = editor.getShapePageBounds(shape)?.center\n\n\t\t\t\t\t\tif (!center) continue\n\t\t\t\t\t\teditor.deleteShapes([shape.id])\n\n\t\t\t\t\t\tcreationPromises.push(\n\t\t\t\t\t\t\tcreateBookmarkFromUrl(editor, { url: shape.props.url, center }).then((res) => {\n\t\t\t\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\t\t\t\tthrow new Error(res.error)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn res\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creationPromises).catch((error) => {\n\t\t\t\t\t\teditor.bailToMark(markId)\n\t\t\t\t\t\tconsole.error(error)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'convert-to-embed',\n\t\t\t\tlabel: 'action.convert-to-embed',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('convert-to-embed', { source })\n\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\t\tconst shapes = compact(ids.map((id) => editor.getShape(id)))\n\n\t\t\t\t\t\tconst createList: TLShapePartial[] = []\n\t\t\t\t\t\tconst deleteList: TLShapeId[] = []\n\t\t\t\t\t\tfor (const shape of shapes) {\n\t\t\t\t\t\t\tif (!editor.isShapeOfType(shape, 'bookmark')) continue\n\n\t\t\t\t\t\t\tconst { url } = shape.props\n\n\t\t\t\t\t\t\tconst embedInfo = helpers.getEmbedDefinition(url)\n\n\t\t\t\t\t\t\tif (!embedInfo) continue\n\t\t\t\t\t\t\tif (!embedInfo.definition) continue\n\n\t\t\t\t\t\t\tconst { width, height } = embedInfo.definition\n\n\t\t\t\t\t\t\tconst newPos = new Vec(shape.x, shape.y)\n\t\t\t\t\t\t\tnewPos.rot(-shape.rotation)\n\t\t\t\t\t\t\tnewPos.add(new Vec(shape.props.w / 2 - width / 2, shape.props.h / 2 - height / 2))\n\t\t\t\t\t\t\tnewPos.rot(shape.rotation)\n\n\t\t\t\t\t\t\tconst shapeToCreate: TLShapePartial<TLEmbedShape> = {\n\t\t\t\t\t\t\t\tid: createShapeId(),\n\t\t\t\t\t\t\t\ttype: 'embed',\n\t\t\t\t\t\t\t\tx: newPos.x,\n\t\t\t\t\t\t\t\ty: newPos.y,\n\t\t\t\t\t\t\t\trotation: shape.rotation,\n\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\turl: url,\n\t\t\t\t\t\t\t\t\tw: width,\n\t\t\t\t\t\t\t\t\th: height,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcreateList.push(shapeToCreate)\n\t\t\t\t\t\t\tdeleteList.push(shape.id)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('convert shapes to embed')\n\t\t\t\t\t\teditor.deleteShapes(deleteList)\n\t\t\t\t\t\teditor.createShapes(createList)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'duplicate',\n\t\t\t\tkbd: 'cmd+d,ctrl+d',\n\t\t\t\tlabel: 'action.duplicate',\n\t\t\t\ticon: 'duplicate',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('duplicate-shapes', { source })\n\t\t\t\t\tconst instanceState = editor.getInstanceState()\n\t\t\t\t\tlet ids: TLShapeId[]\n\t\t\t\t\tlet offset: { x: number; y: number }\n\n\t\t\t\t\tif (instanceState.duplicateProps) {\n\t\t\t\t\t\tids = instanceState.duplicateProps.shapeIds\n\t\t\t\t\t\toffset = instanceState.duplicateProps.offset\n\t\t\t\t\t} else {\n\t\t\t\t\t\tids = editor.getSelectedShapeIds()\n\t\t\t\t\t\tconst commonBounds = Box.Common(compact(ids.map((id) => editor.getShapePageBounds(id))))\n\t\t\t\t\t\toffset = editor.getCameraOptions().isLocked\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t// same as the adjacent note margin\n\t\t\t\t\t\t\t\t\tx: editor.options.adjacentShapeMargin,\n\t\t\t\t\t\t\t\t\ty: editor.options.adjacentShapeMargin,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tx: commonBounds.width + editor.options.adjacentShapeMargin,\n\t\t\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.markHistoryStoppingPoint('duplicate shapes')\n\t\t\t\t\teditor.duplicateShapes(ids, offset)\n\n\t\t\t\t\tif (instanceState.duplicateProps) {\n\t\t\t\t\t\t// If we are using duplicate props then we update the shape ids to the\n\t\t\t\t\t\t// ids of the newly created shapes to keep the duplication going\n\t\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\t\tduplicateProps: {\n\t\t\t\t\t\t\t\t...instanceState.duplicateProps,\n\t\t\t\t\t\t\t\tshapeIds: editor.getSelectedShapeIds(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'ungroup',\n\t\t\t\tlabel: 'action.ungroup',\n\t\t\t\tkbd: 'cmd+shift+g,ctrl+shift+g',\n\t\t\t\ticon: 'ungroup',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('ungroup-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('ungroup')\n\t\t\t\t\teditor.ungroupShapes(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'group',\n\t\t\t\tlabel: 'action.group',\n\t\t\t\tkbd: 'cmd+g,ctrl+g',\n\t\t\t\ticon: 'group',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('group-shapes', { source })\n\t\t\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\t\t\tif (onlySelectedShape && editor.isShapeOfType(onlySelectedShape, 'group')) {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('ungroup')\n\t\t\t\t\t\teditor.ungroupShapes(editor.getSelectedShapeIds())\n\t\t\t\t\t} else {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('group')\n\t\t\t\t\t\teditor.groupShapes(editor.getSelectedShapeIds())\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'remove-frame',\n\t\t\t\tlabel: 'action.remove-frame',\n\t\t\t\tkbd: 'cmd+shift+f,ctrl+shift+f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\ttrackEvent('remove-frame', { source })\n\t\t\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\t\t\t\t\tif (\n\t\t\t\t\t\tselectedShapes.length > 0 &&\n\t\t\t\t\t\tselectedShapes.every((shape) => editor.isShapeOfType(shape, 'frame'))\n\t\t\t\t\t) {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('remove-frame')\n\t\t\t\t\t\tremoveFrame(\n\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\tselectedShapes.map((shape) => shape.id)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'fit-frame-to-content',\n\t\t\t\tlabel: 'action.fit-frame-to-content',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\ttrackEvent('fit-frame-to-content', { source })\n\t\t\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\t\t\tif (onlySelectedShape && editor.isShapeOfType(onlySelectedShape, 'frame')) {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('fit-frame-to-content')\n\t\t\t\t\t\tfitFrameToContent(editor, onlySelectedShape.id)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-left',\n\t\t\t\tlabel: 'action.align-left',\n\t\t\t\tkbd: 'alt+A',\n\t\t\t\ticon: 'align-left',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'left', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align left')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'left')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-center-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.align-center-horizontal',\n\t\t\t\t\t['context-menu']: 'action.align-center-horizontal.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'alt+H',\n\t\t\t\ticon: 'align-center-horizontal',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'center-horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align center horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'center-horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-right',\n\t\t\t\tlabel: 'action.align-right',\n\t\t\t\tkbd: 'alt+D',\n\t\t\t\ticon: 'align-right',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'right', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align right')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'right')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-center-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.align-center-vertical',\n\t\t\t\t\t['context-menu']: 'action.align-center-vertical.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'alt+V',\n\t\t\t\ticon: 'align-center-vertical',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'center-vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align center vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'center-vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-top',\n\t\t\t\tlabel: 'action.align-top',\n\t\t\t\ticon: 'align-top',\n\t\t\t\tkbd: 'alt+W',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'top', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align top')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'top')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'align-bottom',\n\t\t\t\tlabel: 'action.align-bottom',\n\t\t\t\ticon: 'align-bottom',\n\t\t\t\tkbd: 'alt+S',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('align-shapes', { operation: 'bottom', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('align bottom')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.alignShapes(selectedShapeIds, 'bottom')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'distribute-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.distribute-horizontal',\n\t\t\t\t\t['context-menu']: 'action.distribute-horizontal.short',\n\t\t\t\t},\n\t\t\t\ticon: 'distribute-horizontal',\n\t\t\t\tkbd: 'alt+shift+h',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('distribute-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('distribute horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.distributeShapes(selectedShapeIds, 'horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'distribute-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.distribute-vertical',\n\t\t\t\t\t['context-menu']: 'action.distribute-vertical.short',\n\t\t\t\t},\n\t\t\t\ticon: 'distribute-vertical',\n\t\t\t\tkbd: 'alt+shift+V',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('distribute-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('distribute vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.distributeShapes(selectedShapeIds, 'vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stretch-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stretch-horizontal',\n\t\t\t\t\t['context-menu']: 'action.stretch-horizontal.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stretch-horizontal',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stretch-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stretch horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stretchShapes(selectedShapeIds, 'horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stretch-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stretch-vertical',\n\t\t\t\t\t['context-menu']: 'action.stretch-vertical.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stretch-vertical',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stretch-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stretch vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stretchShapes(selectedShapeIds, 'vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'flip-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.flip-horizontal',\n\t\t\t\t\t['context-menu']: 'action.flip-horizontal.short',\n\t\t\t\t},\n\t\t\t\tkbd: 'shift+h',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('flip-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('flip horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.flipShapes(selectedShapeIds, 'horizontal')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'flip-vertical',\n\t\t\t\tlabel: { default: 'action.flip-vertical', ['context-menu']: 'action.flip-vertical.short' },\n\t\t\t\tkbd: 'shift+v',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('flip-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('flip vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.flipShapes(selectedShapeIds, 'vertical')\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'pack',\n\t\t\t\tlabel: 'action.pack',\n\t\t\t\ticon: 'pack',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('pack-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('pack')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.packShapes(selectedShapeIds, editor.options.adjacentShapeMargin)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stack-vertical',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stack-vertical',\n\t\t\t\t\t['context-menu']: 'action.stack-vertical.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stack-vertical',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stack-shapes', { operation: 'vertical', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stack-vertical')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stackShapes(selectedShapeIds, 'vertical', editor.options.adjacentShapeMargin)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stack-horizontal',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.stack-horizontal',\n\t\t\t\t\t['context-menu']: 'action.stack-horizontal.short',\n\t\t\t\t},\n\t\t\t\ticon: 'stack-horizontal',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('stack-shapes', { operation: 'horizontal', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('stack-horizontal')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.stackShapes(selectedShapeIds, 'horizontal', editor.options.adjacentShapeMargin)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bring-to-front',\n\t\t\t\tlabel: 'action.bring-to-front',\n\t\t\t\tkbd: ']',\n\t\t\t\ticon: 'bring-to-front',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'toFront', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('bring to front')\n\t\t\t\t\teditor.bringToFront(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'bring-forward',\n\t\t\t\tlabel: 'action.bring-forward',\n\t\t\t\ticon: 'bring-forward',\n\t\t\t\tkbd: 'alt+]',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'forward', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('bring forward')\n\t\t\t\t\teditor.bringForward(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'send-backward',\n\t\t\t\tlabel: 'action.send-backward',\n\t\t\t\ticon: 'send-backward',\n\t\t\t\tkbd: 'alt+[',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'backward', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('send backward')\n\t\t\t\t\teditor.sendBackward(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'send-to-back',\n\t\t\t\tlabel: 'action.send-to-back',\n\t\t\t\ticon: 'send-to-back',\n\t\t\t\tkbd: '[',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('reorder-shapes', { operation: 'toBack', source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('send to back')\n\t\t\t\t\teditor.sendToBack(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'cut',\n\t\t\t\tlabel: 'action.cut',\n\t\t\t\tkbd: 'cmd+x,ctrl+x',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\teditor.markHistoryStoppingPoint('cut')\n\t\t\t\t\thelpers.cut(source)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'copy',\n\t\t\t\tlabel: 'action.copy',\n\t\t\t\tkbd: 'cmd+c,ctrl+c',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\thelpers.copy(source)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'paste',\n\t\t\t\tlabel: 'action.paste',\n\t\t\t\tkbd: 'cmd+v,ctrl+v',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tnavigator.clipboard\n\t\t\t\t\t\t?.read()\n\t\t\t\t\t\t.then((clipboardItems) => {\n\t\t\t\t\t\t\thelpers.paste(\n\t\t\t\t\t\t\t\tclipboardItems,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\tsource === 'context-menu' ? editor.inputs.currentPagePoint : undefined\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\thelpers.addToast({\n\t\t\t\t\t\t\t\ttitle: helpers.msg('action.paste-error-title'),\n\t\t\t\t\t\t\t\tdescription: helpers.msg('action.paste-error-description'),\n\t\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-all',\n\t\t\t\tlabel: 'action.select-all',\n\t\t\t\tkbd: 'cmd+a,ctrl+a',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\t\ttrackEvent('select-all-shapes', { source })\n\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('select all kbd')\n\t\t\t\t\t\teditor.selectAll()\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-none',\n\t\t\t\tlabel: 'action.select-none',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('select-none-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('select none')\n\t\t\t\t\teditor.selectNone()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'delete',\n\t\t\t\tlabel: 'action.delete',\n\t\t\t\tkbd: '\u232B,del',\n\t\t\t\ticon: 'trash',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('delete-shapes', { source })\n\t\t\t\t\teditor.markHistoryStoppingPoint('delete')\n\t\t\t\t\teditor.deleteShapes(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'rotate-cw',\n\t\t\t\tlabel: 'action.rotate-cw',\n\t\t\t\ticon: 'rotate-cw',\n\t\t\t\tkbd: 'shift+.,shift+alt+.',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\tconst isFine = editor.inputs.altKey\n\t\t\t\t\ttrackEvent('rotate-cw', { source, fine: isFine })\n\t\t\t\t\teditor.markHistoryStoppingPoint('rotate-cw')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst rotation = HALF_PI / (isFine ? 96 : 6)\n\t\t\t\t\t\tconst offset = editor.getSelectionRotation() % rotation\n\t\t\t\t\t\tconst dontUseOffset = approximately(offset, 0) || approximately(offset, rotation)\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.rotateShapesBy(selectedShapeIds, rotation - (dontUseOffset ? 0 : offset))\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'rotate-ccw',\n\t\t\t\tlabel: 'action.rotate-ccw',\n\t\t\t\ticon: 'rotate-ccw',\n\t\t\t\t// omg double comma\n\t\t\t\tkbd: 'shift+,,shift+alt+,',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\tconst isFine = editor.inputs.altKey\n\t\t\t\t\ttrackEvent('rotate-ccw', { source, fine: isFine })\n\t\t\t\t\teditor.markHistoryStoppingPoint('rotate-ccw')\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\tconst rotation = HALF_PI / (isFine ? 96 : 6)\n\t\t\t\t\t\tconst offset = editor.getSelectionRotation() % rotation\n\t\t\t\t\t\tconst offsetCloseToZero = approximately(offset, 0)\n\t\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\t\teditor.rotateShapesBy(selectedShapeIds, offsetCloseToZero ? -rotation : -offset)\n\t\t\t\t\t\tkickoutOccludedShapes(editor, selectedShapeIds)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-in',\n\t\t\t\tlabel: 'action.zoom-in',\n\t\t\t\tkbd: 'cmd+=,ctrl+=,=',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-in', { source, towardsCursor: false })\n\t\t\t\t\teditor.zoomIn(undefined, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-in-on-cursor',\n\t\t\t\tlabel: 'action.zoom-in',\n\t\t\t\tkbd: 'shift+cmd+=,shift+ctrl+=,shift+=',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-in', { source, towardsCursor: true })\n\t\t\t\t\teditor.zoomIn(editor.inputs.currentScreenPoint, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-out',\n\t\t\t\tlabel: 'action.zoom-out',\n\t\t\t\tkbd: 'cmd+-,ctrl+-,-',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-out', { source, towardsCursor: false })\n\t\t\t\t\teditor.zoomOut(undefined, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-out-on-cursor',\n\t\t\t\tlabel: 'action.zoom-out',\n\t\t\t\tkbd: 'shift+cmd+-,shift+ctrl+-,shift+-',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-out', { source, towardsCursor: true })\n\t\t\t\t\teditor.zoomOut(editor.inputs.currentScreenPoint, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-to-100',\n\t\t\t\tlabel: 'action.zoom-to-100',\n\t\t\t\ticon: 'reset-zoom',\n\t\t\t\tkbd: 'shift+0',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('reset-zoom', { source })\n\t\t\t\t\teditor.resetZoom(undefined, {\n\t\t\t\t\t\tanimation: { duration: editor.options.animationMediumMs },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-to-fit',\n\t\t\t\tlabel: 'action.zoom-to-fit',\n\t\t\t\tkbd: 'shift+1',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-to-fit', { source })\n\t\t\t\t\teditor.zoomToFit({ animation: { duration: editor.options.animationMediumMs } })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'zoom-to-selection',\n\t\t\t\tlabel: 'action.zoom-to-selection',\n\t\t\t\tkbd: 'shift+2',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\t\t\t\t\tif (mustGoBackToSelectToolFirst()) return\n\n\t\t\t\t\ttrackEvent('zoom-to-selection', { source })\n\t\t\t\t\teditor.zoomToSelection({ animation: { duration: editor.options.animationMediumMs } })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-snap-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-snap-mode',\n\t\t\t\t\tmenu: 'action.toggle-snap-mode.menu',\n\t\t\t\t},\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-snap-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({ isSnapMode: !editor.user.getIsSnapMode() })\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-dark-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-dark-mode',\n\t\t\t\t\tmenu: 'action.toggle-dark-mode.menu',\n\t\t\t\t},\n\t\t\t\tkbd: 'cmd+/,ctrl+/',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst value = editor.user.getIsDarkMode() ? 'light' : 'dark'\n\t\t\t\t\ttrackEvent('color-scheme', { source, value })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tcolorScheme: value,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-wrap-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-wrap-mode',\n\t\t\t\t\tmenu: 'action.toggle-wrap-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-wrap-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tisWrapMode: !editor.user.getIsWrapMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-dynamic-size-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-dynamic-size-mode',\n\t\t\t\t\tmenu: 'action.toggle-dynamic-size-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-dynamic-size-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tisDynamicSizeMode: !editor.user.getIsDynamicResizeMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-paste-at-cursor',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-paste-at-cursor',\n\t\t\t\t\tmenu: 'action.toggle-paste-at-cursor.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-paste-at-cursor', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tisPasteAtCursorMode: !editor.user.getIsPasteAtCursorMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-reduce-motion',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-reduce-motion',\n\t\t\t\t\tmenu: 'action.toggle-reduce-motion.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-reduce-motion', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tanimationSpeed: editor.user.getAnimationSpeed() === 0 ? 1 : 0,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-keyboard-shortcuts',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-keyboard-shortcuts',\n\t\t\t\t\tmenu: 'action.toggle-keyboard-shortcuts.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-keyboard-shortcuts', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tareKeyboardShortcutsEnabled: !editor.user.getAreKeyboardShortcutsEnabled(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'enhanced-a11y-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.enhanced-a11y-mode',\n\t\t\t\t\tmenu: 'action.enhanced-a11y-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('enhanced-a11y-mode', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tenhancedA11yMode: !editor.user.getEnhancedA11yMode(),\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-edge-scrolling',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-edge-scrolling',\n\t\t\t\t\tmenu: 'action.toggle-edge-scrolling.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-edge-scrolling', { source })\n\t\t\t\t\teditor.user.updateUserPreferences({\n\t\t\t\t\t\tedgeScrollSpeed: editor.user.getEdgeScrollSpeed() === 0 ? 1 : 0,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-transparent',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-transparent',\n\t\t\t\t\tmenu: 'action.toggle-transparent.menu',\n\t\t\t\t\t['context-menu']: 'action.toggle-transparent.context-menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-transparent', { source })\n\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\texportBackground: !editor.getInstanceState().exportBackground,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-tool-lock',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-tool-lock',\n\t\t\t\t\tmenu: 'action.toggle-tool-lock.menu',\n\t\t\t\t},\n\t\t\t\tkbd: 'q',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-tool-lock', { source })\n\t\t\t\t\teditor.updateInstanceState({ isToolLocked: !editor.getInstanceState().isToolLocked })\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'unlock-all',\n\t\t\t\tlabel: 'action.unlock-all',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('unlock-all', { source })\n\t\t\t\t\tconst updates = [] as TLShapePartial[]\n\t\t\t\t\tfor (const shape of editor.getCurrentPageShapes()) {\n\t\t\t\t\t\tif (shape.isLocked) {\n\t\t\t\t\t\t\tupdates.push({ id: shape.id, type: shape.type, isLocked: false })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (updates.length > 0) {\n\t\t\t\t\t\teditor.updateShapes(updates)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-focus-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-focus-mode',\n\t\t\t\t\tmenu: 'action.toggle-focus-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: 'cmd+.,ctrl+.',\n\t\t\t\tcheckbox: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\t// this needs to be deferred because it causes the menu\n\t\t\t\t\t// UI to unmount which puts us in a dodgy state\n\t\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\t\ttrackEvent('toggle-focus-mode', { source })\n\t\t\t\t\t\t\thelpers.clearDialogs()\n\t\t\t\t\t\t\thelpers.clearToasts()\n\t\t\t\t\t\t\teditor.updateInstanceState({ isFocusMode: !editor.getInstanceState().isFocusMode })\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-grid',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-grid',\n\t\t\t\t\tmenu: 'action.toggle-grid.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: \"cmd+',ctrl+'\",\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-grid-mode', { source })\n\t\t\t\t\teditor.updateInstanceState({ isGridMode: !editor.getInstanceState().isGridMode })\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-debug-mode',\n\t\t\t\tlabel: {\n\t\t\t\t\tdefault: 'action.toggle-debug-mode',\n\t\t\t\t\tmenu: 'action.toggle-debug-mode.menu',\n\t\t\t\t},\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('toggle-debug-mode', { source })\n\t\t\t\t\teditor.updateInstanceState({\n\t\t\t\t\t\tisDebugMode: !editor.getInstanceState().isDebugMode,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tcheckbox: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'print',\n\t\t\t\tlabel: 'action.print',\n\t\t\t\tkbd: 'cmd+p,ctrl+p',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('print', { source })\n\t\t\t\t\thelpers.printSelectionOrPages()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'exit-pen-mode',\n\t\t\t\tlabel: 'action.exit-pen-mode',\n\t\t\t\ticon: 'cross-2',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('exit-pen-mode', { source })\n\t\t\t\t\teditor.updateInstanceState({ isPenMode: false })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'stop-following',\n\t\t\t\tlabel: 'action.stop-following',\n\t\t\t\ticon: 'cross-2',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('stop-following', { source })\n\t\t\t\t\teditor.stopFollowingUser()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'back-to-content',\n\t\t\t\tlabel: 'action.back-to-content',\n\t\t\t\ticon: 'arrow-left',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('zoom-to-content', { source })\n\t\t\t\t\tconst bounds = editor.getSelectionPageBounds() ?? editor.getCurrentPageBounds()\n\t\t\t\t\tif (!bounds) return\n\t\t\t\t\teditor.zoomToBounds(bounds, {\n\t\t\t\t\t\ttargetZoom: Math.min(1, editor.getZoomLevel()),\n\t\t\t\t\t\tanimation: { duration: 220 },\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'toggle-lock',\n\t\t\t\tlabel: 'action.toggle-lock',\n\t\t\t\tkbd: 'shift+l',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\teditor.markHistoryStoppingPoint('locking')\n\t\t\t\t\ttrackEvent('toggle-lock', { source })\n\t\t\t\t\teditor.toggleLock(editor.getSelectedShapeIds())\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'move-to-new-page',\n\t\t\t\tlabel: 'context.pages.new-page',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst newPageId = PageRecordType.createId()\n\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('move_shapes_to_page')\n\t\t\t\t\t\teditor.createPage({\n\t\t\t\t\t\t\tname: helpers.msg('page-menu.new-page-initial-name'),\n\t\t\t\t\t\t\tid: newPageId,\n\t\t\t\t\t\t})\n\t\t\t\t\t\teditor.moveShapesToPage(ids, newPageId)\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('move-to-new-page', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-white-color',\n\t\t\t\tlabel: 'color-style.white',\n\t\t\t\tkbd: 'alt+t',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst style = DefaultColorStyle\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('change-color')\n\t\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t\teditor.setStyleForSelectedShapes(style, 'white')\n\t\t\t\t\t\t}\n\t\t\t\t\t\teditor.setStyleForNextShapes(style, 'white')\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('set-style', { source, id: style.id, value: 'white' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-fill-fill',\n\t\t\t\tlabel: 'fill-style.fill',\n\t\t\t\tkbd: 'alt+f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst style = DefaultFillStyle\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('change-fill')\n\t\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t\teditor.setStyleForSelectedShapes(style, 'fill')\n\t\t\t\t\t\t}\n\t\t\t\t\t\teditor.setStyleForNextShapes(style, 'fill')\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('set-style', { source, id: style.id, value: 'fill' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-fill-lined-fill',\n\t\t\t\tlabel: 'fill-style.lined-fill',\n\t\t\t\tkbd: 'alt+shift+f',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\tconst style = DefaultFillStyle\n\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\teditor.markHistoryStoppingPoint('change-fill')\n\t\t\t\t\t\tif (editor.isIn('select')) {\n\t\t\t\t\t\t\teditor.setStyleForSelectedShapes(style, 'lined-fill')\n\t\t\t\t\t\t}\n\t\t\t\t\t\teditor.setStyleForNextShapes(style, 'lined-fill')\n\t\t\t\t\t})\n\t\t\t\t\ttrackEvent('set-style', { source, id: style.id, value: 'lined-fill' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'flatten-to-image',\n\t\t\t\tlabel: 'action.flatten-to-image',\n\t\t\t\tkbd: 'shift+f',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tconst ids = editor.getSelectedShapeIds()\n\t\t\t\t\tif (ids.length === 0) return\n\n\t\t\t\t\teditor.markHistoryStoppingPoint('flattening to image')\n\t\t\t\t\ttrackEvent('flatten-to-image', { source })\n\n\t\t\t\t\tconst newShapeIds = await flattenShapesToImages(\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tids,\n\t\t\t\t\t\teditor.options.flattenImageBoundsExpand\n\t\t\t\t\t)\n\n\t\t\t\t\tif (newShapeIds?.length) {\n\t\t\t\t\t\teditor.setSelectedShapes(newShapeIds)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'select-geo-tool',\n\t\t\t\tkbd: 'g',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\t// will select whatever the most recent geo tool was\n\t\t\t\t\ttrackEvent('select-tool', { source, id: `geo-previous` })\n\t\t\t\t\teditor.setCurrentTool('geo')\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'change-page-prev',\n\t\t\t\tkbd: 'alt+left,alt+up',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\t// will select whatever the most recent geo tool was\n\t\t\t\t\tconst pages = editor.getPages()\n\t\t\t\t\tconst currentPageIndex = pages.findIndex((page) => page.id === editor.getCurrentPageId())\n\t\t\t\t\tif (currentPageIndex < 1) return\n\t\t\t\t\ttrackEvent('change-page', { source, direction: 'prev' })\n\t\t\t\t\teditor.setCurrentPage(pages[currentPageIndex - 1].id)\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'change-page-next',\n\t\t\t\tkbd: 'alt+right,alt+down',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\t// will select whatever the most recent geo tool was\n\t\t\t\t\tconst pages = editor.getPages()\n\t\t\t\t\tconst currentPageIndex = pages.findIndex((page) => page.id === editor.getCurrentPageId())\n\n\t\t\t\t\t// If we're on the last page...\n\t\t\t\t\tif (currentPageIndex === -1 || currentPageIndex >= pages.length - 1) {\n\t\t\t\t\t\t// if the current page is blank or if we're in readonly mode, do nothing\n\t\t\t\t\t\tif (editor.getCurrentPageShapes().length <= 0 || editor.getIsReadonly()) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Otherwise, create a new page\n\t\t\t\t\t\ttrackEvent('new-page', { source })\n\t\t\t\t\t\teditor.run(() => {\n\t\t\t\t\t\t\teditor.markHistoryStoppingPoint('creating page')\n\t\t\t\t\t\t\tconst newPageId = PageRecordType.createId()\n\t\t\t\t\t\t\teditor.createPage({\n\t\t\t\t\t\t\t\tname: helpers.msg('page-menu.new-page-initial-name'),\n\t\t\t\t\t\t\t\tid: newPageId,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\teditor.setCurrentPage(newPageId)\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.setCurrentPage(pages[currentPageIndex + 1].id)\n\t\t\t\t\ttrackEvent('change-page', { source, direction: 'next' })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'adjust-shape-styles',\n\t\t\t\tlabel: 'a11y.adjust-shape-styles',\n\t\t\t\tkbd: 'cmd+Enter,ctrl+Enter',\n\t\t\t\tisRequiredA11yAction: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\t\t\tif (\n\t\t\t\t\t\tonlySelectedShape &&\n\t\t\t\t\t\t(editor.isShapeOfType(onlySelectedShape, 'image') ||\n\t\t\t\t\t\t\teditor.isShapeOfType(onlySelectedShape, 'video'))\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst firstToolbarButton = editor\n\t\t\t\t\t\t\t.getContainer()\n\t\t\t\t\t\t\t.querySelector('.tlui-contextual-toolbar button:first-child') as HTMLElement | null\n\t\t\t\t\t\tfirstToolbarButton?.focus()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst firstButton = editor\n\t\t\t\t\t\t.getContainer()\n\t\t\t\t\t\t.querySelector('.tlui-style-panel button') as HTMLElement | null\n\t\t\t\t\tfirstButton?.focus()\n\t\t\t\t\ttrackEvent('adjust-shape-styles', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'a11y-open-context-menu',\n\t\t\t\tkbd: 'cmd+shift+Enter,ctrl+shift+Enter',\n\t\t\t\tisRequiredA11yAction: true,\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tif (!canApplySelectionAction()) return\n\n\t\t\t\t\t// For multiple shapes or a single shape, get the selection bounds\n\t\t\t\t\tconst selectionBounds = editor.getSelectionPageBounds()\n\t\t\t\t\tif (!selectionBounds) return\n\n\t\t\t\t\t// Calculate the center point of the selection\n\t\t\t\t\tconst centerX = selectionBounds.x + selectionBounds.width / 2\n\t\t\t\t\tconst centerY = selectionBounds.y + selectionBounds.height / 2\n\n\t\t\t\t\t// Convert page coordinates to screen coordinates\n\t\t\t\t\tconst screenPoint = editor.pageToScreen(new Vec(centerX, centerY))\n\n\t\t\t\t\t// Dispatch a contextmenu event directly at the center of the selection\n\t\t\t\t\teditor\n\t\t\t\t\t\t.getContainer()\n\t\t\t\t\t\t.querySelector('.tl-canvas')\n\t\t\t\t\t\t?.dispatchEvent(\n\t\t\t\t\t\t\tnew PointerEvent('contextmenu', {\n\t\t\t\t\t\t\t\tclientX: screenPoint.x,\n\t\t\t\t\t\t\t\tclientY: screenPoint.y,\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\n\t\t\t\t\ttrackEvent('open-context-menu', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'enlarge-shapes',\n\t\t\t\tlabel: 'a11y.enlarge-shape',\n\t\t\t\tkbd: 'cmd+alt+shift+=,ctrl+alt+shift+=',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tscaleShapes(1.1)\n\t\t\t\t\ttrackEvent('enlarge-shapes', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'shrink-shapes',\n\t\t\t\tlabel: 'a11y.shrink-shape',\n\t\t\t\tkbd: 'cmd+alt+shift+-,ctrl+alt+shift+-',\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tscaleShapes(1 / 1.1)\n\t\t\t\t\ttrackEvent('shrink-shapes', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'a11y-repeat-shape-announce',\n\t\t\t\tkbd: 'alt+r',\n\t\t\t\tlabel: 'a11y.repeat-shape',\n\t\t\t\tisRequiredA11yAction: true,\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\t\t\t\t\tif (!selectedShapeIds.length) return\n\t\t\t\t\tconst a11yLive = generateShapeAnnouncementMessage({\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tselectedShapeIds,\n\t\t\t\t\t\tmsg,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (a11yLive) {\n\t\t\t\t\t\ta11y.announce({ msg: '' })\n\t\t\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\t\t\ta11y.announce({ msg: a11yLive })\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttrackEvent('a11y-repeat-shape-announce', { source })\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'image-replace',\n\t\t\t\tlabel: 'tool.replace-media',\n\t\t\t\ticon: 'arrow-cycle',\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\ttrackEvent('image-replace', { source })\n\t\t\t\t\thelpers.replaceImage()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'video-replace',\n\t\t\t\tlabel: 'tool.replace-media',\n\t\t\t\ticon: 'arrow-cycle',\n\t\t\t\treadonlyOk: false,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\ttrackEvent('video-replace', { source })\n\t\t\t\t\thelpers.replaceVideo()\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'download-original',\n\t\t\t\tlabel: 'action.download-original',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tonSelect: async (source) => {\n\t\t\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\t\t\t\t\tif (selectedShapes.length === 0) return\n\n\t\t\t\t\tconst mediaShapes = selectedShapes.filter((s): s is TLImageShape | TLVideoShape =>\n\t\t\t\t\t\tsupportsDownloadingOriginal(s, editor)\n\t\t\t\t\t)\n\n\t\t\t\t\tif (mediaShapes.length === 0) return\n\n\t\t\t\t\tfor (const mediaShape of mediaShapes) {\n\t\t\t\t\t\tconst asset = editor.getAsset(mediaShape.props.assetId!)\n\t\t\t\t\t\tif (!asset || !asset.props.src) continue\n\n\t\t\t\t\t\tconst url = await editor.resolveAssetUrl(asset.id, { shouldResolveToOriginal: true })\n\t\t\t\t\t\tif (!url) return\n\n\t\t\t\t\t\tconst link = document.createElement('a')\n\t\t\t\t\t\tlink.href = url\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(asset.type === 'video' || asset.type === 'image') &&\n\t\t\t\t\t\t\t!asset.props.src.startsWith('asset:')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlink.download = asset.props.name\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlink.download = 'download'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdocument.body.appendChild(link)\n\t\t\t\t\t\tlink.click()\n\t\t\t\t\t\tdocument.body.removeChild(link)\n\t\t\t\t\t}\n\n\t\t\t\t\ttrackEvent('download-original', { source })\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\tif (showCollaborationUi) {\n\t\t\tactionItems.push({\n\t\t\t\tid: 'open-cursor-chat',\n\t\t\t\tlabel: 'action.open-cursor-chat',\n\t\t\t\treadonlyOk: true,\n\t\t\t\tkbd: '/',\n\t\t\t\tonSelect(source) {\n\t\t\t\t\ttrackEvent('open-cursor-chat', { source })\n\n\t\t\t\t\t// Don't open cursor chat if we're on a touch device\n\t\t\t\t\tif (editor.getInstanceState().isCoarsePointer) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\t// wait a frame before opening as otherwise the open context menu will close it\n\t\t\t\t\teditor.timers.requestAnimationFrame(() => {\n\t\t\t\t\t\teditor.updateInstanceState({ isChatting: true })\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tconst actions = makeActions(actionItems)\n\n\t\tif (overrides) {\n\t\t\treturn overrides(editor, actions, helpers)\n\t\t}\n\n\t\treturn actions\n\t}, [\n\t\thelpers,\n\t\t_editor,\n\t\ttrackEvent,\n\t\toverrides,\n\t\tdefaultDocumentName,\n\t\tshowCollaborationUi,\n\t\tmsg,\n\t\ta11y,\n\t\tcomponents,\n\t])\n\n\treturn <ActionsContext.Provider value={asActions(actions)}>{children}</ActionsContext.Provider>\n}\n\n/** @public */\nexport function useActions() {\n\tconst ctx = React.useContext(ActionsContext)\n\n\tif (!ctx) {\n\t\tthrow new Error('useTools must be used within a ToolProvider')\n\t}\n\n\treturn ctx\n}\n\nfunction asActions<T extends Record<string, TLUiActionItem>>(actions: T) {\n\treturn actions as Record<keyof typeof actions, TLUiActionItem>\n}\n\n/** @public */\nexport function unwrapLabel(label?: TLUiActionItem['label'], menuType?: string) {\n\treturn label\n\t\t? typeof label === 'string'\n\t\t\t? label\n\t\t\t: menuType\n\t\t\t\t? (label[menuType] ?? label['default'])\n\t\t\t\t: undefined\n\t\t: undefined\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["actions"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/ui/hooks/menu-hooks.ts"],
4
- "sourcesContent": ["import {\n\tEditor,\n\tTLArrowShape,\n\tTLDrawShape,\n\tTLGroupShape,\n\tTLImageShape,\n\tTLLineShape,\n\tTLTextShape,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\nimport { getArrowBindings } from '../../shapes/arrow/shared'\n\nfunction shapesWithUnboundArrows(editor: Editor) {\n\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\tconst selectedShapes = selectedShapeIds.map((id) => {\n\t\treturn editor.getShape(id)\n\t})\n\n\treturn selectedShapes.filter((shape) => {\n\t\tif (!shape) return false\n\t\tif (editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {\n\t\t\tconst bindings = getArrowBindings(editor, shape)\n\t\t\tif (bindings.start || bindings.end) return false\n\t\t}\n\t\treturn true\n\t})\n}\n\n/** @internal */\nexport const useThreeStackableItems = () => {\n\tconst editor = useEditor()\n\treturn useValue('threeStackableItems', () => shapesWithUnboundArrows(editor).length > 2, [editor])\n}\n\n/** @internal */\nexport const useIsInSelectState = () => {\n\tconst editor = useEditor()\n\treturn useValue('isInSelectState', () => editor.isIn('select'), [editor])\n}\n\n/** @internal */\nexport const useAllowGroup = () => {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'allow group',\n\t\t() => {\n\t\t\t// We can't group arrows that are bound to shapes that aren't selected\n\t\t\t// if more than one shape has an arrow bound to it, allow group\n\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\n\t\t\tif (selectedShapes.length < 2) return false\n\n\t\t\tfor (const shape of selectedShapes) {\n\t\t\t\tif (editor.isShapeOfType<TLArrowShape>(shape, 'arrow')) {\n\t\t\t\t\tconst bindings = getArrowBindings(editor, shape)\n\t\t\t\t\tif (bindings.start) {\n\t\t\t\t\t\t// if the other shape is not among the selected shapes...\n\t\t\t\t\t\tif (!selectedShapes.some((s) => s.id === bindings.start!.toId)) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (bindings.end) {\n\t\t\t\t\t\t// if the other shape is not among the selected shapes...\n\t\t\t\t\t\tif (!selectedShapes.some((s) => s.id === bindings.end!.toId)) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\t[editor]\n\t)\n}\n\n/** @internal */\nexport const useAllowUngroup = () => {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'allowUngroup',\n\t\t() => editor.getSelectedShapeIds().some((id) => editor.getShape(id)?.type === 'group'),\n\t\t[editor]\n\t)\n}\n\nexport const showMenuPaste =\n\ttypeof window !== 'undefined' &&\n\t'navigator' in window &&\n\tBoolean(navigator.clipboard) &&\n\tBoolean(navigator.clipboard.read)\n\n/**\n * Returns true if the number of LOCKED OR UNLOCKED selected shapes is at least min or at most max.\n */\nexport function useAnySelectedShapesCount(min?: number, max?: number) {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'selectedShapes',\n\t\t() => {\n\t\t\tconst len = editor.getSelectedShapes().length\n\t\t\tif (min === undefined) {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// just length\n\t\t\t\t\treturn len\n\t\t\t\t} else {\n\t\t\t\t\t// max but no min\n\t\t\t\t\treturn len <= max\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// min but no max\n\t\t\t\t\treturn len >= min\n\t\t\t\t} else {\n\t\t\t\t\t// max and min\n\t\t\t\t\treturn len >= min && len <= max\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[editor, min, max]\n\t)\n}\n\n/**\n * Returns true if the number of UNLOCKED selected shapes is at least min or at most max.\n * @public\n */\nexport function useUnlockedSelectedShapesCount(min?: number, max?: number) {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'selectedShapes',\n\t\t() => {\n\t\t\tconst len = editor\n\t\t\t\t.getSelectedShapes()\n\t\t\t\t.filter((s) => !editor.isShapeOrAncestorLocked(s)).length\n\t\t\tif (min === undefined) {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// just length\n\t\t\t\t\treturn len\n\t\t\t\t} else {\n\t\t\t\t\t// max but no min\n\t\t\t\t\treturn len <= max\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// min but no max\n\t\t\t\t\treturn len >= min\n\t\t\t\t} else {\n\t\t\t\t\t// max and min\n\t\t\t\t\treturn len >= min && len <= max\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[editor]\n\t)\n}\n\nexport function useShowAutoSizeToggle() {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'showAutoSizeToggle',\n\t\t() => {\n\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\t\t\treturn (\n\t\t\t\tselectedShapes.length === 1 &&\n\t\t\t\teditor.isShapeOfType<TLTextShape>(selectedShapes[0], 'text') &&\n\t\t\t\tselectedShapes[0].props.autoSize === false\n\t\t\t)\n\t\t},\n\t\t[editor]\n\t)\n}\n\nexport function useHasLinkShapeSelected() {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'hasLinkShapeSelected',\n\t\t() => {\n\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\treturn !!(\n\t\t\t\tonlySelectedShape &&\n\t\t\t\tonlySelectedShape.type !== 'embed' &&\n\t\t\t\t'url' in onlySelectedShape.props &&\n\t\t\t\t!onlySelectedShape.isLocked\n\t\t\t)\n\t\t},\n\t\t[editor]\n\t)\n}\n\nexport function useOnlyFlippableShape() {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'onlyFlippableShape',\n\t\t() => {\n\t\t\tconst shape = editor.getOnlySelectedShape()\n\t\t\treturn (\n\t\t\t\tshape &&\n\t\t\t\t(editor.isShapeOfType<TLGroupShape>(shape, 'group') ||\n\t\t\t\t\teditor.isShapeOfType<TLImageShape>(shape, 'image') ||\n\t\t\t\t\teditor.isShapeOfType<TLArrowShape>(shape, 'arrow') ||\n\t\t\t\t\teditor.isShapeOfType<TLLineShape>(shape, 'line') ||\n\t\t\t\t\teditor.isShapeOfType<TLDrawShape>(shape, 'draw'))\n\t\t\t)\n\t\t},\n\t\t[editor]\n\t)\n}\n\n/** @public */\nexport function useCanRedo() {\n\tconst editor = useEditor()\n\treturn useValue('useCanRedo', () => editor.getCanRedo(), [editor])\n}\n\n/** @public */\nexport function useCanUndo() {\n\tconst editor = useEditor()\n\treturn useValue('useCanUndo', () => editor.getCanUndo(), [editor])\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAUO;AACP,oBAAiC;AAEjC,SAAS,wBAAwB,QAAgB;AAChD,QAAM,mBAAmB,OAAO,oBAAoB;AACpD,QAAM,iBAAiB,iBAAiB,IAAI,CAAC,OAAO;AACnD,WAAO,OAAO,SAAS,EAAE;AAAA,EAC1B,CAAC;AAED,SAAO,eAAe,OAAO,CAAC,UAAU;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,OAAO,cAA4B,OAAO,OAAO,GAAG;AACvD,YAAM,eAAW,gCAAiB,QAAQ,KAAK;AAC/C,UAAI,SAAS,SAAS,SAAS,IAAK,QAAO;AAAA,IAC5C;AACA,WAAO;AAAA,EACR,CAAC;AACF;AAGO,MAAM,yBAAyB,MAAM;AAC3C,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,uBAAuB,MAAM,wBAAwB,MAAM,EAAE,SAAS,GAAG,CAAC,MAAM,CAAC;AAClG;AAGO,MAAM,qBAAqB,MAAM;AACvC,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,mBAAmB,MAAM,OAAO,KAAK,QAAQ,GAAG,CAAC,MAAM,CAAC;AACzE;AAGO,MAAM,gBAAgB,MAAM;AAClC,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM;AAGL,YAAM,iBAAiB,OAAO,kBAAkB;AAEhD,UAAI,eAAe,SAAS,EAAG,QAAO;AAEtC,iBAAW,SAAS,gBAAgB;AACnC,YAAI,OAAO,cAA4B,OAAO,OAAO,GAAG;AACvD,gBAAM,eAAW,gCAAiB,QAAQ,KAAK;AAC/C,cAAI,SAAS,OAAO;AAEnB,gBAAI,CAAC,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,MAAO,IAAI,GAAG;AAC/D,qBAAO;AAAA,YACR;AAAA,UACD;AACA,cAAI,SAAS,KAAK;AAEjB,gBAAI,CAAC,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,IAAK,IAAI,GAAG;AAC7D,qBAAO;AAAA,YACR;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AACD;AAGO,MAAM,kBAAkB,MAAM;AACpC,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,OAAO,OAAO,SAAS,EAAE,GAAG,SAAS,OAAO;AAAA,IACrF,CAAC,MAAM;AAAA,EACR;AACD;AAEO,MAAM,gBACZ,OAAO,WAAW,eAClB,eAAe,UACf,QAAQ,UAAU,SAAS,KAC3B,QAAQ,UAAU,UAAU,IAAI;AAK1B,SAAS,0BAA0B,KAAc,KAAc;AACrE,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM;AACL,YAAM,MAAM,OAAO,kBAAkB,EAAE;AACvC,UAAI,QAAQ,QAAW;AACtB,YAAI,QAAQ,QAAW;AAEtB,iBAAO;AAAA,QACR,OAAO;AAEN,iBAAO,OAAO;AAAA,QACf;AAAA,MACD,OAAO;AACN,YAAI,QAAQ,QAAW;AAEtB,iBAAO,OAAO;AAAA,QACf,OAAO;AAEN,iBAAO,OAAO,OAAO,OAAO;AAAA,QAC7B;AAAA,MACD;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,KAAK,GAAG;AAAA,EAClB;AACD;AAMO,SAAS,+BAA+B,KAAc,KAAc;AAC1E,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM;AACL,YAAM,MAAM,OACV,kBAAkB,EAClB,OAAO,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC,EAAE;AACpD,UAAI,QAAQ,QAAW;AACtB,YAAI,QAAQ,QAAW;AAEtB,iBAAO;AAAA,QACR,OAAO;AAEN,iBAAO,OAAO;AAAA,QACf;AAAA,MACD,OAAO;AACN,YAAI,QAAQ,QAAW;AAEtB,iBAAO,OAAO;AAAA,QACf,OAAO;AAEN,iBAAO,OAAO,OAAO,OAAO;AAAA,QAC7B;AAAA,MACD;AAAA,IACD;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AACD;AAEO,SAAS,wBAAwB;AACvC,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM;AACL,YAAM,iBAAiB,OAAO,kBAAkB;AAChD,aACC,eAAe,WAAW,KAC1B,OAAO,cAA2B,eAAe,CAAC,GAAG,MAAM,KAC3D,eAAe,CAAC,EAAE,MAAM,aAAa;AAAA,IAEvC;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AACD;AAEO,SAAS,0BAA0B;AACzC,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM;AACL,YAAM,oBAAoB,OAAO,qBAAqB;AACtD,aAAO,CAAC,EACP,qBACA,kBAAkB,SAAS,WAC3B,SAAS,kBAAkB,SAC3B,CAAC,kBAAkB;AAAA,IAErB;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AACD;AAEO,SAAS,wBAAwB;AACvC,QAAM,aAAS,yBAAU;AACzB,aAAO;AAAA,IACN;AAAA,IACA,MAAM;AACL,YAAM,QAAQ,OAAO,qBAAqB;AAC1C,aACC,UACC,OAAO,cAA4B,OAAO,OAAO,KACjD,OAAO,cAA4B,OAAO,OAAO,KACjD,OAAO,cAA4B,OAAO,OAAO,KACjD,OAAO,cAA2B,OAAO,MAAM,KAC/C,OAAO,cAA2B,OAAO,MAAM;AAAA,IAElD;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AACD;AAGO,SAAS,aAAa;AAC5B,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,cAAc,MAAM,OAAO,WAAW,GAAG,CAAC,MAAM,CAAC;AAClE;AAGO,SAAS,aAAa;AAC5B,QAAM,aAAS,yBAAU;AACzB,aAAO,wBAAS,cAAc,MAAM,OAAO,WAAW,GAAG,CAAC,MAAM,CAAC;AAClE;",
4
+ "sourcesContent": ["import { Editor, useEditor, useValue } from '@tldraw/editor'\nimport { getArrowBindings } from '../../shapes/arrow/shared'\n\nfunction shapesWithUnboundArrows(editor: Editor) {\n\tconst selectedShapeIds = editor.getSelectedShapeIds()\n\tconst selectedShapes = selectedShapeIds.map((id) => {\n\t\treturn editor.getShape(id)\n\t})\n\n\treturn selectedShapes.filter((shape) => {\n\t\tif (!shape) return false\n\t\tif (editor.isShapeOfType(shape, 'arrow')) {\n\t\t\tconst bindings = getArrowBindings(editor, shape)\n\t\t\tif (bindings.start || bindings.end) return false\n\t\t}\n\t\treturn true\n\t})\n}\n\n/** @internal */\nexport const useThreeStackableItems = () => {\n\tconst editor = useEditor()\n\treturn useValue('threeStackableItems', () => shapesWithUnboundArrows(editor).length > 2, [editor])\n}\n\n/** @internal */\nexport const useIsInSelectState = () => {\n\tconst editor = useEditor()\n\treturn useValue('isInSelectState', () => editor.isIn('select'), [editor])\n}\n\n/** @internal */\nexport const useAllowGroup = () => {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'allow group',\n\t\t() => {\n\t\t\t// We can't group arrows that are bound to shapes that aren't selected\n\t\t\t// if more than one shape has an arrow bound to it, allow group\n\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\n\t\t\tif (selectedShapes.length < 2) return false\n\n\t\t\tfor (const shape of selectedShapes) {\n\t\t\t\tif (editor.isShapeOfType(shape, 'arrow')) {\n\t\t\t\t\tconst bindings = getArrowBindings(editor, shape)\n\t\t\t\t\tif (bindings.start) {\n\t\t\t\t\t\t// if the other shape is not among the selected shapes...\n\t\t\t\t\t\tif (!selectedShapes.some((s) => s.id === bindings.start!.toId)) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (bindings.end) {\n\t\t\t\t\t\t// if the other shape is not among the selected shapes...\n\t\t\t\t\t\tif (!selectedShapes.some((s) => s.id === bindings.end!.toId)) {\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\t[editor]\n\t)\n}\n\n/** @internal */\nexport const useAllowUngroup = () => {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'allowUngroup',\n\t\t() => editor.getSelectedShapeIds().some((id) => editor.getShape(id)?.type === 'group'),\n\t\t[editor]\n\t)\n}\n\nexport const showMenuPaste =\n\ttypeof window !== 'undefined' &&\n\t'navigator' in window &&\n\tBoolean(navigator.clipboard) &&\n\tBoolean(navigator.clipboard.read)\n\n/**\n * Returns true if the number of LOCKED OR UNLOCKED selected shapes is at least min or at most max.\n */\nexport function useAnySelectedShapesCount(min?: number, max?: number) {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'selectedShapes',\n\t\t() => {\n\t\t\tconst len = editor.getSelectedShapes().length\n\t\t\tif (min === undefined) {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// just length\n\t\t\t\t\treturn len\n\t\t\t\t} else {\n\t\t\t\t\t// max but no min\n\t\t\t\t\treturn len <= max\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// min but no max\n\t\t\t\t\treturn len >= min\n\t\t\t\t} else {\n\t\t\t\t\t// max and min\n\t\t\t\t\treturn len >= min && len <= max\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[editor, min, max]\n\t)\n}\n\n/**\n * Returns true if the number of UNLOCKED selected shapes is at least min or at most max.\n * @public\n */\nexport function useUnlockedSelectedShapesCount(min?: number, max?: number) {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'selectedShapes',\n\t\t() => {\n\t\t\tconst len = editor\n\t\t\t\t.getSelectedShapes()\n\t\t\t\t.filter((s) => !editor.isShapeOrAncestorLocked(s)).length\n\t\t\tif (min === undefined) {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// just length\n\t\t\t\t\treturn len\n\t\t\t\t} else {\n\t\t\t\t\t// max but no min\n\t\t\t\t\treturn len <= max\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (max === undefined) {\n\t\t\t\t\t// min but no max\n\t\t\t\t\treturn len >= min\n\t\t\t\t} else {\n\t\t\t\t\t// max and min\n\t\t\t\t\treturn len >= min && len <= max\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[editor]\n\t)\n}\n\nexport function useShowAutoSizeToggle() {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'showAutoSizeToggle',\n\t\t() => {\n\t\t\tconst selectedShapes = editor.getSelectedShapes()\n\t\t\treturn (\n\t\t\t\tselectedShapes.length === 1 &&\n\t\t\t\teditor.isShapeOfType(selectedShapes[0], 'text') &&\n\t\t\t\tselectedShapes[0].props.autoSize === false\n\t\t\t)\n\t\t},\n\t\t[editor]\n\t)\n}\n\nexport function useHasLinkShapeSelected() {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'hasLinkShapeSelected',\n\t\t() => {\n\t\t\tconst onlySelectedShape = editor.getOnlySelectedShape()\n\t\t\treturn !!(\n\t\t\t\tonlySelectedShape &&\n\t\t\t\tonlySelectedShape.type !== 'embed' &&\n\t\t\t\t'url' in onlySelectedShape.props &&\n\t\t\t\t!onlySelectedShape.isLocked\n\t\t\t)\n\t\t},\n\t\t[editor]\n\t)\n}\n\nexport function useOnlyFlippableShape() {\n\tconst editor = useEditor()\n\treturn useValue(\n\t\t'onlyFlippableShape',\n\t\t() => {\n\t\t\tconst shape = editor.getOnlySelectedShape()\n\t\t\treturn (\n\t\t\t\tshape &&\n\t\t\t\t(editor.isShapeOfType(shape, 'group') ||\n\t\t\t\t\teditor.isShapeOfType(shape, 'image') ||\n\t\t\t\t\teditor.isShapeOfType(shape, 'arrow') ||\n\t\t\t\t\teditor.isShapeOfType(shape, 'line') ||\n\t\t\t\t\teditor.isShapeOfType(shape, 'draw'))\n\t\t\t)\n\t\t},\n\t\t[editor]\n\t)\n}\n\n/** @public */\nexport function useCanRedo() {\n\tconst editor = useEditor()\n\treturn useValue('useCanRedo', () => editor.getCanRedo(), [editor])\n}\n\n/** @public */\nexport function useCanUndo() {\n\tconst editor = useEditor()\n\treturn useValue('useCanUndo', () => editor.getCanUndo(), [editor])\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/ui/hooks/useFlatten.ts"],
4
- "sourcesContent": ["import {\n\tBox,\n\tEditor,\n\tIndexKey,\n\tTLImageAsset,\n\tTLImageShape,\n\tTLShape,\n\tTLShapeId,\n\tVec,\n\tcompact,\n\tcreateShapeId,\n\tisShapeId,\n\ttransact,\n\tuseEditor,\n} from '@tldraw/editor'\nimport { useCallback } from 'react'\n\nexport async function flattenShapesToImages(\n\teditor: Editor,\n\tshapeIds: TLShapeId[],\n\tflattenImageBoundsExpand?: number\n) {\n\tconst shapes = compact(\n\t\tshapeIds.map((id) => {\n\t\t\tconst shape = editor.getShape(id)\n\t\t\tif (!shape) return\n\t\t\tconst util = editor.getShapeUtil(shape.type)\n\t\t\t// skip shapes that don't have a toSvg method\n\t\t\tif (util.toSvg === undefined) return\n\t\t\treturn shape\n\t\t})\n\t)\n\n\tif (shapes.length === 0) return\n\n\t// Don't flatten if it's just one image\n\tif (shapes.length === 1) {\n\t\tconst shape = shapes[0]\n\t\tif (!shape) return\n\t\tif (editor.isShapeOfType(shape, 'image')) return\n\t}\n\n\tconst groups: { shapes: TLShape[]; bounds: Box; asset?: TLImageAsset }[] = []\n\n\tif (flattenImageBoundsExpand !== undefined) {\n\t\tconst expandedBounds = shapes.map((shape) => {\n\t\t\treturn {\n\t\t\t\tshape,\n\t\t\t\tbounds: editor.getShapeMaskedPageBounds(shape)!.clone().expandBy(flattenImageBoundsExpand),\n\t\t\t}\n\t\t})\n\n\t\tfor (let i = 0; i < expandedBounds.length; i++) {\n\t\t\tconst item = expandedBounds[i]\n\t\t\tif (i === 0) {\n\t\t\t\tgroups[0] = {\n\t\t\t\t\tshapes: [item.shape],\n\t\t\t\t\tbounds: item.bounds,\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlet didLand = false\n\n\t\t\tfor (const group of groups) {\n\t\t\t\tif (group.bounds.includes(item.bounds)) {\n\t\t\t\t\tgroup.shapes.push(item.shape)\n\t\t\t\t\tgroup.bounds.expand(item.bounds)\n\t\t\t\t\tdidLand = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!didLand) {\n\t\t\t\tgroups.push({\n\t\t\t\t\tshapes: [item.shape],\n\t\t\t\t\tbounds: item.bounds,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst bounds = Box.Common(shapes.map((shape) => editor.getShapeMaskedPageBounds(shape)!))\n\t\tgroups.push({\n\t\t\tshapes,\n\t\t\tbounds,\n\t\t})\n\t}\n\n\tconst padding = editor.options.flattenImageBoundsPadding\n\n\tfor (const group of groups) {\n\t\tif (flattenImageBoundsExpand !== undefined) {\n\t\t\t// shrink the bounds again, removing the expanded area\n\t\t\tgroup.bounds.expandBy(-flattenImageBoundsExpand)\n\t\t}\n\n\t\t// get an image for the shapes\n\t\tconst svgResult = await editor.getSvgString(group.shapes, {\n\t\t\tpadding,\n\t\t\tbackground: false,\n\t\t})\n\t\tif (!svgResult?.svg) continue\n\n\t\t// get an image asset for the image\n\t\tconst asset = (await editor.getAssetForExternalContent({\n\t\t\ttype: 'file',\n\t\t\tfile: new File([svgResult.svg], 'asset.svg', { type: 'image/svg+xml' }),\n\t\t})) as TLImageAsset\n\t\tif (!asset) continue\n\n\t\t// add it to the group\n\t\tgroup.asset = asset\n\t}\n\n\tconst createdShapeIds: TLShapeId[] = []\n\n\ttransact(() => {\n\t\tfor (const group of groups) {\n\t\t\tconst { asset, bounds, shapes } = group\n\t\t\tif (!asset) continue\n\n\t\t\tconst commonAncestorId = editor.findCommonAncestor(shapes) ?? editor.getCurrentPageId()\n\t\t\tif (!commonAncestorId) continue\n\n\t\t\tlet index: IndexKey = 'a1' as IndexKey\n\t\t\tfor (const shape of shapes) {\n\t\t\t\tif (shape.parentId === commonAncestorId) {\n\t\t\t\t\tif (shape.index > index) {\n\t\t\t\t\t\tindex = shape.index\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet x: number\n\t\t\tlet y: number\n\t\t\tlet rotation: number\n\n\t\t\tif (isShapeId(commonAncestorId)) {\n\t\t\t\tconst commonAncestor = editor.getShape(commonAncestorId)\n\t\t\t\tif (!commonAncestor) continue\n\t\t\t\t// put the point in the parent's space\n\t\t\t\tconst point = editor.getPointInShapeSpace(commonAncestor, {\n\t\t\t\t\tx: bounds.x,\n\t\t\t\t\ty: bounds.y,\n\t\t\t\t})\n\t\t\t\t// get the parent's rotation\n\t\t\t\trotation = editor.getShapePageTransform(commonAncestorId).rotation()\n\t\t\t\t// rotate the point against the parent's rotation\n\t\t\t\tpoint.sub(new Vec(padding, padding).rot(-rotation))\n\t\t\t\tx = point.x\n\t\t\t\ty = point.y\n\t\t\t} else {\n\t\t\t\t// if the common ancestor is the page, then just adjust for the padding\n\t\t\t\tx = bounds.x - padding\n\t\t\t\ty = bounds.y - padding\n\t\t\t\trotation = 0\n\t\t\t}\n\n\t\t\t// delete the shapes\n\t\t\teditor.deleteShapes(shapes)\n\n\t\t\t// create the asset\n\t\t\teditor.createAssets([{ ...asset, id: asset.id }])\n\n\t\t\tconst shapeId = createShapeId()\n\n\t\t\t// create an image shape in the same place as the shapes\n\t\t\teditor.createShape<TLImageShape>({\n\t\t\t\tid: shapeId,\n\t\t\t\ttype: 'image',\n\t\t\t\tindex,\n\t\t\t\tparentId: commonAncestorId,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\trotation: -rotation,\n\t\t\t\tprops: {\n\t\t\t\t\tassetId: asset.id,\n\t\t\t\t\tw: bounds.w + padding * 2,\n\t\t\t\t\th: bounds.h + padding * 2,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tcreatedShapeIds.push(shapeId)\n\t\t}\n\t})\n\n\treturn createdShapeIds\n}\n\nexport function useFlatten() {\n\tconst editor = useEditor()\n\treturn useCallback(\n\t\t(ids: TLShapeId[]) => {\n\t\t\treturn flattenShapesToImages(editor, ids)\n\t\t},\n\t\t[editor]\n\t)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tBox,\n\tEditor,\n\tIndexKey,\n\tTLImageAsset,\n\tTLShape,\n\tTLShapeId,\n\tVec,\n\tcompact,\n\tcreateShapeId,\n\tisShapeId,\n\ttransact,\n\tuseEditor,\n} from '@tldraw/editor'\nimport { useCallback } from 'react'\n\nexport async function flattenShapesToImages(\n\teditor: Editor,\n\tshapeIds: TLShapeId[],\n\tflattenImageBoundsExpand?: number\n) {\n\tconst shapes = compact(\n\t\tshapeIds.map((id) => {\n\t\t\tconst shape = editor.getShape(id)\n\t\t\tif (!shape) return\n\t\t\tconst util = editor.getShapeUtil(shape.type)\n\t\t\t// skip shapes that don't have a toSvg method\n\t\t\tif (util.toSvg === undefined) return\n\t\t\treturn shape\n\t\t})\n\t)\n\n\tif (shapes.length === 0) return\n\n\t// Don't flatten if it's just one image\n\tif (shapes.length === 1) {\n\t\tconst shape = shapes[0]\n\t\tif (!shape) return\n\t\tif (editor.isShapeOfType(shape, 'image')) return\n\t}\n\n\tconst groups: { shapes: TLShape[]; bounds: Box; asset?: TLImageAsset }[] = []\n\n\tif (flattenImageBoundsExpand !== undefined) {\n\t\tconst expandedBounds = shapes.map((shape) => {\n\t\t\treturn {\n\t\t\t\tshape,\n\t\t\t\tbounds: editor.getShapeMaskedPageBounds(shape)!.clone().expandBy(flattenImageBoundsExpand),\n\t\t\t}\n\t\t})\n\n\t\tfor (let i = 0; i < expandedBounds.length; i++) {\n\t\t\tconst item = expandedBounds[i]\n\t\t\tif (i === 0) {\n\t\t\t\tgroups[0] = {\n\t\t\t\t\tshapes: [item.shape],\n\t\t\t\t\tbounds: item.bounds,\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlet didLand = false\n\n\t\t\tfor (const group of groups) {\n\t\t\t\tif (group.bounds.includes(item.bounds)) {\n\t\t\t\t\tgroup.shapes.push(item.shape)\n\t\t\t\t\tgroup.bounds.expand(item.bounds)\n\t\t\t\t\tdidLand = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!didLand) {\n\t\t\t\tgroups.push({\n\t\t\t\t\tshapes: [item.shape],\n\t\t\t\t\tbounds: item.bounds,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst bounds = Box.Common(shapes.map((shape) => editor.getShapeMaskedPageBounds(shape)!))\n\t\tgroups.push({\n\t\t\tshapes,\n\t\t\tbounds,\n\t\t})\n\t}\n\n\tconst padding = editor.options.flattenImageBoundsPadding\n\n\tfor (const group of groups) {\n\t\tif (flattenImageBoundsExpand !== undefined) {\n\t\t\t// shrink the bounds again, removing the expanded area\n\t\t\tgroup.bounds.expandBy(-flattenImageBoundsExpand)\n\t\t}\n\n\t\t// get an image for the shapes\n\t\tconst svgResult = await editor.getSvgString(group.shapes, {\n\t\t\tpadding,\n\t\t\tbackground: false,\n\t\t})\n\t\tif (!svgResult?.svg) continue\n\n\t\t// get an image asset for the image\n\t\tconst asset = (await editor.getAssetForExternalContent({\n\t\t\ttype: 'file',\n\t\t\tfile: new File([svgResult.svg], 'asset.svg', { type: 'image/svg+xml' }),\n\t\t})) as TLImageAsset\n\t\tif (!asset) continue\n\n\t\t// add it to the group\n\t\tgroup.asset = asset\n\t}\n\n\tconst createdShapeIds: TLShapeId[] = []\n\n\ttransact(() => {\n\t\tfor (const group of groups) {\n\t\t\tconst { asset, bounds, shapes } = group\n\t\t\tif (!asset) continue\n\n\t\t\tconst commonAncestorId = editor.findCommonAncestor(shapes) ?? editor.getCurrentPageId()\n\t\t\tif (!commonAncestorId) continue\n\n\t\t\tlet index: IndexKey = 'a1' as IndexKey\n\t\t\tfor (const shape of shapes) {\n\t\t\t\tif (shape.parentId === commonAncestorId) {\n\t\t\t\t\tif (shape.index > index) {\n\t\t\t\t\t\tindex = shape.index\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet x: number\n\t\t\tlet y: number\n\t\t\tlet rotation: number\n\n\t\t\tif (isShapeId(commonAncestorId)) {\n\t\t\t\tconst commonAncestor = editor.getShape(commonAncestorId)\n\t\t\t\tif (!commonAncestor) continue\n\t\t\t\t// put the point in the parent's space\n\t\t\t\tconst point = editor.getPointInShapeSpace(commonAncestor, {\n\t\t\t\t\tx: bounds.x,\n\t\t\t\t\ty: bounds.y,\n\t\t\t\t})\n\t\t\t\t// get the parent's rotation\n\t\t\t\trotation = editor.getShapePageTransform(commonAncestorId).rotation()\n\t\t\t\t// rotate the point against the parent's rotation\n\t\t\t\tpoint.sub(new Vec(padding, padding).rot(-rotation))\n\t\t\t\tx = point.x\n\t\t\t\ty = point.y\n\t\t\t} else {\n\t\t\t\t// if the common ancestor is the page, then just adjust for the padding\n\t\t\t\tx = bounds.x - padding\n\t\t\t\ty = bounds.y - padding\n\t\t\t\trotation = 0\n\t\t\t}\n\n\t\t\t// delete the shapes\n\t\t\teditor.deleteShapes(shapes)\n\n\t\t\t// create the asset\n\t\t\teditor.createAssets([{ ...asset, id: asset.id }])\n\n\t\t\tconst shapeId = createShapeId()\n\n\t\t\t// create an image shape in the same place as the shapes\n\t\t\teditor.createShape({\n\t\t\t\tid: shapeId,\n\t\t\t\ttype: 'image',\n\t\t\t\tindex,\n\t\t\t\tparentId: commonAncestorId,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\trotation: -rotation,\n\t\t\t\tprops: {\n\t\t\t\t\tassetId: asset.id,\n\t\t\t\t\tw: bounds.w + padding * 2,\n\t\t\t\t\th: bounds.h + padding * 2,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tcreatedShapeIds.push(shapeId)\n\t\t}\n\t})\n\n\treturn createdShapeIds\n}\n\nexport function useFlatten() {\n\tconst editor = useEditor()\n\treturn useCallback(\n\t\t(ids: TLShapeId[]) => {\n\t\t\treturn flattenShapesToImages(editor, ids)\n\t\t},\n\t\t[editor]\n\t)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["shapes"]
7
7
  }