@sequent-org/moodboard 1.2.118 → 1.3.0

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 (122) hide show
  1. package/package.json +11 -1
  2. package/src/assets/icons/rotate-icon.svg +1 -1
  3. package/src/core/HistoryManager.js +16 -16
  4. package/src/core/KeyboardManager.js +48 -539
  5. package/src/core/PixiEngine.js +9 -9
  6. package/src/core/SaveManager.js +56 -31
  7. package/src/core/bootstrap/CoreInitializer.js +65 -0
  8. package/src/core/commands/DeleteObjectCommand.js +8 -0
  9. package/src/core/commands/GroupDeleteCommand.js +75 -0
  10. package/src/core/commands/GroupRotateCommand.js +6 -0
  11. package/src/core/commands/UpdateContentCommand.js +52 -0
  12. package/src/core/commands/UpdateFramePropertiesCommand.js +98 -0
  13. package/src/core/commands/UpdateFrameTypeCommand.js +85 -0
  14. package/src/core/commands/UpdateNoteStyleCommand.js +88 -0
  15. package/src/core/commands/UpdateTextStyleCommand.js +90 -0
  16. package/src/core/commands/index.js +6 -0
  17. package/src/core/events/Events.js +7 -0
  18. package/src/core/flows/ClipboardFlow.js +553 -0
  19. package/src/core/flows/LayerAndViewportFlow.js +283 -0
  20. package/src/core/flows/ObjectLifecycleFlow.js +336 -0
  21. package/src/core/flows/SaveFlow.js +34 -0
  22. package/src/core/flows/TransformFlow.js +277 -0
  23. package/src/core/flows/TransformFlowResizeHelpers.js +83 -0
  24. package/src/core/index.js +41 -1765
  25. package/src/core/keyboard/KeyboardClipboardImagePaste.js +190 -0
  26. package/src/core/keyboard/KeyboardContextGuards.js +35 -0
  27. package/src/core/keyboard/KeyboardEventRouter.js +92 -0
  28. package/src/core/keyboard/KeyboardSelectionActions.js +103 -0
  29. package/src/core/keyboard/KeyboardShortcutMap.js +31 -0
  30. package/src/core/keyboard/KeyboardToolSwitching.js +26 -0
  31. package/src/core/rendering/ObjectRenderer.js +3 -7
  32. package/src/grid/BaseGrid.js +26 -0
  33. package/src/grid/CrossGrid.js +7 -6
  34. package/src/grid/DotGrid.js +89 -33
  35. package/src/grid/DotGridZoomPhases.js +42 -0
  36. package/src/grid/LineGrid.js +22 -21
  37. package/src/moodboard/MoodBoard.js +31 -532
  38. package/src/moodboard/bootstrap/MoodBoardInitializer.js +47 -0
  39. package/src/moodboard/bootstrap/MoodBoardManagersFactory.js +38 -0
  40. package/src/moodboard/bootstrap/MoodBoardUiFactory.js +109 -0
  41. package/src/moodboard/integration/MoodBoardEventBindings.js +65 -0
  42. package/src/moodboard/integration/MoodBoardLoadApi.js +82 -0
  43. package/src/moodboard/integration/MoodBoardScreenshotApi.js +33 -0
  44. package/src/moodboard/integration/MoodBoardScreenshotCanvas.js +98 -0
  45. package/src/moodboard/lifecycle/MoodBoardDestroyer.js +97 -0
  46. package/src/objects/FileObject.js +17 -6
  47. package/src/objects/FrameObject.js +50 -10
  48. package/src/objects/NoteObject.js +5 -4
  49. package/src/services/BoardService.js +42 -2
  50. package/src/services/FrameService.js +83 -42
  51. package/src/services/ResizePolicyService.js +152 -0
  52. package/src/services/SettingsApplier.js +7 -2
  53. package/src/services/ZoomPanController.js +35 -9
  54. package/src/tools/ToolManager.js +30 -537
  55. package/src/tools/board-tools/PanTool.js +5 -11
  56. package/src/tools/manager/ToolActivationController.js +49 -0
  57. package/src/tools/manager/ToolEventRouter.js +396 -0
  58. package/src/tools/manager/ToolManagerGuards.js +33 -0
  59. package/src/tools/manager/ToolManagerLifecycle.js +110 -0
  60. package/src/tools/manager/ToolRegistry.js +33 -0
  61. package/src/tools/object-tools/DrawingTool.js +48 -14
  62. package/src/tools/object-tools/PlacementTool.js +50 -1049
  63. package/src/tools/object-tools/PlacementToolV2.js +88 -0
  64. package/src/tools/object-tools/SelectTool.js +174 -2681
  65. package/src/tools/object-tools/placement/GhostController.js +504 -0
  66. package/src/tools/object-tools/placement/PlacementCoordinateResolver.js +20 -0
  67. package/src/tools/object-tools/placement/PlacementEventsBridge.js +91 -0
  68. package/src/tools/object-tools/placement/PlacementInputRouter.js +267 -0
  69. package/src/tools/object-tools/placement/PlacementPayloadFactory.js +111 -0
  70. package/src/tools/object-tools/placement/PlacementSessionStore.js +18 -0
  71. package/src/tools/object-tools/selection/BoxSelectController.js +0 -5
  72. package/src/tools/object-tools/selection/CloneFlowController.js +71 -0
  73. package/src/tools/object-tools/selection/CoordinateMapper.js +10 -0
  74. package/src/tools/object-tools/selection/CursorController.js +78 -0
  75. package/src/tools/object-tools/selection/FileNameInlineEditorController.js +184 -0
  76. package/src/tools/object-tools/selection/HitTestService.js +102 -0
  77. package/src/tools/object-tools/selection/InlineEditorController.js +24 -0
  78. package/src/tools/object-tools/selection/InlineEditorDomFactory.js +50 -0
  79. package/src/tools/object-tools/selection/InlineEditorListenersRegistry.js +14 -0
  80. package/src/tools/object-tools/selection/InlineEditorPositioningService.js +25 -0
  81. package/src/tools/object-tools/selection/NoteInlineEditorController.js +113 -0
  82. package/src/tools/object-tools/selection/SelectInputRouter.js +267 -0
  83. package/src/tools/object-tools/selection/SelectToolLifecycleController.js +128 -0
  84. package/src/tools/object-tools/selection/SelectToolSetup.js +134 -0
  85. package/src/tools/object-tools/selection/SelectionOverlayService.js +81 -0
  86. package/src/tools/object-tools/selection/SelectionStateController.js +91 -0
  87. package/src/tools/object-tools/selection/TextEditorDomFactory.js +65 -0
  88. package/src/tools/object-tools/selection/TextEditorInteractionController.js +266 -0
  89. package/src/tools/object-tools/selection/TextEditorLifecycleRegistry.js +90 -0
  90. package/src/tools/object-tools/selection/TextEditorPositioningService.js +158 -0
  91. package/src/tools/object-tools/selection/TextEditorSyncService.js +110 -0
  92. package/src/tools/object-tools/selection/TextInlineEditorController.js +457 -0
  93. package/src/tools/object-tools/selection/TransformInteractionController.js +466 -0
  94. package/src/ui/FilePropertiesPanel.js +61 -32
  95. package/src/ui/FramePropertiesPanel.js +176 -101
  96. package/src/ui/HtmlHandlesLayer.js +121 -976
  97. package/src/ui/MapPanel.js +12 -7
  98. package/src/ui/NotePropertiesPanel.js +17 -2
  99. package/src/ui/TextPropertiesPanel.js +124 -738
  100. package/src/ui/Toolbar.js +71 -1180
  101. package/src/ui/Topbar.js +23 -25
  102. package/src/ui/ZoomPanel.js +16 -5
  103. package/src/ui/handles/GroupSelectionHandlesController.js +29 -0
  104. package/src/ui/handles/HandlesDomRenderer.js +278 -0
  105. package/src/ui/handles/HandlesEventBridge.js +102 -0
  106. package/src/ui/handles/HandlesInteractionController.js +772 -0
  107. package/src/ui/handles/HandlesPositioningService.js +206 -0
  108. package/src/ui/handles/SingleSelectionHandlesController.js +22 -0
  109. package/src/ui/styles/toolbar.css +2 -0
  110. package/src/ui/styles/workspace.css +13 -6
  111. package/src/ui/text-properties/TextPropertiesPanelBindings.js +92 -0
  112. package/src/ui/text-properties/TextPropertiesPanelEventBridge.js +77 -0
  113. package/src/ui/text-properties/TextPropertiesPanelMapper.js +173 -0
  114. package/src/ui/text-properties/TextPropertiesPanelRenderer.js +434 -0
  115. package/src/ui/text-properties/TextPropertiesPanelState.js +39 -0
  116. package/src/ui/toolbar/ToolbarActionRouter.js +193 -0
  117. package/src/ui/toolbar/ToolbarDialogsController.js +186 -0
  118. package/src/ui/toolbar/ToolbarPopupsController.js +662 -0
  119. package/src/ui/toolbar/ToolbarRenderer.js +97 -0
  120. package/src/ui/toolbar/ToolbarStateController.js +79 -0
  121. package/src/ui/toolbar/ToolbarTooltipController.js +52 -0
  122. package/src/utils/emojiLoaderNoBundler.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sequent-org/moodboard",
