@sequent-org/moodboard 1.2.119 → 1.3.1

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 +6 -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 -1773
  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 -999
  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 +82 -1181
  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 +665 -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
@@ -0,0 +1,186 @@
1
+ import { Events } from '../../core/events/Events.js';
2
+
3
+ export class ToolbarDialogsController {
4
+ constructor(toolbar) {
5
+ this.toolbar = toolbar;
6
+ }
7
+
8
+ /**
9
+ * Открывает диалог выбора файла и запускает режим "призрака"
10
+ */
11
+ async openFileDialog() {
12
+ const input = document.createElement('input');
13
+ input.type = 'file';
14
+ input.accept = '*/*'; // Принимаем любые файлы
15
+ input.style.display = 'none';
16
+ document.body.appendChild(input);
17
+
18
+ input.addEventListener('change', async () => {
19
+ try {
20
+ const file = input.files && input.files[0];
21
+ if (!file) {
22
+ // Пользователь отменил выбор файла
23
+ this.toolbar.eventBus.emit(Events.Place.FileCanceled);
24
+ return;
25
+ }
26
+
27
+ // Файл выбран - запускаем режим "призрака"
28
+ this.toolbar.eventBus.emit(Events.Place.FileSelected, {
29
+ file: file,
30
+ fileName: file.name,
31
+ fileSize: file.size,
32
+ mimeType: file.type,
33
+ properties: {
34
+ width: 120,
35
+ height: 140
36
+ }
37
+ });
38
+
39
+ // Активируем инструмент размещения
40
+ this.toolbar.eventBus.emit(Events.Keyboard.ToolSelect, { tool: 'place' });
41
+ this.toolbar.placeSelectedButtonId = 'attachments';
42
+ this.toolbar.setActiveToolbarButton('place');
43
+
44
+ } catch (error) {
45
+ console.error('Ошибка при выборе файла:', error);
46
+ alert('Ошибка при выборе файла: ' + error.message);
47
+ } finally {
48
+ input.remove();
49
+ }
50
+ }, { once: true });
51
+
52
+ // Обработка отмены диалога (клик вне диалога или ESC)
53
+ const handleCancel = () => {
54
+ setTimeout(() => {
55
+ if (input.files.length === 0) {
56
+ this.toolbar.eventBus.emit(Events.Place.FileCanceled);
57
+ input.remove();
58
+ }
59
+ window.removeEventListener('focus', handleCancel);
60
+ }, 100);
61
+ };
62
+
63
+ window.addEventListener('focus', handleCancel, { once: true });
64
+ input.click();
65
+ }
66
+
67
+ /**
68
+ * Открывает диалог выбора изображения и запускает режим "призрака"
69
+ */
70
+ async openImageDialog() {
71
+ const input = document.createElement('input');
72
+ input.type = 'file';
73
+ input.accept = 'image/*'; // Принимаем только изображения
74
+ input.style.display = 'none';
75
+ document.body.appendChild(input);
76
+
77
+ input.addEventListener('change', async () => {
78
+ try {
79
+ const file = input.files && input.files[0];
80
+ if (!file) {
81
+ // Пользователь отменил выбор изображения
82
+ this.toolbar.eventBus.emit(Events.Place.ImageCanceled);
83
+ return;
84
+ }
85
+
86
+ // Изображение выбрано - запускаем режим "призрака"
87
+ this.toolbar.eventBus.emit(Events.Place.ImageSelected, {
88
+ file: file,
89
+ fileName: file.name,
90
+ fileSize: file.size,
91
+ mimeType: file.type,
92
+ properties: {
93
+ width: 300, // Дефолтная ширина для изображения
94
+ height: 200 // Дефолтная высота для изображения (будет пересчитана по пропорциям)
95
+ }
96
+ });
97
+
98
+ // Активируем инструмент размещения
99
+ this.toolbar.eventBus.emit(Events.Keyboard.ToolSelect, { tool: 'place' });
100
+ this.toolbar.placeSelectedButtonId = 'image';
101
+ this.toolbar.setActiveToolbarButton('place');
102
+
103
+ } catch (error) {
104
+ console.error('Ошибка при выборе изображения:', error);
105
+ alert('Ошибка при выборе изображения: ' + error.message);
106
+ } finally {
107
+ input.remove();
108
+ }
109
+ }, { once: true });
110
+
111
+ // Обработка отмены диалога (клик вне диалога или ESC)
112
+ const handleCancel = () => {
113
+ setTimeout(() => {
114
+ if (input.files.length === 0) {
115
+ this.toolbar.eventBus.emit(Events.Place.ImageCanceled);
116
+ input.remove();
117
+ }
118
+ window.removeEventListener('focus', handleCancel);
119
+ }, 100);
120
+ };
121
+
122
+ window.addEventListener('focus', handleCancel, { once: true });
123
+ input.click();
124
+ }
125
+
126
+ /**
127
+ * Открывает диалог выбора изображения для ImageObject2 (новая изолированная цепочка)
128
+ */
129
+ async openImageObject2Dialog() {
130
+ const picker = document.createElement('input');
131
+ picker.type = 'file';
132
+ picker.accept = 'image/*';
133
+ picker.style.position = 'fixed';
134
+ picker.style.left = '-10000px';
135
+ picker.style.top = '-10000px';
136
+ document.body.appendChild(picker);
137
+
138
+ const cleanupPicker = () => {
139
+ if (picker.parentNode) {
140
+ picker.parentNode.removeChild(picker);
141
+ }
142
+ };
143
+
144
+ const emitCancel = () => {
145
+ this.toolbar.eventBus.emit(Events.Place.ImageObject2Canceled, {
146
+ source: 'toolbar:image2'
147
+ });
148
+ };
149
+
150
+ picker.addEventListener('change', () => {
151
+ const chosen = picker.files && picker.files[0];
152
+ if (!chosen) {
153
+ emitCancel();
154
+ cleanupPicker();
155
+ return;
156
+ }
157
+
158
+ this.toolbar.eventBus.emit(Events.Place.ImageObject2Selected, {
159
+ file: chosen,
160
+ fileName: chosen.name,
161
+ fileSize: chosen.size,
162
+ mimeType: chosen.type,
163
+ source: 'toolbar:image2',
164
+ defaults: {
165
+ width: 320,
166
+ height: 220
167
+ }
168
+ });
169
+
170
+ cleanupPicker();
171
+ }, { once: true });
172
+
173
+ const onWindowFocus = () => {
174
+ setTimeout(() => {
175
+ const hasChosenFile = !!(picker.files && picker.files.length > 0);
176
+ if (!hasChosenFile) {
177
+ emitCancel();
178
+ cleanupPicker();
179
+ }
180
+ }, 120);
181
+ };
182
+
183
+ window.addEventListener('focus', onWindowFocus, { once: true });
184
+ picker.click();
185
+ }
186
+ }