@bigbluebutton/tldraw 2.0.0-alpha.19 → 2.0.0-alpha.21

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 (69) hide show
  1. package/dist-cjs/index.d.ts +55 -50
  2. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +2 -2
  3. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +1 -1
  4. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +3 -0
  5. package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +2 -2
  6. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +2 -2
  7. package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
  8. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +3 -0
  9. package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +2 -2
  10. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +7 -6
  11. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  12. package/dist-cjs/lib/ui/hooks/useActions.js +13 -0
  13. package/dist-cjs/lib/ui/hooks/useActions.js.map +2 -2
  14. package/dist-cjs/lib/ui/hooks/useEventsProvider.js.map +2 -2
  15. package/dist-cjs/lib/ui/hooks/useMenuSchema.js +5 -0
  16. package/dist-cjs/lib/ui/hooks/useMenuSchema.js.map +2 -2
  17. package/dist-cjs/lib/ui/hooks/usePreloadAssets.js +1 -0
  18. package/dist-cjs/lib/ui/hooks/usePreloadAssets.js.map +2 -2
  19. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  20. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +2 -0
  21. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  22. package/dist-cjs/lib/ui/version.js +1 -1
  23. package/dist-cjs/lib/ui/version.js.map +1 -1
  24. package/dist-cjs/lib/utils/assets/assets.js +5 -1
  25. package/dist-cjs/lib/utils/assets/assets.js.map +2 -2
  26. package/dist-esm/index.d.mts +55 -50
  27. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +2 -2
  28. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +1 -1
  29. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +4 -0
  30. package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +2 -2
  31. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -2
  32. package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
  33. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -1
  34. package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +2 -2
  35. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +9 -7
  36. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  37. package/dist-esm/lib/ui/hooks/useActions.mjs +13 -0
  38. package/dist-esm/lib/ui/hooks/useActions.mjs.map +2 -2
  39. package/dist-esm/lib/ui/hooks/useEventsProvider.mjs.map +2 -2
  40. package/dist-esm/lib/ui/hooks/useMenuSchema.mjs +5 -0
  41. package/dist-esm/lib/ui/hooks/useMenuSchema.mjs.map +2 -2
  42. package/dist-esm/lib/ui/hooks/usePreloadAssets.mjs +1 -0
  43. package/dist-esm/lib/ui/hooks/usePreloadAssets.mjs.map +2 -2
  44. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -0
  45. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  46. package/dist-esm/lib/ui/version.mjs +1 -1
  47. package/dist-esm/lib/ui/version.mjs.map +1 -1
  48. package/dist-esm/lib/utils/assets/assets.mjs +5 -1
  49. package/dist-esm/lib/utils/assets/assets.mjs.map +2 -2
  50. package/package.json +3 -3
  51. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +2 -2
  52. package/src/lib/shapes/line/LineShapeUtil.test.ts +1 -1
  53. package/src/lib/tools/SelectTool/childStates/Brushing.ts +6 -0
  54. package/src/lib/tools/SelectTool/childStates/Idle.ts +6 -2
  55. package/src/lib/tools/SelectTool/childStates/Resizing.ts +6 -0
  56. package/src/lib/tools/SelectTool/childStates/Translating.ts +10 -7
  57. package/src/lib/ui/hooks/useActions.tsx +13 -0
  58. package/src/lib/ui/hooks/useEventsProvider.tsx +1 -0
  59. package/src/lib/ui/hooks/useMenuSchema.tsx +5 -0
  60. package/src/lib/ui/hooks/usePreloadAssets.ts +1 -0
  61. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +2 -0
  62. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -0
  63. package/src/lib/ui/version.ts +1 -1
  64. package/src/lib/utils/assets/assets.ts +5 -1
  65. package/src/test/TLUserPreferences.test.ts +4 -1
  66. package/src/test/TestEditor.ts +3 -0
  67. package/src/test/resizing.test.ts +22 -0
  68. package/src/test/selection-omnibus.test.ts +93 -0
  69. package/src/test/translating.test.ts +35 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/ui/hooks/useTranslation/defaultTranslation.ts"],