3
- "version": "1.2.118",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "description": "Interactive moodboard",
6
6
  "main": "./src/index.js",
@@ -21,8 +21,16 @@
21
21
  "test": "vitest",
22
22
  "test:ui": "vitest --ui",
23
23
  "test:run": "vitest run",
24
+ "test:placement:baseline": "vitest run tests/tools/PlacementTool.baseline.core-flow.test.js tests/tools/PlacementTool.baseline.ghost.test.js tests/tools/PlacementTool.baseline.events-contracts.test.js tests/tools/PlacementTool.baseline.file-image-paths.test.js",
25
+ "test:core:index": "vitest run tests/core/CoreIndex.baseline.object-lifecycle.test.js tests/core/CoreIndex.baseline.transforms.test.js tests/core/CoreIndex.baseline.clipboard.test.js tests/core/CoreIndex.baseline.events-contracts.test.js",
26
+ "test:toolbar:baseline": "vitest run tests/ui/Toolbar.baseline.render.test.js tests/ui/Toolbar.baseline.actions.test.js tests/ui/Toolbar.baseline.popups.test.js tests/ui/Toolbar.baseline.dialogs.test.js tests/ui/Toolbar.baseline.events-contracts.test.js",
27
+ "test:html-handles:baseline": "vitest run tests/ui/HtmlHandlesLayer.baseline.single-selection.test.js tests/ui/HtmlHandlesLayer.baseline.group-selection.test.js tests/ui/HtmlHandlesLayer.baseline.transforms.test.js tests/ui/HtmlHandlesLayer.baseline.events-contracts.test.js tests/ui/HtmlHandlesLayer.baseline.lifecycle.test.js",
28
+ "test:text-properties-panel:baseline": "vitest run tests/ui/TextPropertiesPanel.baseline.render.test.js tests/ui/TextPropertiesPanel.baseline.interactions.test.js tests/ui/TextPropertiesPanel.baseline.events-contracts.test.js tests/ui/TextPropertiesPanel.baseline.lifecycle.test.js",
24
29
  "test:coverage": "vitest run --coverage",
25
30
  "test:watch": "vitest --watch",
31
+ "test:e2e": "playwright test",
32
+ "grid:our-metrics": "node scripts/export-our-dot-grid-metrics.mjs",
33
+ "grid:miro-metrics": "node scripts/analyze-miro-dot-screenshots.mjs",
26
34
  "deploy:build": "npm run build && npm run start",
27
35
  "deploy:prod": "NODE_ENV=production npm run build && NODE_ENV=production npm run start"
28
36
  },
@@ -31,11 +39,13 @@
31
39
  "pixi.js": "^7.0.0"
32
40
  },
33
41
  "devDependencies": {
42
+ "@playwright/test": "^1.58.2",
34
43
  "@testing-library/dom": "^10.4.1",
35
44
  "@testing-library/jest-dom": "^6.7.0",
36
45
  "@vitest/ui": "^3.2.4",
37
46
  "eslint": "^9.0.0",
38
47
  "jsdom": "^26.1.0",
48
+ "pngjs": "^7.0.0",
39
49
  "vite": "^5.0.0",
40
50
  "vitest": "^3.2.4"
41
51
  },
@@ -1,3 +1,3 @@
1
1
  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path fill-rule="evenodd" clip-rule="evenodd" d="M11.5057 3.29438C10.7728 2.40348 9.79221 1.74987 8.68786 1.41619C7.58351 1.08251 6.405 1.08374 5.30135 1.41974C4.1977 1.75574 3.21848 2.41142 2.4875 3.30385C1.75652 4.19629 1.30661 5.28541 1.19467 6.4335C1.18724 6.50979 1.16485 6.58387 1.12879 6.65151C1.09272 6.71915 1.04369 6.77902 0.984485 6.82771C0.92528 6.8764 0.857063 6.91296 0.78373 6.93529C0.710396 6.95762 0.633381 6.96529 0.557083 6.95786C0.480785 6.95043 0.406698 6.92804 0.339051 6.89198C0.271405 6.85593 0.211524 6.8069 0.162827 6.7477C0.11413 6.6885 0.0775723 6.62029 0.0552394 6.54697C0.0329064 6.47364 0.0252359 6.39664 0.0326665 6.32035C0.172736 4.88154 0.754936 3.52139 1.69928 2.42676C2.64363 1.33213 3.90379 0.556733 5.30665 0.207084C6.70951 -0.142566 8.18623 -0.0493089 9.53394 0.474043C10.8816 0.997396 12.0342 1.92517 12.8333 3.12989V0.583365C12.8333 0.428674 12.8948 0.280319 13.0042 0.170936C13.1136 0.0615523 13.262 0.000101367 13.4167 0.000101367C13.5714 0.000101367 13.7197 0.0615523 13.8291 0.170936C13.9385 0.280319 14 0.428674 14 0.583365V4.08295C14 4.23764 13.9385 4.386 13.8291 4.49538C13.7197 4.60476 13.5714 4.66621 13.4167 4.66621H9.91667C9.76196 4.66621 9.61358 4.60476 9.50419 4.49538C9.39479 4.386 9.33333 4.23764 9.33333 4.08295C9.33333 3.92826 9.39479 3.7799 9.50419 3.67052C9.61358 3.56114 9.76196 3.49968 9.91667 3.49968H11.6667C11.6145 3.43006 11.5609 3.3616 11.5057 3.29438ZM13.4423 7.04126C13.5186 7.04857 13.5928 7.07085 13.6605 7.10682C13.7282 7.14279 13.7881 7.19176 13.8369 7.25091C13.8856 7.31007 13.9223 7.37825 13.9446 7.45157C13.967 7.52488 13.9747 7.60189 13.9673 7.67819C13.8273 9.117 13.2451 10.4771 12.3007 11.5718C11.3564 12.6664 10.0962 13.4418 8.69335 13.7915C7.29049 14.1411 5.81377 14.0478 4.46606 13.5245C3.11835 13.0011 1.96577 12.0734 1.16667 10.8686V13.4152C1.16667 13.5699 1.10521 13.7182 0.995812 13.8276C0.886416 13.937 0.738043 13.9984 0.583333 13.9984C0.428624 13.9984 0.280251 13.937 0.170854 13.8276C0.0614583 13.7182 0 13.5699 0 13.4152V9.91559C0 9.7609 0.0614583 9.61254 0.170854 9.50316C0.280251 9.39377 0.428624 9.33232 0.583333 9.33232H4.08333C4.23804 9.33232 4.38642 9.39377 4.49581 9.50316C4.60521 9.61254 4.66667 9.7609 4.66667 9.91559C4.66667 10.0703 4.60521 10.2186 4.49581 10.328C4.38642 10.4374 4.23804 10.4989 4.08333 10.4989H2.33333C2.38544 10.5688 2.43911 10.6373 2.49433 10.7042C3.22711 11.595 4.20762 12.2486 5.31187 12.5824C6.41613 12.9161 7.59456 12.915 8.69817 12.5791C9.80178 12.2432 10.781 11.5877 11.5121 10.6954C12.2431 9.80317 12.6932 8.7142 12.8053 7.5662C12.8126 7.48979 12.835 7.41556 12.871 7.34779C12.9071 7.28002 12.9561 7.22003 13.0154 7.17126C13.0747 7.12249 13.143 7.0859 13.2165 7.0636C13.29 7.04129 13.3671 7.0337 13.4435 7.04126" fill="#09E9B6"/>
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M11.5057 3.29438C10.7728 2.40348 9.79221 1.74987 8.68786 1.41619C7.58351 1.08251 6.405 1.08374 5.30135 1.41974C4.1977 1.75574 3.21848 2.41142 2.4875 3.30385C1.75652 4.19629 1.30661 5.28541 1.19467 6.4335C1.18724 6.50979 1.16485 6.58387 1.12879 6.65151C1.09272 6.71915 1.04369 6.77902 0.984485 6.82771C0.92528 6.8764 0.857063 6.91296 0.78373 6.93529C0.710396 6.95762 0.633381 6.96529 0.557083 6.95786C0.480785 6.95043 0.406698 6.92804 0.339051 6.89198C0.271405 6.85593 0.211524 6.8069 0.162827 6.7477C0.11413 6.6885 0.0775723 6.62029 0.0552394 6.54697C0.0329064 6.47364 0.0252359 6.39664 0.0326665 6.32035C0.172736 4.88154 0.754936 3.52139 1.69928 2.42676C2.64363 1.33213 3.90379 0.556733 5.30665 0.207084C6.70951 -0.142566 8.18623 -0.0493089 9.53394 0.474043C10.8816 0.997396 12.0342 1.92517 12.8333 3.12989V0.583365C12.8333 0.428674 12.8948 0.280319 13.0042 0.170936C13.1136 0.0615523 13.262 0.000101367 13.4167 0.000101367C13.5714 0.000101367 13.7197 0.0615523 13.8291 0.170936C13.9385 0.280319 14 0.428674 14 0.583365V4.08295C14 4.23764 13.9385 4.386 13.8291 4.49538C13.7197 4.60476 13.5714 4.66621 13.4167 4.66621H9.91667C9.76196 4.66621 9.61358 4.60476 9.50419 4.49538C9.39479 4.386 9.33333 4.23764 9.33333 4.08295C9.33333 3.92826 9.39479 3.7799 9.50419 3.67052C9.61358 3.56114 9.76196 3.49968 9.91667 3.49968H11.6667C11.6145 3.43006 11.5609 3.3616 11.5057 3.29438ZM13.4423 7.04126C13.5186 7.04857 13.5928 7.07085 13.6605 7.10682C13.7282 7.14279 13.7881 7.19176 13.8369 7.25091C13.8856 7.31007 13.9223 7.37825 13.9446 7.45157C13.967 7.52488 13.9747 7.60189 13.9673 7.67819C13.8273 9.117 13.2451 10.4771 12.3007 11.5718C11.3564 12.6664 10.0962 13.4418 8.69335 13.7915C7.29049 14.1411 5.81377 14.0478 4.46606 13.5245C3.11835 13.0011 1.96577 12.0734 1.16667 10.8686V13.4152C1.16667 13.5699 1.10521 13.7182 0.995812 13.8276C0.886416 13.937 0.738043 13.9984 0.583333 13.9984C0.428624 13.9984 0.280251 13.937 0.170854 13.8276C0.0614583 13.7182 0 13.5699 0 13.4152V9.91559C0 9.7609 0.0614583 9.61254 0.170854 9.50316C0.280251 9.39377 0.428624 9.33232 0.583333 9.33232H4.08333C4.23804 9.33232 4.38642 9.39377 4.49581 9.50316C4.60521 9.61254 4.66667 9.7609 4.66667 9.91559C4.66667 10.0703 4.60521 10.2186 4.49581 10.328C4.38642 10.4374 4.23804 10.4989 4.08333 10.4989H2.33333C2.38544 10.5688 2.43911 10.6373 2.49433 10.7042C3.22711 11.595 4.20762 12.2486 5.31187 12.5824C6.41613 12.9161 7.59456 12.915 8.69817 12.5791C9.80178 12.2432 10.781 11.5877 11.5121 10.6954C12.2431 9.80317 12.6932 8.7142 12.8053 7.5662C12.8126 7.48979 12.835 7.41556 12.871 7.34779C12.9071 7.28002 12.9561 7.22003 13.0154 7.17126C13.0747 7.12249 13.143 7.0859 13.2165 7.0636C13.29 7.04129 13.3671 7.0337 13.4435 7.04126" fill="#80D8FF"/>
3
3
  </svg>