4
- "sourcesContent": ["// This file is automatically generated by scripts/refresh-assets.ts.\n// Do not edit manually.\n\n/** @internal */\nexport const DEFAULT_TRANSLATION = {\n\t'action.convert-to-bookmark': 'Convert to Bookmark',\n\t'action.convert-to-embed': 'Convert to Embed',\n\t'action.open-embed-link': 'Open link',\n\t'action.align-bottom': 'Align bottom',\n\t'action.align-center-horizontal': 'Align horizontally',\n\t'action.align-center-vertical': 'Align vertically',\n\t'action.align-center-horizontal.short': 'Align H',\n\t'action.align-center-vertical.short': 'Align V',\n\t'action.align-left': 'Align left',\n\t'action.align-right': 'Align right',\n\t'action.align-top': 'Align top',\n\t'action.back-to-content': 'Back to content',\n\t'action.bring-forward': 'Bring forward',\n\t'action.bring-to-front': 'Bring to front',\n\t'action.copy-as-json.short': 'JSON',\n\t'action.copy-as-json': 'Copy as JSON',\n\t'action.copy-as-png.short': 'PNG',\n\t'action.copy-as-png': 'Copy as PNG',\n\t'action.copy-as-svg.short': 'SVG',\n\t'action.copy-as-svg': 'Copy as SVG',\n\t'action.copy': 'Copy',\n\t'action.cut': 'Cut',\n\t'action.delete': 'Delete',\n\t'action.unlock-all': 'Unlock all',\n\t'action.distribute-horizontal': 'Distribute horizontally',\n\t'action.distribute-vertical': 'Distribute vertically',\n\t'action.distribute-horizontal.short': 'Distribute H',\n\t'action.distribute-vertical.short': 'Distribute V',\n\t'action.duplicate': 'Duplicate',\n\t'action.edit-link': 'Edit link',\n\t'action.exit-pen-mode': 'Exit pen mode',\n\t'action.export-as-json.short': 'JSON',\n\t'action.export-as-json': 'Export as JSON',\n\t'action.export-as-png.short': 'PNG',\n\t'action.export-as-png': 'Export as PNG',\n\t'action.export-as-svg.short': 'SVG',\n\t'action.export-as-svg': 'Export as SVG',\n\t'action.fit-frame-to-content': 'Fit to content',\n\t'action.flip-horizontal': 'Flip horizontally',\n\t'action.flip-vertical': 'Flip vertically',\n\t'action.flip-horizontal.short': 'Flip H',\n\t'action.flip-vertical.short': 'Flip V',\n\t'action.fork-project': 'Fork this project',\n\t'action.group': 'Group',\n\t'action.insert-embed': 'Insert embed',\n\t'action.insert-media': 'Upload media',\n\t'action.leave-shared-project': 'Leave shared project',\n\t'action.new-project': 'New project',\n\t'action.new-shared-project': 'New shared project',\n\t'action.open-cursor-chat': 'Cursor chat',\n\t'action.open-file': 'Open file',\n\t'action.pack': 'Pack',\n\t'action.paste': 'Paste',\n\t'action.print': 'Print',\n\t'action.redo': 'Redo',\n\t'action.remove-frame': 'Remove frame',\n\t'action.rotate-ccw': 'Rotate counterclockwise',\n\t'action.rotate-cw': 'Rotate clockwise',\n\t'action.save-copy': 'Save a copy',\n\t'action.select-all': 'Select all',\n\t'action.select-none': 'Select none',\n\t'action.send-backward': 'Send backward',\n\t'action.send-to-back': 'Send to back',\n\t'action.share-project': 'Share this project',\n\t'action.stack-horizontal': 'Stack horizontally',\n\t'action.stack-vertical': 'Stack vertically',\n\t'action.stack-horizontal.short': 'Stack H',\n\t'action.stack-vertical.short': 'Stack V',\n\t'action.stop-following': 'Stop following',\n\t'action.stretch-horizontal': 'Stretch horizontally',\n\t'action.stretch-vertical': 'Stretch vertically',\n\t'action.stretch-horizontal.short': 'Stretch H',\n\t'action.stretch-vertical.short': 'Stretch V',\n\t'action.toggle-auto-size': 'Toggle auto size',\n\t'action.toggle-dark-mode.menu': 'Dark mode',\n\t'action.toggle-dark-mode': 'Toggle dark mode',\n\t'action.toggle-reduce-motion.menu': 'Reduce motion',\n\t'action.toggle-reduce-motion': 'Toggle reduce motion',\n\t'action.toggle-debug-mode.menu': 'Debug mode',\n\t'action.toggle-debug-mode': 'Toggle debug mode',\n\t'action.toggle-focus-mode.menu': 'Focus mode',\n\t'action.toggle-focus-mode': 'Toggle focus mode',\n\t'action.toggle-grid.menu': 'Show grid',\n\t'action.toggle-grid': 'Toggle grid',\n\t'action.toggle-lock': 'Toggle locked',\n\t'action.toggle-snap-mode.menu': 'Always snap',\n\t'action.toggle-snap-mode': 'Toggle always snap',\n\t'action.toggle-tool-lock.menu': 'Tool lock',\n\t'action.toggle-tool-lock': 'Toggle tool lock',\n\t'action.toggle-transparent.context-menu': 'Transparent',\n\t'action.toggle-transparent.menu': 'Transparent',\n\t'action.toggle-transparent': 'Toggle transparent background',\n\t'action.undo': 'Undo',\n\t'action.ungroup': 'Ungroup',\n\t'action.zoom-in': 'Zoom in',\n\t'action.zoom-out': 'Zoom out',\n\t'action.zoom-to-100': 'Zoom to 100%',\n\t'action.zoom-to-fit': 'Zoom to fit',\n\t'action.zoom-to-selection': 'Zoom to selection',\n\t'color-style.black': 'Black',\n\t'color-style.blue': 'Blue',\n\t'color-style.green': 'Green',\n\t'color-style.grey': 'Grey',\n\t'color-style.light-blue': 'Light blue',\n\t'color-style.light-green': 'Light green',\n\t'color-style.light-red': 'Light red',\n\t'color-style.light-violet': 'Light violet',\n\t'color-style.orange': 'Orange',\n\t'color-style.red': 'Red',\n\t'color-style.violet': 'Violet',\n\t'color-style.yellow': 'Yellow',\n\t'fill-style.none': 'None',\n\t'fill-style.semi': 'Semi',\n\t'fill-style.solid': 'Solid',\n\t'fill-style.pattern': 'Pattern',\n\t'dash-style.dashed': 'Dashed',\n\t'dash-style.dotted': 'Dotted',\n\t'dash-style.draw': 'Draw',\n\t'dash-style.solid': 'Solid',\n\t'size-style.s': 'Small',\n\t'size-style.m': 'Medium',\n\t'size-style.l': 'Large',\n\t'size-style.xl': 'Extra large',\n\t'opacity-style.0.1': '10%',\n\t'opacity-style.0.25': '25%',\n\t'opacity-style.0.5': '50%',\n\t'opacity-style.0.75': '75%',\n\t'opacity-style.1': '100%',\n\t'font-style.draw': 'Draw',\n\t'font-style.sans': 'Sans',\n\t'font-style.serif': 'Serif',\n\t'font-style.mono': 'Mono',\n\t'align-style.start': 'Start',\n\t'align-style.middle': 'Middle',\n\t'align-style.end': 'End',\n\t'align-style.justify': 'Justify',\n\t'geo-style.arrow-down': 'Arrow down',\n\t'geo-style.arrow-left': 'Arrow left',\n\t'geo-style.arrow-right': 'Arrow right',\n\t'geo-style.arrow-up': 'Arrow up',\n\t'geo-style.diamond': 'Diamond',\n\t'geo-style.ellipse': 'Ellipse',\n\t'geo-style.hexagon': 'Hexagon',\n\t'geo-style.octagon': 'Octagon',\n\t'geo-style.oval': 'Oval',\n\t'geo-style.cloud': 'Cloud',\n\t'geo-style.pentagon': 'Pentagon',\n\t'geo-style.rectangle': 'Rectangle',\n\t'geo-style.rhombus-2': 'Rhombus 2',\n\t'geo-style.rhombus': 'Rhombus',\n\t'geo-style.star': 'Star',\n\t'geo-style.trapezoid': 'Trapezoid',\n\t'geo-style.triangle': 'Triangle',\n\t'geo-style.x-box': 'X box',\n\t'geo-style.check-box': 'Check box',\n\t'arrowheadStart-style.none': 'None',\n\t'arrowheadStart-style.arrow': 'Arrow',\n\t'arrowheadStart-style.bar': 'Bar',\n\t'arrowheadStart-style.diamond': 'Diamond',\n\t'arrowheadStart-style.dot': 'Dot',\n\t'arrowheadStart-style.inverted': 'Inverted',\n\t'arrowheadStart-style.pipe': 'Pipe',\n\t'arrowheadStart-style.square': 'Square',\n\t'arrowheadStart-style.triangle': 'Triangle',\n\t'arrowheadEnd-style.none': 'None',\n\t'arrowheadEnd-style.arrow': 'Arrow',\n\t'arrowheadEnd-style.bar': 'Bar',\n\t'arrowheadEnd-style.diamond': 'Diamond',\n\t'arrowheadEnd-style.dot': 'Dot',\n\t'arrowheadEnd-style.inverted': 'Inverted',\n\t'arrowheadEnd-style.pipe': 'Pipe',\n\t'arrowheadEnd-style.square': 'Square',\n\t'arrowheadEnd-style.triangle': 'Triangle',\n\t'spline-style.line': 'Line',\n\t'spline-style.cubic': 'Cubic',\n\t'tool.select': 'Select',\n\t'tool.hand': 'Hand',\n\t'tool.draw': 'Draw',\n\t'tool.eraser': 'Eraser',\n\t'tool.arrow-down': 'Arrow down',\n\t'tool.arrow-left': 'Arrow left',\n\t'tool.arrow-right': 'Arrow right',\n\t'tool.arrow-up': 'Arrow up',\n\t'tool.arrow': 'Arrow',\n\t'tool.cloud': 'Cloud',\n\t'tool.diamond': 'Diamond',\n\t'tool.ellipse': 'Ellipse',\n\t'tool.hexagon': 'Hexagon',\n\t'tool.highlight': 'Highlight',\n\t'tool.line': 'Line',\n\t'tool.octagon': 'Octagon',\n\t'tool.oval': 'Oval',\n\t'tool.pentagon': 'Pentagon',\n\t'tool.rectangle': 'Rectangle',\n\t'tool.rhombus': 'Rhombus',\n\t'tool.star': 'Star',\n\t'tool.trapezoid': 'Trapezoid',\n\t'tool.triangle': 'Triangle',\n\t'tool.x-box': 'X box',\n\t'tool.check-box': 'Check box',\n\t'tool.asset': 'Asset',\n\t'tool.frame': 'Frame',\n\t'tool.note': 'Note',\n\t'tool.laser': 'Laser',\n\t'tool.embed': 'Embed',\n\t'tool.text': 'Text',\n\t'menu.title': 'Menu',\n\t'menu.copy-as': 'Copy as',\n\t'menu.edit': 'Edit',\n\t'menu.export-as': 'Export as',\n\t'menu.file': 'File',\n\t'menu.language': 'Language',\n\t'menu.preferences': 'Preferences',\n\t'menu.view': 'View',\n\t'context-menu.arrange': 'Arrange',\n\t'context-menu.copy-as': 'Copy as',\n\t'context-menu.export-as': 'Export as',\n\t'context-menu.move-to-page': 'Move to page',\n\t'context-menu.reorder': 'Reorder',\n\t'page-menu.title': 'Pages',\n\t'page-menu.create-new-page': 'Create new page',\n\t'page-menu.max-page-count-reached': 'Max pages reached',\n\t'page-menu.new-page-initial-name': 'Page 1',\n\t'page-menu.edit-start': 'Edit',\n\t'page-menu.edit-done': 'Done',\n\t'page-menu.go-to-page': 'Go to page',\n\t'page-menu.submenu.rename': 'Rename',\n\t'page-menu.submenu.duplicate-page': 'Duplicate',\n\t'page-menu.submenu.title': 'Menu',\n\t'page-menu.submenu.move-down': 'Move down',\n\t'page-menu.submenu.move-up': 'Move up',\n\t'page-menu.submenu.delete': 'Delete',\n\t'share-menu.title': 'Share',\n\t'share-menu.save-note': 'Download this project to your computer as a .tldr file.',\n\t'share-menu.fork-note': 'Create a new shared project based on this snapshot.',\n\t'share-menu.share-project': 'Share this project',\n\t'share-menu.default-project-name': 'Shared Project',\n\t'share-menu.copy-link': 'Copy share link',\n\t'share-menu.readonly-link': 'Read-only',\n\t'share-menu.create-snapshot-link': 'Copy snapshot link',\n\t'share-menu.snapshot-link-note': 'Capture and share this project as a read-only snapshot link.',\n\t'share-menu.copy-readonly-link': 'Copy read-only link',\n\t'share-menu.offline-note': 'Create a new shared project based on your current project.',\n\t'share-menu.copy-link-note': 'Anyone with the link will be able to view and edit this project.',\n\t'share-menu.copy-readonly-link-note':\n\t\t'Anyone with the link will be able to view (but not edit) this project.',\n\t'share-menu.project-too-large':\n\t\t\"Sorry, this project can't be shared because it's too large. We're working on it!\",\n\t'share-menu.upload-failed':\n\t\t\"Sorry, we couldn't upload your project at the moment. Please try again or let us know if the problem persists.\",\n\t'status.offline': 'Offline',\n\t'status.online': 'Online',\n\t'people-menu.title': 'People',\n\t'people-menu.change-name': 'Change name',\n\t'people-menu.change-color': 'Change color',\n\t'people-menu.follow': 'Following',\n\t'people-menu.following': 'Following',\n\t'people-menu.leading': 'Following You',\n\t'people-menu.user': '(You)',\n\t'people-menu.invite': 'Invite others',\n\t'help-menu.title': 'Help and resources',\n\t'help-menu.about': 'About',\n\t'help-menu.discord': 'Discord',\n\t'help-menu.github': 'GitHub',\n\t'help-menu.keyboard-shortcuts': 'Keyboard shortcuts',\n\t'help-menu.twitter': 'Twitter',\n\t'actions-menu.title': 'Actions',\n\t'edit-link-dialog.title': 'Edit link',\n\t'edit-link-dialog.invalid-url': 'A link must be a valid URL.',\n\t'edit-link-dialog.detail': 'Links will open in a new tab.',\n\t'edit-link-dialog.url': 'URL',\n\t'edit-link-dialog.clear': 'Clear',\n\t'edit-link-dialog.save': 'Continue',\n\t'edit-link-dialog.cancel': 'Cancel',\n\t'embed-dialog.title': 'Insert embed',\n\t'embed-dialog.back': 'Back',\n\t'embed-dialog.create': 'Create',\n\t'embed-dialog.cancel': 'Cancel',\n\t'embed-dialog.url': 'URL',\n\t'embed-dialog.instruction': \"Paste in the site's URL to create the embed.\",\n\t'embed-dialog.invalid-url': 'We could not create an embed from that URL.',\n\t'edit-pages-dialog.move-down': 'Move down',\n\t'edit-pages-dialog.move-up': 'Move up',\n\t'shortcuts-dialog.title': 'Keyboard shortcuts',\n\t'shortcuts-dialog.edit': 'Edit',\n\t'shortcuts-dialog.file': 'File',\n\t'shortcuts-dialog.preferences': 'Preferences',\n\t'shortcuts-dialog.tools': 'Tools',\n\t'shortcuts-dialog.transform': 'Transform',\n\t'shortcuts-dialog.view': 'View',\n\t'shortcuts-dialog.collaboration': 'Collaboration',\n\t'home-project-dialog.title': 'Home project',\n\t'home-project-dialog.description': \"This is your local home project. It's just for you!\",\n\t'rename-project-dialog.title': 'Rename project',\n\t'rename-project-dialog.cancel': 'Cancel',\n\t'rename-project-dialog.rename': 'Rename',\n\t'home-project-dialog.ok': 'Ok',\n\t'style-panel.title': 'Styles',\n\t'style-panel.align': 'Align',\n\t'style-panel.vertical-align': 'Vertical align',\n\t'style-panel.position': 'Position',\n\t'style-panel.arrowheads': 'Arrows',\n\t'style-panel.arrowhead-start': 'Start',\n\t'style-panel.arrowhead-end': 'End',\n\t'style-panel.color': 'Color',\n\t'style-panel.dash': 'Dash',\n\t'style-panel.fill': 'Fill',\n\t'style-panel.font': 'Font',\n\t'style-panel.geo': 'Shape',\n\t'style-panel.mixed': 'Mixed',\n\t'style-panel.opacity': 'Opacity',\n\t'style-panel.size': 'Size',\n\t'style-panel.spline': 'Spline',\n\t'tool-panel.drawing': 'Drawing',\n\t'tool-panel.shapes': 'Shapes',\n\t'tool-panel.more': 'More',\n\t'debug-panel.more': 'More',\n\t'navigation-zone.toggle-minimap': 'Toggle minimap',\n\t'navigation-zone.zoom': 'Zoom',\n\t'focus-mode.toggle-focus-mode': 'Toggle focus mode',\n\t'toast.close': 'Close',\n\t'file-system.file-open-error.title': 'Could not open file',\n\t'file-system.file-open-error.not-a-tldraw-file':\n\t\t\"The file you tried to open doesn't look like a tldraw file.\",\n\t'file-system.file-open-error.file-format-version-too-new':\n\t\t'The file you tried to open is from a newer version of tldraw. Please reload the page and try again.',\n\t'file-system.file-open-error.generic-corrupted-file': 'The file you tried to open is corrupted.',\n\t'file-system.confirm-open.title': 'Overwrite current project?',\n\t'file-system.confirm-open.description':\n\t\t'Opening a file will replace your current project and any unsaved changes will be lost. Are you sure you want to continue?',\n\t'file-system.confirm-open.cancel': 'Cancel',\n\t'file-system.confirm-open.open': 'Open file',\n\t'file-system.confirm-open.dont-show-again': \"Don't ask again\",\n\t'file-system.confirm-clear.title': 'Clear current project?',\n\t'file-system.confirm-clear.description':\n\t\t'Creating a new project will clear your current project and any unsaved changes will be lost. Are you sure you want to continue?',\n\t'file-system.confirm-clear.cancel': 'Cancel',\n\t'file-system.confirm-clear.continue': 'Continue',\n\t'file-system.confirm-clear.dont-show-again': \"Don't ask again\",\n\t'file-system.shared-document-file-open-error.title': 'Could not open file',\n\t'file-system.shared-document-file-open-error.description':\n\t\t'Opening files from shared projects is not supported.',\n\t'sharing.confirm-leave.title': 'Leave current project?',\n\t'sharing.confirm-leave.description':\n\t\t'Are you sure you want to leave this shared project? You can return to it by navigating to its URL.',\n\t'sharing.confirm-leave.cancel': 'Cancel',\n\t'sharing.confirm-leave.leave': 'Leave',\n\t'sharing.confirm-leave.dont-show-again': \"Don't ask again\",\n\t'toast.error.export-fail.title': 'Failed export',\n\t'toast.error.export-fail.desc': 'Failed to export image',\n\t'toast.error.copy-fail.title': 'Failed copy',\n\t'toast.error.copy-fail.desc': 'Failed to copy image',\n\t'context.pages.new-page': 'New page',\n\t'vscode.file-open.desc':\n\t\t\"We've updated this document to work with the current version of tldraw. If you'd like to keep the original version (which will work on old.tldraw.com), click below to create a backup.\",\n\t'vscode.file-open.open': 'Continue',\n\t'vscode.file-open.backup': 'Backup',\n\t'vscode.file-open.backup-saved': 'Backup saved',\n\t'vscode.file-open.backup-failed': 'Backup failed: this is not a .tldr file.',\n\t'vscode.file-open.dont-show-again': \"Don't ask again\",\n\t'cursor-chat.type-to-chat': 'Type to chat...',\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// This file is automatically generated by scripts/refresh-assets.ts.\n// Do not edit manually.\n\n/** @internal */\nexport const DEFAULT_TRANSLATION = {\n\t'action.convert-to-bookmark': 'Convert to Bookmark',\n\t'action.convert-to-embed': 'Convert to Embed',\n\t'action.open-embed-link': 'Open link',\n\t'action.align-bottom': 'Align bottom',\n\t'action.align-center-horizontal': 'Align horizontally',\n\t'action.align-center-vertical': 'Align vertically',\n\t'action.align-center-horizontal.short': 'Align H',\n\t'action.align-center-vertical.short': 'Align V',\n\t'action.align-left': 'Align left',\n\t'action.align-right': 'Align right',\n\t'action.align-top': 'Align top',\n\t'action.back-to-content': 'Back to content',\n\t'action.bring-forward': 'Bring forward',\n\t'action.bring-to-front': 'Bring to front',\n\t'action.copy-as-json.short': 'JSON',\n\t'action.copy-as-json': 'Copy as JSON',\n\t'action.copy-as-png.short': 'PNG',\n\t'action.copy-as-png': 'Copy as PNG',\n\t'action.copy-as-svg.short': 'SVG',\n\t'action.copy-as-svg': 'Copy as SVG',\n\t'action.copy': 'Copy',\n\t'action.cut': 'Cut',\n\t'action.delete': 'Delete',\n\t'action.unlock-all': 'Unlock all',\n\t'action.distribute-horizontal': 'Distribute horizontally',\n\t'action.distribute-vertical': 'Distribute vertically',\n\t'action.distribute-horizontal.short': 'Distribute H',\n\t'action.distribute-vertical.short': 'Distribute V',\n\t'action.duplicate': 'Duplicate',\n\t'action.edit-link': 'Edit link',\n\t'action.exit-pen-mode': 'Exit pen mode',\n\t'action.export-as-json.short': 'JSON',\n\t'action.export-as-json': 'Export as JSON',\n\t'action.export-as-png.short': 'PNG',\n\t'action.export-as-png': 'Export as PNG',\n\t'action.export-as-svg.short': 'SVG',\n\t'action.export-as-svg': 'Export as SVG',\n\t'action.fit-frame-to-content': 'Fit to content',\n\t'action.flip-horizontal': 'Flip horizontally',\n\t'action.flip-vertical': 'Flip vertically',\n\t'action.flip-horizontal.short': 'Flip H',\n\t'action.flip-vertical.short': 'Flip V',\n\t'action.fork-project': 'Fork this project',\n\t'action.group': 'Group',\n\t'action.insert-embed': 'Insert embed',\n\t'action.insert-media': 'Upload media',\n\t'action.leave-shared-project': 'Leave shared project',\n\t'action.new-project': 'New project',\n\t'action.new-shared-project': 'New shared project',\n\t'action.open-cursor-chat': 'Cursor chat',\n\t'action.open-file': 'Open file',\n\t'action.pack': 'Pack',\n\t'action.paste': 'Paste',\n\t'action.print': 'Print',\n\t'action.redo': 'Redo',\n\t'action.remove-frame': 'Remove frame',\n\t'action.rotate-ccw': 'Rotate counterclockwise',\n\t'action.rotate-cw': 'Rotate clockwise',\n\t'action.save-copy': 'Save a copy',\n\t'action.select-all': 'Select all',\n\t'action.select-none': 'Select none',\n\t'action.send-backward': 'Send backward',\n\t'action.send-to-back': 'Send to back',\n\t'action.share-project': 'Share this project',\n\t'action.stack-horizontal': 'Stack horizontally',\n\t'action.stack-vertical': 'Stack vertically',\n\t'action.stack-horizontal.short': 'Stack H',\n\t'action.stack-vertical.short': 'Stack V',\n\t'action.stop-following': 'Stop following',\n\t'action.stretch-horizontal': 'Stretch horizontally',\n\t'action.stretch-vertical': 'Stretch vertically',\n\t'action.stretch-horizontal.short': 'Stretch H',\n\t'action.stretch-vertical.short': 'Stretch V',\n\t'action.toggle-auto-size': 'Toggle auto size',\n\t'action.toggle-dark-mode.menu': 'Dark mode',\n\t'action.toggle-dark-mode': 'Toggle dark mode',\n\t'action.toggle-reduce-motion.menu': 'Reduce motion',\n\t'action.toggle-reduce-motion': 'Toggle reduce motion',\n\t'action.toggle-edge-scrolling.menu': 'Edge scrolling',\n\t'action.toggle-edge-scrolling': 'Toggle edge scrolling',\n\t'action.toggle-debug-mode.menu': 'Debug mode',\n\t'action.toggle-debug-mode': 'Toggle debug mode',\n\t'action.toggle-focus-mode.menu': 'Focus mode',\n\t'action.toggle-focus-mode': 'Toggle focus mode',\n\t'action.toggle-grid.menu': 'Show grid',\n\t'action.toggle-grid': 'Toggle grid',\n\t'action.toggle-lock': 'Toggle locked',\n\t'action.toggle-snap-mode.menu': 'Always snap',\n\t'action.toggle-snap-mode': 'Toggle always snap',\n\t'action.toggle-tool-lock.menu': 'Tool lock',\n\t'action.toggle-tool-lock': 'Toggle tool lock',\n\t'action.toggle-transparent.context-menu': 'Transparent',\n\t'action.toggle-transparent.menu': 'Transparent',\n\t'action.toggle-transparent': 'Toggle transparent background',\n\t'action.undo': 'Undo',\n\t'action.ungroup': 'Ungroup',\n\t'action.zoom-in': 'Zoom in',\n\t'action.zoom-out': 'Zoom out',\n\t'action.zoom-to-100': 'Zoom to 100%',\n\t'action.zoom-to-fit': 'Zoom to fit',\n\t'action.zoom-to-selection': 'Zoom to selection',\n\t'color-style.black': 'Black',\n\t'color-style.blue': 'Blue',\n\t'color-style.green': 'Green',\n\t'color-style.grey': 'Grey',\n\t'color-style.light-blue': 'Light blue',\n\t'color-style.light-green': 'Light green',\n\t'color-style.light-red': 'Light red',\n\t'color-style.light-violet': 'Light violet',\n\t'color-style.orange': 'Orange',\n\t'color-style.red': 'Red',\n\t'color-style.violet': 'Violet',\n\t'color-style.yellow': 'Yellow',\n\t'fill-style.none': 'None',\n\t'fill-style.semi': 'Semi',\n\t'fill-style.solid': 'Solid',\n\t'fill-style.pattern': 'Pattern',\n\t'dash-style.dashed': 'Dashed',\n\t'dash-style.dotted': 'Dotted',\n\t'dash-style.draw': 'Draw',\n\t'dash-style.solid': 'Solid',\n\t'size-style.s': 'Small',\n\t'size-style.m': 'Medium',\n\t'size-style.l': 'Large',\n\t'size-style.xl': 'Extra large',\n\t'opacity-style.0.1': '10%',\n\t'opacity-style.0.25': '25%',\n\t'opacity-style.0.5': '50%',\n\t'opacity-style.0.75': '75%',\n\t'opacity-style.1': '100%',\n\t'font-style.draw': 'Draw',\n\t'font-style.sans': 'Sans',\n\t'font-style.serif': 'Serif',\n\t'font-style.mono': 'Mono',\n\t'align-style.start': 'Start',\n\t'align-style.middle': 'Middle',\n\t'align-style.end': 'End',\n\t'align-style.justify': 'Justify',\n\t'geo-style.arrow-down': 'Arrow down',\n\t'geo-style.arrow-left': 'Arrow left',\n\t'geo-style.arrow-right': 'Arrow right',\n\t'geo-style.arrow-up': 'Arrow up',\n\t'geo-style.diamond': 'Diamond',\n\t'geo-style.ellipse': 'Ellipse',\n\t'geo-style.hexagon': 'Hexagon',\n\t'geo-style.octagon': 'Octagon',\n\t'geo-style.oval': 'Oval',\n\t'geo-style.cloud': 'Cloud',\n\t'geo-style.pentagon': 'Pentagon',\n\t'geo-style.rectangle': 'Rectangle',\n\t'geo-style.rhombus-2': 'Rhombus 2',\n\t'geo-style.rhombus': 'Rhombus',\n\t'geo-style.star': 'Star',\n\t'geo-style.trapezoid': 'Trapezoid',\n\t'geo-style.triangle': 'Triangle',\n\t'geo-style.x-box': 'X box',\n\t'geo-style.check-box': 'Check box',\n\t'arrowheadStart-style.none': 'None',\n\t'arrowheadStart-style.arrow': 'Arrow',\n\t'arrowheadStart-style.bar': 'Bar',\n\t'arrowheadStart-style.diamond': 'Diamond',\n\t'arrowheadStart-style.dot': 'Dot',\n\t'arrowheadStart-style.inverted': 'Inverted',\n\t'arrowheadStart-style.pipe': 'Pipe',\n\t'arrowheadStart-style.square': 'Square',\n\t'arrowheadStart-style.triangle': 'Triangle',\n\t'arrowheadEnd-style.none': 'None',\n\t'arrowheadEnd-style.arrow': 'Arrow',\n\t'arrowheadEnd-style.bar': 'Bar',\n\t'arrowheadEnd-style.diamond': 'Diamond',\n\t'arrowheadEnd-style.dot': 'Dot',\n\t'arrowheadEnd-style.inverted': 'Inverted',\n\t'arrowheadEnd-style.pipe': 'Pipe',\n\t'arrowheadEnd-style.square': 'Square',\n\t'arrowheadEnd-style.triangle': 'Triangle',\n\t'spline-style.line': 'Line',\n\t'spline-style.cubic': 'Cubic',\n\t'tool.select': 'Select',\n\t'tool.hand': 'Hand',\n\t'tool.draw': 'Draw',\n\t'tool.eraser': 'Eraser',\n\t'tool.arrow-down': 'Arrow down',\n\t'tool.arrow-left': 'Arrow left',\n\t'tool.arrow-right': 'Arrow right',\n\t'tool.arrow-up': 'Arrow up',\n\t'tool.arrow': 'Arrow',\n\t'tool.cloud': 'Cloud',\n\t'tool.diamond': 'Diamond',\n\t'tool.ellipse': 'Ellipse',\n\t'tool.hexagon': 'Hexagon',\n\t'tool.highlight': 'Highlight',\n\t'tool.line': 'Line',\n\t'tool.octagon': 'Octagon',\n\t'tool.oval': 'Oval',\n\t'tool.pentagon': 'Pentagon',\n\t'tool.rectangle': 'Rectangle',\n\t'tool.rhombus': 'Rhombus',\n\t'tool.star': 'Star',\n\t'tool.trapezoid': 'Trapezoid',\n\t'tool.triangle': 'Triangle',\n\t'tool.x-box': 'X box',\n\t'tool.check-box': 'Check box',\n\t'tool.asset': 'Asset',\n\t'tool.frame': 'Frame',\n\t'tool.note': 'Note',\n\t'tool.laser': 'Laser',\n\t'tool.embed': 'Embed',\n\t'tool.text': 'Text',\n\t'menu.title': 'Menu',\n\t'menu.copy-as': 'Copy as',\n\t'menu.edit': 'Edit',\n\t'menu.export-as': 'Export as',\n\t'menu.file': 'File',\n\t'menu.language': 'Language',\n\t'menu.preferences': 'Preferences',\n\t'menu.view': 'View',\n\t'context-menu.arrange': 'Arrange',\n\t'context-menu.copy-as': 'Copy as',\n\t'context-menu.export-as': 'Export as',\n\t'context-menu.move-to-page': 'Move to page',\n\t'context-menu.reorder': 'Reorder',\n\t'page-menu.title': 'Pages',\n\t'page-menu.create-new-page': 'Create new page',\n\t'page-menu.max-page-count-reached': 'Max pages reached',\n\t'page-menu.new-page-initial-name': 'Page 1',\n\t'page-menu.edit-start': 'Edit',\n\t'page-menu.edit-done': 'Done',\n\t'page-menu.go-to-page': 'Go to page',\n\t'page-menu.submenu.rename': 'Rename',\n\t'page-menu.submenu.duplicate-page': 'Duplicate',\n\t'page-menu.submenu.title': 'Menu',\n\t'page-menu.submenu.move-down': 'Move down',\n\t'page-menu.submenu.move-up': 'Move up',\n\t'page-menu.submenu.delete': 'Delete',\n\t'share-menu.title': 'Share',\n\t'share-menu.save-note': 'Download this project to your computer as a .tldr file.',\n\t'share-menu.fork-note': 'Create a new shared project based on this snapshot.',\n\t'share-menu.share-project': 'Share this project',\n\t'share-menu.default-project-name': 'Shared Project',\n\t'share-menu.copy-link': 'Copy share link',\n\t'share-menu.readonly-link': 'Read-only',\n\t'share-menu.create-snapshot-link': 'Copy snapshot link',\n\t'share-menu.snapshot-link-note': 'Capture and share this project as a read-only snapshot link.',\n\t'share-menu.copy-readonly-link': 'Copy read-only link',\n\t'share-menu.offline-note': 'Create a new shared project based on your current project.',\n\t'share-menu.copy-link-note': 'Anyone with the link will be able to view and edit this project.',\n\t'share-menu.copy-readonly-link-note':\n\t\t'Anyone with the link will be able to view (but not edit) this project.',\n\t'share-menu.project-too-large':\n\t\t\"Sorry, this project can't be shared because it's too large. We're working on it!\",\n\t'share-menu.upload-failed':\n\t\t\"Sorry, we couldn't upload your project at the moment. Please try again or let us know if the problem persists.\",\n\t'status.offline': 'Offline',\n\t'status.online': 'Online',\n\t'people-menu.title': 'People',\n\t'people-menu.change-name': 'Change name',\n\t'people-menu.change-color': 'Change color',\n\t'people-menu.follow': 'Following',\n\t'people-menu.following': 'Following',\n\t'people-menu.leading': 'Following You',\n\t'people-menu.user': '(You)',\n\t'people-menu.invite': 'Invite others',\n\t'help-menu.title': 'Help and resources',\n\t'help-menu.about': 'About',\n\t'help-menu.discord': 'Discord',\n\t'help-menu.github': 'GitHub',\n\t'help-menu.keyboard-shortcuts': 'Keyboard shortcuts',\n\t'help-menu.twitter': 'Twitter',\n\t'actions-menu.title': 'Actions',\n\t'edit-link-dialog.title': 'Edit link',\n\t'edit-link-dialog.invalid-url': 'A link must be a valid URL.',\n\t'edit-link-dialog.detail': 'Links will open in a new tab.',\n\t'edit-link-dialog.url': 'URL',\n\t'edit-link-dialog.clear': 'Clear',\n\t'edit-link-dialog.save': 'Continue',\n\t'edit-link-dialog.cancel': 'Cancel',\n\t'embed-dialog.title': 'Insert embed',\n\t'embed-dialog.back': 'Back',\n\t'embed-dialog.create': 'Create',\n\t'embed-dialog.cancel': 'Cancel',\n\t'embed-dialog.url': 'URL',\n\t'embed-dialog.instruction': \"Paste in the site's URL to create the embed.\",\n\t'embed-dialog.invalid-url': 'We could not create an embed from that URL.',\n\t'edit-pages-dialog.move-down': 'Move down',\n\t'edit-pages-dialog.move-up': 'Move up',\n\t'shortcuts-dialog.title': 'Keyboard shortcuts',\n\t'shortcuts-dialog.edit': 'Edit',\n\t'shortcuts-dialog.file': 'File',\n\t'shortcuts-dialog.preferences': 'Preferences',\n\t'shortcuts-dialog.tools': 'Tools',\n\t'shortcuts-dialog.transform': 'Transform',\n\t'shortcuts-dialog.view': 'View',\n\t'shortcuts-dialog.collaboration': 'Collaboration',\n\t'home-project-dialog.title': 'Home project',\n\t'home-project-dialog.description': \"This is your local home project. It's just for you!\",\n\t'rename-project-dialog.title': 'Rename project',\n\t'rename-project-dialog.cancel': 'Cancel',\n\t'rename-project-dialog.rename': 'Rename',\n\t'home-project-dialog.ok': 'Ok',\n\t'style-panel.title': 'Styles',\n\t'style-panel.align': 'Align',\n\t'style-panel.vertical-align': 'Vertical align',\n\t'style-panel.position': 'Position',\n\t'style-panel.arrowheads': 'Arrows',\n\t'style-panel.arrowhead-start': 'Start',\n\t'style-panel.arrowhead-end': 'End',\n\t'style-panel.color': 'Color',\n\t'style-panel.dash': 'Dash',\n\t'style-panel.fill': 'Fill',\n\t'style-panel.font': 'Font',\n\t'style-panel.geo': 'Shape',\n\t'style-panel.mixed': 'Mixed',\n\t'style-panel.opacity': 'Opacity',\n\t'style-panel.size': 'Size',\n\t'style-panel.spline': 'Spline',\n\t'tool-panel.drawing': 'Drawing',\n\t'tool-panel.shapes': 'Shapes',\n\t'tool-panel.more': 'More',\n\t'debug-panel.more': 'More',\n\t'navigation-zone.toggle-minimap': 'Toggle minimap',\n\t'navigation-zone.zoom': 'Zoom',\n\t'focus-mode.toggle-focus-mode': 'Toggle focus mode',\n\t'toast.close': 'Close',\n\t'file-system.file-open-error.title': 'Could not open file',\n\t'file-system.file-open-error.not-a-tldraw-file':\n\t\t\"The file you tried to open doesn't look like a tldraw file.\",\n\t'file-system.file-open-error.file-format-version-too-new':\n\t\t'The file you tried to open is from a newer version of tldraw. Please reload the page and try again.',\n\t'file-system.file-open-error.generic-corrupted-file': 'The file you tried to open is corrupted.',\n\t'file-system.confirm-open.title': 'Overwrite current project?',\n\t'file-system.confirm-open.description':\n\t\t'Opening a file will replace your current project and any unsaved changes will be lost. Are you sure you want to continue?',\n\t'file-system.confirm-open.cancel': 'Cancel',\n\t'file-system.confirm-open.open': 'Open file',\n\t'file-system.confirm-open.dont-show-again': \"Don't ask again\",\n\t'file-system.confirm-clear.title': 'Clear current project?',\n\t'file-system.confirm-clear.description':\n\t\t'Creating a new project will clear your current project and any unsaved changes will be lost. Are you sure you want to continue?',\n\t'file-system.confirm-clear.cancel': 'Cancel',\n\t'file-system.confirm-clear.continue': 'Continue',\n\t'file-system.confirm-clear.dont-show-again': \"Don't ask again\",\n\t'file-system.shared-document-file-open-error.title': 'Could not open file',\n\t'file-system.shared-document-file-open-error.description':\n\t\t'Opening files from shared projects is not supported.',\n\t'sharing.confirm-leave.title': 'Leave current project?',\n\t'sharing.confirm-leave.description':\n\t\t'Are you sure you want to leave this shared project? You can return to it by navigating to its URL.',\n\t'sharing.confirm-leave.cancel': 'Cancel',\n\t'sharing.confirm-leave.leave': 'Leave',\n\t'sharing.confirm-leave.dont-show-again': \"Don't ask again\",\n\t'toast.error.export-fail.title': 'Failed export',\n\t'toast.error.export-fail.desc': 'Failed to export image',\n\t'toast.error.copy-fail.title': 'Failed copy',\n\t'toast.error.copy-fail.desc': 'Failed to copy image',\n\t'context.pages.new-page': 'New page',\n\t'vscode.file-open.desc':\n\t\t\"We've updated this document to work with the current version of tldraw. If you'd like to keep the original version (which will work on old.tldraw.com), click below to create a backup.\",\n\t'vscode.file-open.open': 'Continue',\n\t'vscode.file-open.backup': 'Backup',\n\t'vscode.file-open.backup-saved': 'Backup saved',\n\t'vscode.file-open.backup-failed': 'Backup failed: this is not a .tldr file.',\n\t'vscode.file-open.dont-show-again': \"Don't ask again\",\n\t'cursor-chat.type-to-chat': 'Type to chat...',\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- const version = "2.0.0-alpha.12";
1
+ const version = "2.0.0-alpha.20";
2
2
  export {
3
3
  version
4
4
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/ui/version.ts"],
4
- "sourcesContent": ["export const version = '2.0.0-alpha.12'\n"],
4
+ "sourcesContent": ["export const version = '2.0.0-alpha.20'\n"],
5
5
  "mappings": "AAAO,MAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -37,7 +37,11 @@ async function getResizedImageDataUrl(dataURLForImage, width, height, opts = {})
37
37
  desiredWidth *= ratio;
38
38
  desiredHeight *= ratio;
39
39
  }
40
- return await downscale(dataURLForImage, desiredWidth, desiredHeight, { imageType: type, quality });
40
+ return await downscale(dataURLForImage, desiredWidth, desiredHeight, {
41
+ // downscale expects the type without the `image/` prefix
42
+ imageType: type.replace("image/", ""),
43
+ quality
44
+ });
41
45
  }