@@ -17,24 +17,23 @@ export class HistoryManager {
17
17
  this.currentIndex = -1;
18
18
  // Флаг для предотвращения зацикливания при undo/redo
19
19
  this.isExecutingCommand = false;
20
+ this._listenersAttached = false;
21
+ this._onUndo = () => this.undo();
22
+ this._onRedo = () => this.redo();
23
+ this._onDebug = () => this.debugHistory();
20
24
 
21
25
  this.initEventListeners();
22
26
  }
23
27
 
24
28
  initEventListeners() {
29
+ if (this._listenersAttached) return;
30
+ this._listenersAttached = true;
25
31
  // Слушаем события клавиатуры
26
- this.eventBus.on(Events.Keyboard.Undo, () => {
27
- this.undo();
28
- });
29
-
30
- this.eventBus.on(Events.Keyboard.Redo, () => {
31
- this.redo();
32
- });
32
+ this.eventBus.on(Events.Keyboard.Undo, this._onUndo);
33
+ this.eventBus.on(Events.Keyboard.Redo, this._onRedo);
33
34
 
34
35
  // Для отладки
35
- this.eventBus.on(Events.History.Debug, () => {
36
- this.debugHistory();
37
- });
36
+ this.eventBus.on(Events.History.Debug, this._onDebug);
38
37
  }
39
38
 
40
39
  /**
@@ -51,12 +50,12 @@ export class HistoryManager {
51
50
 
52
51
  // Проверяем, можно ли объединить с последней командой
53
52
  const lastCommand = this.getLastCommand();
54
- if (lastCommand &&
55
- lastCommand.canMergeWith(command) &&
53
+ if (lastCommand &&
54
+ lastCommand.canMergeWith(command) &&
56
55
  (command.timestamp - lastCommand.timestamp) < this.options.mergeTimeout) {
57
-
58
56
 
59
57
  lastCommand.mergeWith(command);
58
+ this._executeCommandSafely(lastCommand);
60
59
  this.eventBus.emit('history:changed', {
61
60
  canUndo: this.canUndo(),
62
61
  canRedo: this.canRedo(),
@@ -254,8 +253,9 @@ export class HistoryManager {
254
253
  */
255
254
  destroy() {
256
255
  this.clear();
257
- this.eventBus.removeAllListeners(Events.Keyboard.Undo);
258
- this.eventBus.removeAllListeners(Events.Keyboard.Redo);
259
- this.eventBus.removeAllListeners(Events.History.Debug);
256
+ this.eventBus.off(Events.Keyboard.Undo, this._onUndo);
257
+ this.eventBus.off(Events.Keyboard.Redo, this._onRedo);
258
+ this.eventBus.off(Events.History.Debug, this._onDebug);
259
+ this._listenersAttached = false;
260
260
  }
261
261
  }