42
46
  const DEFAULT_ACCEPTED_IMG_TYPE = ["image/jpeg", "image/png", "image/gif", "image/svg+xml"];
43
47
  const DEFAULT_ACCEPTED_VID_TYPE = ["video/mp4", "video/quicktime"];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/utils/assets/assets.ts"],
4
- "sourcesContent": ["import downscale from 'downscale'\nimport { getBrowserCanvasMaxSize } from '../../shapes/shared/getBrowserCanvasMaxSize'\nimport { isAnimated } from './is-gif-animated'\n\ntype BoxWidthHeight = {\n\tw: number\n\th: number\n}\n\n/**\n * Contains the size within the given box size\n *\n * @param originalSize - The size of the asset\n * @param containBoxSize - The container size\n * @returns Adjusted size\n * @public\n */\nexport function containBoxSize(\n\toriginalSize: BoxWidthHeight,\n\tcontainBoxSize: BoxWidthHeight\n): BoxWidthHeight {\n\tconst overByXScale = originalSize.w / containBoxSize.w\n\tconst overByYScale = originalSize.h / containBoxSize.h\n\n\tif (overByXScale <= 1 && overByYScale <= 1) {\n\t\treturn originalSize\n\t} else if (overByXScale > overByYScale) {\n\t\treturn {\n\t\t\tw: originalSize.w / overByXScale,\n\t\t\th: originalSize.h / overByXScale,\n\t\t}\n\t} else {\n\t\treturn {\n\t\t\tw: originalSize.w / overByYScale,\n\t\t\th: originalSize.h / overByYScale,\n\t\t}\n\t}\n}\n\n/**\n * Get the size of an image from its source.\n *\n * @example\n * ```ts\n * const size = await getImageSize('https://example.com/image.jpg')\n * const dataUrl = await getResizedImageDataUrl('https://example.com/image.jpg', size.w, size.h, { type: \"image/jpeg\", quality: 0.92 })\n * ```\n *\n * @param dataURLForImage - The image file as a string.\n * @param width - The desired width.\n * @param height - The desired height.\n * @param opts - Options for the image.\n * @public\n */\nexport async function getResizedImageDataUrl(\n\tdataURLForImage: string,\n\twidth: number,\n\theight: number,\n\topts = {} as { type?: string; quality?: number }\n): Promise<string> {\n\tlet desiredWidth = width * 2\n\tlet desiredHeight = height * 2\n\tconst { type = 'image/jpeg', quality = 0.92 } = opts\n\n\tconst canvasSizes = await getBrowserCanvasMaxSize()\n\n\tconst aspectRatio = width / height\n\n\tif (desiredWidth > canvasSizes.maxWidth) {\n\t\tdesiredWidth = canvasSizes.maxWidth\n\t\tdesiredHeight = desiredWidth / aspectRatio\n\t}\n\n\tif (desiredHeight > canvasSizes.maxHeight) {\n\t\tdesiredHeight = canvasSizes.maxHeight\n\t\tdesiredWidth = desiredHeight * aspectRatio\n\t}\n\n\tif (desiredWidth * desiredHeight > canvasSizes.maxArea) {\n\t\tconst ratio = Math.sqrt(canvasSizes.maxArea / (desiredWidth * desiredHeight))\n\t\tdesiredWidth *= ratio\n\t\tdesiredHeight *= ratio\n\t}\n\n\treturn await downscale(dataURLForImage, desiredWidth, desiredHeight, { imageType: type, quality })\n}\n\n/** @public */\nexport const DEFAULT_ACCEPTED_IMG_TYPE = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml']\n/** @public */\nexport const DEFAULT_ACCEPTED_VID_TYPE = ['video/mp4', 'video/quicktime']\n\n/** @public */\nexport async function isGifAnimated(file: File): Promise<boolean> {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onerror = () => reject(reader.error)\n\t\treader.onload = () => {\n\t\t\tresolve(reader.result ? isAnimated(reader.result as ArrayBuffer) : false)\n\t\t}\n\t\treader.readAsArrayBuffer(file)\n\t})\n}\n"],
5
- "mappings": "AAAA,OAAO,eAAe;AACtB,SAAS,+BAA+B;AACxC,SAAS,kBAAkB;AAepB,SAAS,eACf,cACAA,iBACiB;AACjB,QAAM,eAAe,aAAa,IAAIA,gBAAe;AACrD,QAAM,eAAe,aAAa,IAAIA,gBAAe;AAErD,MAAI,gBAAgB,KAAK,gBAAgB,GAAG;AAC3C,WAAO;AAAA,EACR,WAAW,eAAe,cAAc;AACvC,WAAO;AAAA,MACN,GAAG,aAAa,IAAI;AAAA,MACpB,GAAG,aAAa,IAAI;AAAA,IACrB;AAAA,EACD,OAAO;AACN,WAAO;AAAA,MACN,GAAG,aAAa,IAAI;AAAA,MACpB,GAAG,aAAa,IAAI;AAAA,IACrB;AAAA,EACD;AACD;AAiBA,eAAsB,uBACrB,iBACA,OACA,QACA,OAAO,CAAC,GACU;AAClB,MAAI,eAAe,QAAQ;AAC3B,MAAI,gBAAgB,SAAS;AAC7B,QAAM,EAAE,OAAO,cAAc,UAAU,KAAK,IAAI;AAEhD,QAAM,cAAc,MAAM,wBAAwB;AAElD,QAAM,cAAc,QAAQ;AAE5B,MAAI,eAAe,YAAY,UAAU;AACxC,mBAAe,YAAY;AAC3B,oBAAgB,eAAe;AAAA,EAChC;AAEA,MAAI,gBAAgB,YAAY,WAAW;AAC1C,oBAAgB,YAAY;AAC5B,mBAAe,gBAAgB;AAAA,EAChC;AAEA,MAAI,eAAe,gBAAgB,YAAY,SAAS;AACvD,UAAM,QAAQ,KAAK,KAAK,YAAY,WAAW,eAAe,cAAc;AAC5E,oBAAgB;AAChB,qBAAiB;AAAA,EAClB;AAEA,SAAO,MAAM,UAAU,iBAAiB,cAAc,eAAe,EAAE,WAAW,MAAM,QAAQ,CAAC;AAClG;AAGO,MAAM,4BAA4B,CAAC,cAAc,aAAa,aAAa,eAAe;AAE1F,MAAM,4BAA4B,CAAC,aAAa,iBAAiB;AAGxE,eAAsB,cAAc,MAA8B;AACjE,SAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7C,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,UAAU,MAAM,OAAO,OAAO,KAAK;AAC1C,WAAO,SAAS,MAAM;AACrB,cAAQ,OAAO,SAAS,WAAW,OAAO,MAAqB,IAAI,KAAK;AAAA,IACzE;AACA,WAAO,kBAAkB,IAAI;AAAA,EAC9B,CAAC;AACF;",
4
+ "sourcesContent": ["import downscale from 'downscale'\nimport { getBrowserCanvasMaxSize } from '../../shapes/shared/getBrowserCanvasMaxSize'\nimport { isAnimated } from './is-gif-animated'\n\ntype BoxWidthHeight = {\n\tw: number\n\th: number\n}\n\n/**\n * Contains the size within the given box size\n *\n * @param originalSize - The size of the asset\n * @param containBoxSize - The container size\n * @returns Adjusted size\n * @public\n */\nexport function containBoxSize(\n\toriginalSize: BoxWidthHeight,\n\tcontainBoxSize: BoxWidthHeight\n): BoxWidthHeight {\n\tconst overByXScale = originalSize.w / containBoxSize.w\n\tconst overByYScale = originalSize.h / containBoxSize.h\n\n\tif (overByXScale <= 1 && overByYScale <= 1) {\n\t\treturn originalSize\n\t} else if (overByXScale > overByYScale) {\n\t\treturn {\n\t\t\tw: originalSize.w / overByXScale,\n\t\t\th: originalSize.h / overByXScale,\n\t\t}\n\t} else {\n\t\treturn {\n\t\t\tw: originalSize.w / overByYScale,\n\t\t\th: originalSize.h / overByYScale,\n\t\t}\n\t}\n}\n\n/**\n * Get the size of an image from its source.\n *\n * @example\n * ```ts\n * const size = await getImageSize('https://example.com/image.jpg')\n * const dataUrl = await getResizedImageDataUrl('https://example.com/image.jpg', size.w, size.h, { type: \"image/jpeg\", quality: 0.92 })\n * ```\n *\n * @param dataURLForImage - The image file as a string.\n * @param width - The desired width.\n * @param height - The desired height.\n * @param opts - Options for the image.\n * @public\n */\nexport async function getResizedImageDataUrl(\n\tdataURLForImage: string,\n\twidth: number,\n\theight: number,\n\topts = {} as { type?: string; quality?: number }\n): Promise<string> {\n\tlet desiredWidth = width * 2\n\tlet desiredHeight = height * 2\n\tconst { type = 'image/jpeg', quality = 0.92 } = opts\n\n\tconst canvasSizes = await getBrowserCanvasMaxSize()\n\n\tconst aspectRatio = width / height\n\n\tif (desiredWidth > canvasSizes.maxWidth) {\n\t\tdesiredWidth = canvasSizes.maxWidth\n\t\tdesiredHeight = desiredWidth / aspectRatio\n\t}\n\n\tif (desiredHeight > canvasSizes.maxHeight) {\n\t\tdesiredHeight = canvasSizes.maxHeight\n\t\tdesiredWidth = desiredHeight * aspectRatio\n\t}\n\n\tif (desiredWidth * desiredHeight > canvasSizes.maxArea) {\n\t\tconst ratio = Math.sqrt(canvasSizes.maxArea / (desiredWidth * desiredHeight))\n\t\tdesiredWidth *= ratio\n\t\tdesiredHeight *= ratio\n\t}\n\n\treturn await downscale(dataURLForImage, desiredWidth, desiredHeight, {\n\t\t// downscale expects the type without the `image/` prefix\n\t\timageType: type.replace('image/', ''),\n\t\tquality,\n\t})\n}\n\n/** @public */\nexport const DEFAULT_ACCEPTED_IMG_TYPE = ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml']\n/** @public */\nexport const DEFAULT_ACCEPTED_VID_TYPE = ['video/mp4', 'video/quicktime']\n\n/** @public */\nexport async function isGifAnimated(file: File): Promise<boolean> {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onerror = () => reject(reader.error)\n\t\treader.onload = () => {\n\t\t\tresolve(reader.result ? isAnimated(reader.result as ArrayBuffer) : false)\n\t\t}\n\t\treader.readAsArrayBuffer(file)\n\t})\n}\n"],
5
+ "mappings": "AAAA,OAAO,eAAe;AACtB,SAAS,+BAA+B;AACxC,SAAS,kBAAkB;AAepB,SAAS,eACf,cACAA,iBACiB;AACjB,QAAM,eAAe,aAAa,IAAIA,gBAAe;AACrD,QAAM,eAAe,aAAa,IAAIA,gBAAe;AAErD,MAAI,gBAAgB,KAAK,gBAAgB,GAAG;AAC3C,WAAO;AAAA,EACR,WAAW,eAAe,cAAc;AACvC,WAAO;AAAA,MACN,GAAG,aAAa,IAAI;AAAA,MACpB,GAAG,aAAa,IAAI;AAAA,IACrB;AAAA,EACD,OAAO;AACN,WAAO;AAAA,MACN,GAAG,aAAa,IAAI;AAAA,MACpB,GAAG,aAAa,IAAI;AAAA,IACrB;AAAA,EACD;AACD;AAiBA,eAAsB,uBACrB,iBACA,OACA,QACA,OAAO,CAAC,GACU;AAClB,MAAI,eAAe,QAAQ;AAC3B,MAAI,gBAAgB,SAAS;AAC7B,QAAM,EAAE,OAAO,cAAc,UAAU,KAAK,IAAI;AAEhD,QAAM,cAAc,MAAM,wBAAwB;AAElD,QAAM,cAAc,QAAQ;AAE5B,MAAI,eAAe,YAAY,UAAU;AACxC,mBAAe,YAAY;AAC3B,oBAAgB,eAAe;AAAA,EAChC;AAEA,MAAI,gBAAgB,YAAY,WAAW;AAC1C,oBAAgB,YAAY;AAC5B,mBAAe,gBAAgB;AAAA,EAChC;AAEA,MAAI,eAAe,gBAAgB,YAAY,SAAS;AACvD,UAAM,QAAQ,KAAK,KAAK,YAAY,WAAW,eAAe,cAAc;AAC5E,oBAAgB;AAChB,qBAAiB;AAAA,EAClB;AAEA,SAAO,MAAM,UAAU,iBAAiB,cAAc,eAAe;AAAA;AAAA,IAEpE,WAAW,KAAK,QAAQ,UAAU,EAAE;AAAA,IACpC;AAAA,EACD,CAAC;AACF;AAGO,MAAM,4BAA4B,CAAC,cAAc,aAAa,aAAa,eAAe;AAE1F,MAAM,4BAA4B,CAAC,aAAa,iBAAiB;AAGxE,eAAsB,cAAc,MAA8B;AACjE,SAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7C,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,UAAU,MAAM,OAAO,OAAO,KAAK;AAC1C,WAAO,SAAS,MAAM;AACrB,cAAQ,OAAO,SAAS,WAAW,OAAO,MAAqB,IAAI,KAAK;AAAA,IACzE;AACA,WAAO,kBAAkB,IAAI;AAAA,EAC9B,CAAC;AACF;",
6
6
  "names": ["containBoxSize"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bigbluebutton/tldraw",
3
- "description": "BigBlueButton's fork of tldraw 2.0-alpha.19",
4
- "version": "2.0.0-alpha.19",
3
+ "description": "BigBlueButton's fork of tldraw 2.0-alpha.19 - A tiny little drawing editor.",
4
+ "version": "2.0.0-alpha.21",
5
5
  "packageManager": "yarn@3.5.0",
6
6
  "author": {
7
7
  "name": "tldraw GB Ltd.",
@@ -35,7 +35,7 @@
35
35
  "src"
36
36
  ],
37
37
  "dependencies": {
38
- "@bigbluebutton/editor": "2.0.0-alpha.19",
38
+ "@bigbluebutton/editor": "2.0.0-alpha.20",
39
39
  "@radix-ui/react-alert-dialog": "^1.0.0",
40
40
  "@radix-ui/react-context-menu": "^2.1.5",
41
41
  "@radix-ui/react-dialog": "^1.0.5",
@@ -102,8 +102,8 @@ export class BookmarkShapeUtil extends BaseBoxShapeUtil<TLBookmarkShape> {
102
102
  <rect
103
103
  width={toDomPrecision(shape.props.w)}
104
104
  height={toDomPrecision(shape.props.h)}
105
- rx="8"
106
- ry="8"
105
+ rx="6"
106
+ ry="6"
107
107
  />
108
108
  )
109
109
  }
@@ -62,7 +62,7 @@ describe('Translating', () => {
62
62
  editor.select(id)
63
63
 
64
64
  const shape = editor.getShape<TLLineShape>(id)!
65
- shape.rotation = Math.PI / 2
65
+ editor.updateShape({ ...shape, rotation: Math.PI / 2 })
66
66
 
67
67
  editor.pointerDown(250, 250, { target: 'shape', shape: shape })
68
68
  editor.pointerMove(300, 400) // Move shape by 50, 150
@@ -13,7 +13,9 @@ import {
13
13
  TLPointerEventInfo,
14
14
  TLShape,
15
15
  TLShapeId,
16
+ TLTickEventHandler,
16
17
  Vec2d,
18
+ moveCameraWhenCloseToEdge,
17
19
  pointInPolygon,
18
20
  polygonsIntersect,
19
21
  } from '@bigbluebutton/editor'
@@ -60,6 +62,10 @@ export class Brushing extends StateNode {
60
62
  this.editor.updateInstanceState({ brush: null })
61
63
  }
62
64
 
65
+ override onTick: TLTickEventHandler = () => {
66
+ moveCameraWhenCloseToEdge(this.editor)
67
+ }
68
+
63
69
  override onPointerMove = () => {
64
70
  this.hitTestShapes()
65
71
  }
@@ -57,7 +57,7 @@ export class Idle extends StateNode {
57
57
  // Check to see if we hit any shape under the pointer; if so,
58
58
  // handle this as a pointer down on the shape instead of the canvas
59
59
  const hitShape = getHitShapeOnCanvasPointerDown(this.editor)
60
- if (hitShape) {
60
+ if (hitShape && !hitShape.isLocked) {
61
61
  this.onPointerDown({
62
62
  ...info,
63
63
  shape: hitShape,
@@ -140,7 +140,11 @@ export class Idle extends StateNode {
140
140
  }
141
141
  default: {
142
142
  const hoveredShape = this.editor.getHoveredShape()
143
- if (hoveredShape && !this.editor.getSelectedShapeIds().includes(hoveredShape.id)) {
143
+ if (
144
+ hoveredShape &&
145
+ !this.editor.getSelectedShapeIds().includes(hoveredShape.id) &&
146
+ !hoveredShape.isLocked
147
+ ) {
144
148
  this.onPointerDown({
145
149
  ...info,
146
150
  shape: hoveredShape,
@@ -13,10 +13,12 @@ import {
13
13
  TLShape,
14
14
  TLShapeId,
15
15
  TLShapePartial,
16
+ TLTickEventHandler,
16
17
  Vec2d,
17
18
  VecLike,
18
19
  areAnglesCompatible,
19
20
  compact,
21
+ moveCameraWhenCloseToEdge,
20
22
  } from '@bigbluebutton/editor'
21
23
 
22
24
  type ResizingInfo = TLPointerEventInfo & {
@@ -72,6 +74,10 @@ export class Resizing extends StateNode {
72
74
  this.updateShapes()
73
75
  }
74
76
 
77
+ override onTick: TLTickEventHandler = () => {
78
+ moveCameraWhenCloseToEdge(this.editor)
79
+ }
80
+
75
81
  override onPointerMove: TLEventHandlers['onPointerMove'] = () => {
76
82
  this.updateShapes()
77
83
  }
@@ -10,9 +10,11 @@ import {
10
10
  TLPointerEventInfo,
11
11
  TLShape,
12
12
  TLShapePartial,
13
+ TLTickEventHandler,
13
14
  Vec2d,
14
15
  compact,
15
16
  isPageId,
17
+ moveCameraWhenCloseToEdge,
16
18
  } from '@bigbluebutton/editor'
17
19
  import { DragAndDropManager } from '../DragAndDropManager'
18
20
 
@@ -77,12 +79,10 @@ export class Translating extends StateNode {
77
79
  this.snapshot = this.selectionSnapshot
78
80
  this.handleStart()
79
81
  this.updateShapes()
80
- this.editor.on('tick', this.updateParent)
81
82
  }
82
83
 
83
84
  override onExit = () => {
84
85
  this.parent.setCurrentToolIdMask(undefined)
85
- this.editor.off('tick', this.updateParent)
86
86
  this.selectionSnapshot = {} as any
87
87
  this.snapshot = {} as any
88
88
  this.editor.snaps.clear()
@@ -93,6 +93,14 @@ export class Translating extends StateNode {
93
93
  this.dragAndDropManager.clear()
94
94
  }
95
95
 
96
+ override onTick: TLTickEventHandler = () => {
97
+ this.dragAndDropManager.updateDroppingNode(
98
+ this.snapshot.movingShapes,
99
+ this.updateParentTransforms
100
+ )
101
+ moveCameraWhenCloseToEdge(this.editor)
102
+ }
103
+
96
104
  override onPointerMove = () => {
97
105
  this.updateShapes()
98
106
  }
@@ -153,11 +161,6 @@ export class Translating extends StateNode {
153
161
  this.updateShapes()
154
162
  }
155
163
 
156
- updateParent = () => {
157
- const { snapshot } = this
158
- this.dragAndDropManager.updateDroppingNode(snapshot.movingShapes, this.updateParentTransforms)
159
- }
160
-
161
164
  reset() {
162
165
  this.editor.bailToMark(this.markId)
163
166
  }
@@ -994,6 +994,19 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
994
994
  },
995
995
  checkbox: true,
996
996
  },
997
+ {
998
+ id: 'toggle-edge-scrolling',
999
+ label: 'action.toggle-edge-scrolling',
1000
+ menuLabel: 'action.toggle-edge-scrolling.menu',
1001
+ readonlyOk: true,
1002
+ onSelect(source) {
1003
+ trackEvent('toggle-edge-scrolling', { source })
1004
+ editor.user.updateUserPreferences({
1005
+ edgeScrollSpeed: editor.user.getEdgeScrollSpeed() === 0 ? 1 : 0,
1006
+ })
1007
+ },
1008
+ checkbox: true,
1009
+ },
997
1010
  {
998
1011
  id: 'toggle-transparent',
999
1012
  label: 'action.toggle-transparent',
@@ -81,6 +81,7 @@ export interface TLUiEventMap {
81
81
  'toggle-debug-mode': null
82
82
  'toggle-lock': null
83
83
  'toggle-reduce-motion': null
84
+ 'toggle-edge-scrolling': null
84
85
  'exit-pen-mode': null
85
86
  'stop-following': null
86
87
  'open-cursor-chat': null
@@ -51,6 +51,9 @@ export function TLUiMenuSchemaProvider({ overrides, children }: TLUiMenuSchemaPr
51
51
 
52
52
  const isDarkMode = useValue('isDarkMode', () => editor.user.getIsDarkMode(), [editor])
53
53
  const animationSpeed = useValue('animationSpeed', () => editor.user.getAnimationSpeed(), [editor])
54
+ const edgeScrollSpeed = useValue('edgeScrollSpeed', () => editor.user.getEdgeScrollSpeed(), [
55
+ editor,
56
+ ])
54
57
  const isGridMode = useValue('isGridMode', () => editor.getInstanceState().isGridMode, [editor])
55
58
  const isSnapMode = useValue('isSnapMode', () => editor.user.getIsSnapMode(), [editor])
56
59
  const isToolLock = useValue('isToolLock', () => editor.getInstanceState().isToolLocked, [editor])
@@ -214,6 +217,7 @@ export function TLUiMenuSchemaProvider({ overrides, children }: TLUiMenuSchemaPr
214
217
  menuItem(actions['toggle-grid'], { checked: isGridMode }),
215
218
  menuItem(actions['toggle-dark-mode'], { checked: isDarkMode }),
216
219
  menuItem(actions['toggle-focus-mode'], { checked: isFocusMode }),
220
+ menuItem(actions['toggle-edge-scrolling'], { checked: edgeScrollSpeed === 1 }),
217
221
  menuItem(actions['toggle-reduce-motion'], { checked: animationSpeed === 0 }),
218
222
  menuItem(actions['toggle-debug-mode'], { checked: isDebugMode })
219
223
  )
@@ -258,6 +262,7 @@ export function TLUiMenuSchemaProvider({ overrides, children }: TLUiMenuSchemaPr
258
262
  isFocusMode,
259
263
  exportBackground,
260
264
  isDebugMode,
265
+ edgeScrollSpeed,
261
266
  isZoomedTo100,
262
267
  oneEmbeddableBookmarkSelected,
263
268
  oneEmbedSelected,
@@ -50,6 +50,7 @@ const usePreloadFont = (id: string, font: TLTypeFace): PreloadStatus => {
50
50
  featureSettings,
51
51
  stretch,
52
52
  unicodeRange,
53
+ // @ts-expect-error
53
54
  variant,
54
55
  }
55
56
 
@@ -81,6 +81,8 @@ export type TLUiTranslationKey =
81
81
  | 'action.toggle-dark-mode'
82
82
  | 'action.toggle-reduce-motion.menu'
83
83
  | 'action.toggle-reduce-motion'
84
+ | 'action.toggle-edge-scrolling.menu'
85
+ | 'action.toggle-edge-scrolling'
84
86
  | 'action.toggle-debug-mode.menu'
85
87
  | 'action.toggle-debug-mode'
86
88
  | 'action.toggle-focus-mode.menu'
@@ -81,6 +81,8 @@ export const DEFAULT_TRANSLATION = {
81
81
  'action.toggle-dark-mode': 'Toggle dark mode',
82
82
  'action.toggle-reduce-motion.menu': 'Reduce motion',
83
83
  'action.toggle-reduce-motion': 'Toggle reduce motion',
84
+ 'action.toggle-edge-scrolling.menu': 'Edge scrolling',
85
+ 'action.toggle-edge-scrolling': 'Toggle edge scrolling',
84
86
  'action.toggle-debug-mode.menu': 'Debug mode',
85
87
  'action.toggle-debug-mode': 'Toggle debug mode',
86
88
  'action.toggle-focus-mode.menu': 'Focus mode',
@@ -1 +1 @@
1
- export const version = '2.0.0-alpha.12'
1
+ export const version = '2.0.0-alpha.20'
@@ -82,7 +82,11 @@ export async function getResizedImageDataUrl(
82
82
  desiredHeight *= ratio
83
83
  }
84
84
 
85
- return await downscale(dataURLForImage, desiredWidth, desiredHeight, { imageType: type, quality })
85
+ return await downscale(dataURLForImage, desiredWidth, desiredHeight, {
86
+ // downscale expects the type without the `image/` prefix
87
+ imageType: type.replace('image/', ''),
88
+ quality,
89
+ })
86
90
  }
87
91
 
88
92
  /** @public */
@@ -109,15 +109,18 @@ describe('TLUserPreferences', () => {
109
109
  userPreferences,
110
110
  }),
111
111
  })
112
+ // called once in the constructor of testeditor to set edge scroll speed to 0
113
+ expect(setUserPreferences).toHaveBeenCalledTimes(1)
112
114
 
113
115
  expect(editor.user.getName()).toBe('blah')
114
116
  editor.user.updateUserPreferences({ name: null })
115
117
 
116
118
  expect(editor.user.getName()).toBe('New User')
117
- expect(setUserPreferences).toHaveBeenCalledTimes(1)
119
+ expect(setUserPreferences).toHaveBeenCalledTimes(2)
118
120
  expect(setUserPreferences).toHaveBeenLastCalledWith({
119
121
  id: '123',
120
122
  name: null,
123
+ edgeScrollSpeed: 0,
121
124
  })
122
125
  })
123
126
  })
@@ -109,6 +109,9 @@ export class TestEditor extends Editor {
109
109
  })
110
110
  return [{ box, text: textToMeasure }]
111
111
  }
112
+
113
+ // Turn off edge scrolling for tests. Tests that require this can turn it back on.
114
+ this.user.updateUserPreferences({ edgeScrollSpeed: 0 })
112
115
  }
113
116
 
114
117
  elm: HTMLDivElement
@@ -3899,3 +3899,25 @@ describe('Resizing text from the right edge', () => {
3899
3899
  })
3900
3900
  })
3901
3901
  })
3902
+
3903
+ describe('When resizing near the edges of the screen', () => {
3904
+ it('resizes past the edge of the screen', () => {
3905
+ editor.user.updateUserPreferences({ edgeScrollSpeed: 1 })
3906
+ editor
3907
+ .select(ids.boxA)
3908
+ .pointerDown(10, 10, {
3909
+ type: 'pointer',
3910
+ target: 'selection',
3911
+ handle: 'top_left',
3912
+ })
3913
+ .expectShapeToMatch({ id: ids.boxA, x: 10, y: 10, props: { w: 100, h: 100 } })
3914
+ .pointerMove(10, 25)
3915
+ jest.advanceTimersByTime(1000)
3916
+ editor.expectShapeToMatch({
3917
+ id: ids.boxA,
3918
+ x: -842.5,
3919
+ y: -259.58,
3920
+ props: { w: 952.5, h: 369.58 },
3921
+ })
3922
+ })
3923
+ })
@@ -1708,3 +1708,96 @@ describe('right clicking', () => {
1708
1708
  expect(editor.getSelectedShapeIds()).toEqual([])
1709
1709
  })
1710
1710
  })
1711
+
1712
+ describe('When brushing close to the edges of the screen', () => {
1713
+ it('selects shapes that are outside of the viewport', () => {
1714
+ editor.user.updateUserPreferences({ edgeScrollSpeed: 1 })
1715
+ editor.createShapes([{ id: ids.box1, type: 'geo', x: 100, y: 100, props: { w: 100, h: 100 } }])
1716
+ editor.createShapes([
1717
+ { id: ids.box2, type: 'geo', x: -150, y: -150, props: { w: 100, h: 100 } },
1718
+ ])
1719
+
1720
+ editor.pointerMove(300, 300)
1721
+ editor.pointerDown()
1722
+ editor.pointerMove(50, 50)
1723
+ editor.expectToBeIn('select.brushing')
1724
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box1])
1725
+ editor.pointerMove(0, 0)
1726
+ // still only box 1...
1727
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box1])
1728
+ jest.advanceTimersByTime(100)
1729
+ // ...but now viewport will have moved to select box2 as well
1730
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box1, ids.box2])
1731
+ editor.pointerUp()
1732
+ })
1733
+
1734
+ it('doesnt edge scroll to the other shape', () => {
1735
+ editor.user.updateUserPreferences({ edgeScrollSpeed: 0 }) // <-- no edge scrolling
1736
+ editor.createShapes([{ id: ids.box1, type: 'geo', x: 100, y: 100, props: { w: 100, h: 100 } }])
1737
+ editor.createShapes([
1738
+ { id: ids.box2, type: 'geo', x: -150, y: -150, props: { w: 100, h: 100 } },
1739
+ ])
1740
+
1741
+ editor.pointerMove(300, 300)
1742
+ editor.pointerDown()
1743
+ editor.pointerMove(50, 50)
1744
+ editor.expectToBeIn('select.brushing')
1745
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box1])
1746
+ editor.pointerMove(0, 0)
1747
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box1])
1748
+ jest.advanceTimersByTime(100)
1749
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box1])
1750
+ editor.pointerUp()
1751
+ })
1752
+ })
1753
+
1754
+ describe('When a shape is locked', () => {
1755
+ beforeEach(() => {
1756
+ editor.createShape({
1757
+ id: ids.box1,
1758
+ type: 'geo',
1759
+ x: 0,
1760
+ y: 0,
1761
+ isLocked: true,
1762
+ props: { w: 300, h: 300 },
1763
+ })
1764
+ })
1765
+
1766
+ it('does not select the shape', () => {
1767
+ editor.pointerDown(50, 50)
1768
+ editor.expectToBeIn('select.pointing_canvas')
1769
+ editor.pointerUp()
1770
+ editor.expectToBeIn('select.idle')
1771
+ expect(editor.getSelectedShapeIds()).toEqual([])
1772
+ })
1773
+
1774
+ it('allows translating shapes on top of the locked shape', () => {
1775
+ editor.createShape({ id: ids.box2, x: 50, y: 50, type: 'geo', props: { w: 50, h: 50 } })
1776
+ editor.createShape({ id: ids.box3, x: 200, y: 200, type: 'geo', props: { w: 50, h: 50 } })
1777
+
1778
+ // Select the first shape
1779
+ editor.pointerMove(60, 60)
1780
+ editor.pointerDown()
1781
+ editor.pointerUp()
1782
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box2])
1783
+
1784
+ // Shift select the second shape
1785
+ editor.pointerMove(210, 210)
1786
+ editor.keyDown('Shift')
1787
+ editor.pointerDown()
1788
+ editor.pointerUp()
1789
+ editor.keyUp('Shift')
1790
+ editor.expectToBeIn('select.idle')
1791
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box2, ids.box3])
1792
+
1793
+ // Click between them and start dragging
1794
+ editor.pointerMove(150, 150)
1795
+ editor.pointerDown()
1796
+ editor.expectToBeIn('select.pointing_selection')
1797
+ editor.pointerMove(100, 150)
1798
+ editor.expectToBeIn('select.translating')
1799
+ editor.pointerUp()
1800
+ editor.expectToBeIn('select.idle')
1801
+ expect(editor.getSelectedShapeIds()).toEqual([ids.box2, ids.box3])
1802
+ })
1803
+ })