@sequent-org/moodboard 1.2.2 → 1.2.3
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.
- package/package.json +1 -1
- package/src/core/PixiEngine.js +0 -2
- package/src/core/commands/DeleteObjectCommand.js +0 -37
- package/src/core/commands/EditFileNameCommand.js +0 -1
- package/src/core/commands/ResizeObjectCommand.js +0 -12
- package/src/core/commands/RotateObjectCommand.js +0 -1
- package/src/core/index.js +0 -6
- package/src/initNoBundler.js +0 -2
- package/src/moodboard/MoodBoard.js +0 -4
- package/src/tools/AlignmentGuides.js +0 -3
- package/src/tools/ResizeHandles.js +0 -1
- package/src/tools/object-tools/PlacementTool.js +1 -20
- package/src/tools/object-tools/SelectTool.js +0 -19
- package/src/ui/FilePropertiesPanel.js +0 -3
- package/src/ui/FramePropertiesPanel.js +0 -12
- package/src/ui/HtmlHandlesLayer.js +0 -1
- package/src/ui/NotePropertiesPanel.js +0 -5
- package/src/ui/TextPropertiesPanel.js +0 -4
- package/src/ui/Toolbar.js +2 -14
- package/src/ui/Topbar.js +0 -15
- package/src/utils/emojiResolver.js +0 -2
- package/src/utils/styleLoader.js +0 -3
package/package.json
CHANGED
package/src/core/PixiEngine.js
CHANGED
|
@@ -189,7 +189,6 @@ export class PixiEngine {
|
|
|
189
189
|
// Сохраняем позицию (центр) на случай, если инстанс пересоздаст геометрию
|
|
190
190
|
const position = { x: pixiObject.x, y: pixiObject.y };
|
|
191
191
|
|
|
192
|
-
console.log(`🎨 Обновляем размер объекта ${objectId}, тип: ${objectType}`);
|
|
193
192
|
|
|
194
193
|
// Для Graphics объектов (рамки, фигуры) нужно пересоздать геометрию
|
|
195
194
|
// Делегируем изменение размера объекту, если есть инстанс с updateSize
|
|
@@ -209,7 +208,6 @@ export class PixiEngine {
|
|
|
209
208
|
// Очищаем графику
|
|
210
209
|
pixiObject.clear();
|
|
211
210
|
|
|
212
|
-
console.log(`🔄 Пересоздаем Graphics объект, тип: ${objectType}`);
|
|
213
211
|
|
|
214
212
|
// Определяем что рисовать по типу объекта
|
|
215
213
|
if (objectType === 'drawing') {
|
|
@@ -23,14 +23,6 @@ export class DeleteObjectCommand extends BaseCommand {
|
|
|
23
23
|
|
|
24
24
|
// Для изображений убедимся, что есть src URL для восстановления
|
|
25
25
|
if (this.objectData.type === 'image') {
|
|
26
|
-
console.log('🔧 DEBUG DeleteObjectCommand: исходные данные изображения:', {
|
|
27
|
-
id: this.objectData.id,
|
|
28
|
-
imageId: this.objectData.imageId,
|
|
29
|
-
src: this.objectData.src,
|
|
30
|
-
propertiesSrc: this.objectData.properties?.src,
|
|
31
|
-
hasBase64Src: !!(this.objectData.src && this.objectData.src.startsWith('data:')),
|
|
32
|
-
hasBase64Props: !!(this.objectData.properties?.src && this.objectData.properties.src.startsWith('data:'))
|
|
33
|
-
});
|
|
34
26
|
|
|
35
27
|
if (this.objectData.imageId) {
|
|
36
28
|
const imageUrl = `/api/images/${this.objectData.imageId}/file`;
|
|
@@ -44,29 +36,16 @@ export class DeleteObjectCommand extends BaseCommand {
|
|
|
44
36
|
}
|
|
45
37
|
this.objectData.properties.src = imageUrl;
|
|
46
38
|
|
|
47
|
-
console.log('🔧 DEBUG DeleteObjectCommand: обновленные данные изображения:', {
|
|
48
|
-
id: this.objectData.id,
|
|
49
|
-
imageId: this.objectData.imageId,
|
|
50
|
-
src: this.objectData.src,
|
|
51
|
-
propertiesSrc: this.objectData.properties?.src
|
|
52
|
-
});
|
|
53
39
|
} else {
|
|
54
|
-
console.warn('🔧 DEBUG DeleteObjectCommand: у изображения нет imageId, оставляем как есть');
|
|
55
40
|
}
|
|
56
41
|
}
|
|
57
42
|
|
|
58
43
|
// Для файлов сохраняем информацию для возможной очистки с сервера
|
|
59
44
|
if (this.objectData.type === 'file') {
|
|
60
|
-
console.log('🔧 DEBUG DeleteObjectCommand: исходные данные файла:', {
|
|
61
|
-
id: this.objectData.id,
|
|
62
|
-
fileId: this.objectData.fileId,
|
|
63
|
-
fileName: this.objectData.properties?.fileName
|
|
64
|
-
});
|
|
65
45
|
|
|
66
46
|
if (this.objectData.fileId) {
|
|
67
47
|
// Сохраняем fileId для удаления с сервера
|
|
68
48
|
this.fileIdToDelete = this.objectData.fileId;
|
|
69
|
-
console.log('🔧 DEBUG DeleteObjectCommand: файл будет удален с сервера:', this.fileIdToDelete);
|
|
70
49
|
}
|
|
71
50
|
}
|
|
72
51
|
|
|
@@ -97,25 +76,9 @@ export class DeleteObjectCommand extends BaseCommand {
|
|
|
97
76
|
}
|
|
98
77
|
|
|
99
78
|
undo() {
|
|
100
|
-
// DEBUG: Логируем состояние объекта при Undo
|
|
101
|
-
if (this.objectData.type === 'image') {
|
|
102
|
-
console.log('🔄 DEBUG Undo изображения:', {
|
|
103
|
-
id: this.objectData.id,
|
|
104
|
-
imageId: this.objectData.imageId,
|
|
105
|
-
src: this.objectData.src,
|
|
106
|
-
propertiesSrc: this.objectData.properties?.src,
|
|
107
|
-
hasBase64Src: !!(this.objectData.src && this.objectData.src.startsWith('data:')),
|
|
108
|
-
hasBase64Props: !!(this.objectData.properties?.src && this.objectData.properties.src.startsWith('data:'))
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
79
|
|
|
112
80
|
// Специальная обработка для файловых объектов
|
|
113
81
|
if (this.objectData.type === 'file' && this.fileIdToDelete) {
|
|
114
|
-
console.log('🔄 DEBUG Undo файла:', {
|
|
115
|
-
id: this.objectData.id,
|
|
116
|
-
fileId: this.objectData.fileId,
|
|
117
|
-
fileName: this.objectData.properties?.fileName
|
|
118
|
-
});
|
|
119
82
|
|
|
120
83
|
// Файл был удален с сервера, создаем объект с предупреждением
|
|
121
84
|
const restoredObjectData = { ...this.objectData };
|
|
@@ -68,7 +68,6 @@ export class EditFileNameCommand extends BaseCommand {
|
|
|
68
68
|
// Синхронизируем с сервером, если есть fileId
|
|
69
69
|
if (objectData.fileId && this.coreMoodboard.fileUploadService) {
|
|
70
70
|
try {
|
|
71
|
-
console.log('🔄 Синхронизируем название файла с сервером:', { fileId: objectData.fileId, fileName });
|
|
72
71
|
await this.coreMoodboard.fileUploadService.updateFileMetadata(objectData.fileId, {
|
|
73
72
|
fileName: fileName
|
|
74
73
|
});
|
|
@@ -38,10 +38,6 @@ export class ResizeObjectCommand extends BaseCommand {
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
// Отладка ресайза
|
|
42
|
-
if (position && object) {
|
|
43
|
-
console.log(`🔧 Ресайз объекта ${this.objectId}: newSize(${size.width}, ${size.height}), newPosition(${position.x}, ${position.y})`);
|
|
44
|
-
}
|
|
45
41
|
|
|
46
42
|
// Обновляем размер в PIXI с указанием типа
|
|
47
43
|
this.coreMoodboard.pixi.updateObjectSize(this.objectId, size, objectType);
|
|
@@ -57,14 +53,7 @@ export class ResizeObjectCommand extends BaseCommand {
|
|
|
57
53
|
pixiObject.y = position.y + halfH;
|
|
58
54
|
object.position.x = position.x;
|
|
59
55
|
object.position.y = position.y;
|
|
60
|
-
console.log(`🎯 После ресайза: center(${pixiObject.x}, ${pixiObject.y}), leftTop(${position.x}, ${position.y})`);
|
|
61
56
|
|
|
62
|
-
// Проверим, где находятся границы объекта
|
|
63
|
-
const leftEdge = pixiObject.x - size.width / 2;
|
|
64
|
-
const rightEdge = pixiObject.x + size.width / 2;
|
|
65
|
-
const topEdge = pixiObject.y - size.height / 2;
|
|
66
|
-
const bottomEdge = pixiObject.y + size.height / 2;
|
|
67
|
-
console.log(`📏 Границы объекта: left=${leftEdge}, right=${rightEdge}, top=${topEdge}, bottom=${bottomEdge}`);
|
|
68
57
|
|
|
69
58
|
}
|
|
70
59
|
}
|
|
@@ -103,7 +92,6 @@ export class ResizeObjectCommand extends BaseCommand {
|
|
|
103
92
|
|
|
104
93
|
// Если этот объект выделен, обновляем ручки
|
|
105
94
|
if (activeTool.selectedObjects && activeTool.selectedObjects.has(this.objectId)) {
|
|
106
|
-
console.log(`🔄 Обновляем ручки для объекта ${this.objectId} после Undo/Redo`);
|
|
107
95
|
activeTool.updateResizeHandles();
|
|
108
96
|
}
|
|
109
97
|
}
|
package/src/core/index.js
CHANGED
|
@@ -1402,7 +1402,6 @@ export class CoreMoodBoard {
|
|
|
1402
1402
|
this.eventBus.on(Events.Object.TransformUpdated, (data) => {
|
|
1403
1403
|
// Обновляем ручки если объект выделен
|
|
1404
1404
|
if (this.selectTool && this.selectTool.selection && this.selectTool.selection.has(data.objectId)) {
|
|
1405
|
-
console.log(`🔄 Core: Объект ${data.objectId} изменен через команду, обновляем ручки SelectTool`);
|
|
1406
1405
|
this.selectTool.updateResizeHandles();
|
|
1407
1406
|
}
|
|
1408
1407
|
});
|
|
@@ -1567,7 +1566,6 @@ export class CoreMoodBoard {
|
|
|
1567
1566
|
|
|
1568
1567
|
// Сохраняем изменения
|
|
1569
1568
|
this.state.markDirty();
|
|
1570
|
-
console.log(`✅ Состояние объекта ${objectId} обновлено`);
|
|
1571
1569
|
} else {
|
|
1572
1570
|
console.warn(`❌ Объект ${objectId} не найден в состоянии`);
|
|
1573
1571
|
}
|
|
@@ -1590,7 +1588,6 @@ export class CoreMoodBoard {
|
|
|
1590
1588
|
this.eventBus.on('file:metadata:updated', (data) => {
|
|
1591
1589
|
const { objectId, fileId, metadata } = data;
|
|
1592
1590
|
if (objectId && metadata) {
|
|
1593
|
-
console.log(`🔄 Обновляем метаданные файла ${objectId} с сервера:`, metadata);
|
|
1594
1591
|
|
|
1595
1592
|
// Обновляем объект в состоянии
|
|
1596
1593
|
const objects = this.state.getObjects();
|
|
@@ -1619,7 +1616,6 @@ export class CoreMoodBoard {
|
|
|
1619
1616
|
|
|
1620
1617
|
// Обновляем состояние
|
|
1621
1618
|
this.state.markDirty();
|
|
1622
|
-
console.log(`✅ Метаданные файла ${objectId} синхронизированы с сервером`);
|
|
1623
1619
|
}
|
|
1624
1620
|
}
|
|
1625
1621
|
}
|
|
@@ -1848,7 +1844,6 @@ export class CoreMoodBoard {
|
|
|
1848
1844
|
try {
|
|
1849
1845
|
const result = await this.cleanupUnusedImages();
|
|
1850
1846
|
if (result.deletedCount > 0) {
|
|
1851
|
-
console.log(`✅ Автоматически очищено ${result.deletedCount} неиспользуемых изображений`);
|
|
1852
1847
|
}
|
|
1853
1848
|
} catch (error) {
|
|
1854
1849
|
// Не прерываем выполнение при ошибке cleanup
|
|
@@ -1923,7 +1918,6 @@ export class CoreMoodBoard {
|
|
|
1923
1918
|
if (object) {
|
|
1924
1919
|
object.rotation = angle;
|
|
1925
1920
|
this.state.markDirty();
|
|
1926
|
-
console.log(`🔄 Угол объекта ${objectId} обновлен: ${angle}°`);
|
|
1927
1921
|
}
|
|
1928
1922
|
}
|
|
1929
1923
|
|
package/src/initNoBundler.js
CHANGED
|
@@ -13,7 +13,6 @@ import { EmojiLoaderNoBundler } from './utils/emojiLoaderNoBundler.js';
|
|
|
13
13
|
* @returns {Promise<MoodBoard>} готовый экземпляр MoodBoard
|
|
14
14
|
*/
|
|
15
15
|
export async function initMoodBoardNoBundler(container, options = {}, basePath = '') {
|
|
16
|
-
console.log('🚀 Инициализация MoodBoard без bundler...');
|
|
17
16
|
|
|
18
17
|
// 1. Загружаем стили
|
|
19
18
|
const styleLoader = new StyleLoader();
|
|
@@ -38,7 +37,6 @@ export async function initMoodBoardNoBundler(container, options = {}, basePath =
|
|
|
38
37
|
// 5. Создаем MoodBoard
|
|
39
38
|
const moodboard = new MoodBoard(container, enhancedOptions);
|
|
40
39
|
|
|
41
|
-
console.log('✅ MoodBoard инициализирован без bundler');
|
|
42
40
|
|
|
43
41
|
return moodboard;
|
|
44
42
|
}
|
|
@@ -124,7 +124,6 @@ export class MoodBoard {
|
|
|
124
124
|
// Загружаем данные (сначала пробуем загрузить с сервера, потом дефолтные)
|
|
125
125
|
await this.loadExistingBoard();
|
|
126
126
|
|
|
127
|
-
console.log('MoodBoard initialized');
|
|
128
127
|
} catch (error) {
|
|
129
128
|
console.error('MoodBoard init failed:', error);
|
|
130
129
|
throw error;
|
|
@@ -353,8 +352,6 @@ export class MoodBoard {
|
|
|
353
352
|
|
|
354
353
|
} catch (error) {
|
|
355
354
|
console.warn('⚠️ Ошибка загрузки доски, создаем новую:', error.message);
|
|
356
|
-
console.debug('ApiClient доступен:', !!this.coreMoodboard.apiClient);
|
|
357
|
-
console.debug('Метод restoreObjectUrls доступен:', !!(this.coreMoodboard.apiClient && typeof this.coreMoodboard.apiClient.restoreObjectUrls === 'function'));
|
|
358
355
|
// Если загрузка не удалась, используем дефолтные данные
|
|
359
356
|
this.dataManager.loadData(this.data);
|
|
360
357
|
}
|
|
@@ -438,6 +435,5 @@ export class MoodBoard {
|
|
|
438
435
|
// Очищаем ссылку на контейнер
|
|
439
436
|
this.container = null;
|
|
440
437
|
|
|
441
|
-
console.log('MoodBoard успешно уничтожен');
|
|
442
438
|
}
|
|
443
439
|
}
|
|
@@ -36,13 +36,11 @@ export class AlignmentGuides {
|
|
|
36
36
|
|
|
37
37
|
this._attachEvents();
|
|
38
38
|
|
|
39
|
-
console.log('AlignmentGuides: Инициализированы направляющие линии выравнивания');
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
_attachEvents() {
|
|
43
42
|
// Одиночное перетаскивание
|
|
44
43
|
this.eventBus.on(Events.Tool.DragStart, (data) => {
|
|
45
|
-
console.log('AlignmentGuides: Начало перетаскивания объекта:', data.object);
|
|
46
44
|
this.isDragging = true;
|
|
47
45
|
this.currentDragObject = data.object;
|
|
48
46
|
this.currentDragObjects = [];
|
|
@@ -122,7 +120,6 @@ export class AlignmentGuides {
|
|
|
122
120
|
|
|
123
121
|
// Отображаем найденные направляющие
|
|
124
122
|
if (guides.length > 0) {
|
|
125
|
-
console.log('AlignmentGuides: Найдено направляющих:', guides.length);
|
|
126
123
|
this._showGuides(guides);
|
|
127
124
|
}
|
|
128
125
|
}
|
|
@@ -96,7 +96,6 @@ export class ResizeHandles {
|
|
|
96
96
|
this.container.y = objectCenterY;
|
|
97
97
|
this.container.pivot.set(objectPivotX, objectPivotY);
|
|
98
98
|
|
|
99
|
-
console.log(`🔄 Поворот ручек: ${(this.targetObject.rotation * 180 / Math.PI).toFixed(1)}°, центр: (${objectCenterX}, ${objectCenterY}), pivot: (${objectPivotX}, ${objectPivotY})`);
|
|
100
99
|
|
|
101
100
|
// Используем локальные границы для создания ручек
|
|
102
101
|
this.workingBounds = {
|
|
@@ -103,15 +103,12 @@ export class PlacementTool extends BaseTool {
|
|
|
103
103
|
|
|
104
104
|
// Обработка выбора файла
|
|
105
105
|
this.eventBus.on(Events.Place.FileSelected, (fileData) => {
|
|
106
|
-
console.log('📁 PlacementTool: получен FileSelected:', fileData);
|
|
107
106
|
this.selectedFile = fileData;
|
|
108
107
|
this.selectedImage = null;
|
|
109
108
|
|
|
110
109
|
// Если PlacementTool уже активен - показываем призрак сразу
|
|
111
110
|
if (this.world) {
|
|
112
111
|
this.showFileGhost();
|
|
113
|
-
} else {
|
|
114
|
-
console.log('📁 PlacementTool: world не готов, призрак будет показан при активации');
|
|
115
112
|
}
|
|
116
113
|
});
|
|
117
114
|
|
|
@@ -554,16 +551,7 @@ export class PlacementTool extends BaseTool {
|
|
|
554
551
|
* Показать "призрак" файла
|
|
555
552
|
*/
|
|
556
553
|
showFileGhost() {
|
|
557
|
-
|
|
558
|
-
hasSelectedFile: !!this.selectedFile,
|
|
559
|
-
hasWorld: !!this.world,
|
|
560
|
-
selectedFileData: this.selectedFile
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
if (!this.selectedFile || !this.world) {
|
|
564
|
-
console.warn('⚠️ Не можем показать призрак файла - нет selectedFile или world');
|
|
565
|
-
return;
|
|
566
|
-
}
|
|
554
|
+
if (!this.selectedFile || !this.world) return;
|
|
567
555
|
|
|
568
556
|
this.hideGhost(); // Сначала убираем старый призрак
|
|
569
557
|
|
|
@@ -639,13 +627,6 @@ export class PlacementTool extends BaseTool {
|
|
|
639
627
|
this.ghostContainer.pivot.y = height / 2;
|
|
640
628
|
|
|
641
629
|
this.world.addChild(this.ghostContainer);
|
|
642
|
-
|
|
643
|
-
console.log('📁 Призрак файла создан и добавлен в world:', {
|
|
644
|
-
ghostContainerSize: { w: width, h: height },
|
|
645
|
-
ghostContainerAlpha: this.ghostContainer.alpha,
|
|
646
|
-
worldHasContainer: this.world.children.includes(this.ghostContainer),
|
|
647
|
-
ghostContainerChildren: this.ghostContainer.children.length
|
|
648
|
-
});
|
|
649
630
|
}
|
|
650
631
|
|
|
651
632
|
/**
|
|
@@ -136,7 +136,6 @@ export class SelectTool extends BaseTool {
|
|
|
136
136
|
this.eventBus.on(Events.Object.Deleted, (data) => {
|
|
137
137
|
const objectId = data?.objectId || data;
|
|
138
138
|
if (objectId && this.selection.has(objectId)) {
|
|
139
|
-
console.log(`🗑️ SelectTool: Объект ${objectId} удален, убираем из выделения`);
|
|
140
139
|
this.removeFromSelection(objectId);
|
|
141
140
|
|
|
142
141
|
// Если выделение стало пустым, скрываем ручки
|
|
@@ -164,7 +163,6 @@ export class SelectTool extends BaseTool {
|
|
|
164
163
|
*/
|
|
165
164
|
activate(app) {
|
|
166
165
|
super.activate();
|
|
167
|
-
console.log('🔧 SelectTool активирован, app:', !!app);
|
|
168
166
|
// Сохраняем ссылку на PIXI app для оверлеев (рамка выделения)
|
|
169
167
|
this.app = app;
|
|
170
168
|
|
|
@@ -224,7 +222,6 @@ export class SelectTool extends BaseTool {
|
|
|
224
222
|
} else if (!app) {
|
|
225
223
|
console.log('❌ PIXI app не передан в activate');
|
|
226
224
|
} else {
|
|
227
|
-
console.log('ℹ️ ResizeHandles уже созданы');
|
|
228
225
|
}
|
|
229
226
|
}
|
|
230
227
|
|
|
@@ -272,7 +269,6 @@ export class SelectTool extends BaseTool {
|
|
|
272
269
|
|
|
273
270
|
// Если активен текстовый редактор, закрываем его при клике вне
|
|
274
271
|
if (this.textEditor.active) {
|
|
275
|
-
console.log('🔧 SelectTool: closing text editor on mouse down, objectType:', this.textEditor.objectType, 'objectId:', this.textEditor.objectId);
|
|
276
272
|
if (this.textEditor.objectType === 'file') {
|
|
277
273
|
this._closeFileNameEditor(true);
|
|
278
274
|
} else {
|
|
@@ -529,7 +525,6 @@ export class SelectTool extends BaseTool {
|
|
|
529
525
|
onKeyDown(event) {
|
|
530
526
|
// Проверяем, не активен ли текстовый редактор (редактирование названия файла или текста)
|
|
531
527
|
if (this.textEditor && this.textEditor.active) {
|
|
532
|
-
console.log('🔒 SelectTool: Текстовый редактор активен, пропускаем обработку клавиш');
|
|
533
528
|
return; // Не обрабатываем клавиши во время редактирования
|
|
534
529
|
}
|
|
535
530
|
|
|
@@ -793,7 +788,6 @@ export class SelectTool extends BaseTool {
|
|
|
793
788
|
* Начало изменения размера
|
|
794
789
|
*/
|
|
795
790
|
startResize(handle, objectId) {
|
|
796
|
-
console.log(`🔧 Начинаем resize: ручка ${handle}, объект ${objectId}`);
|
|
797
791
|
// Групповой resize
|
|
798
792
|
if (objectId === this.groupId && this.selection.size() > 1) {
|
|
799
793
|
this.isGroupResizing = true;
|
|
@@ -1263,7 +1257,6 @@ export class SelectTool extends BaseTool {
|
|
|
1263
1257
|
*/
|
|
1264
1258
|
|
|
1265
1259
|
addToSelection(object) {
|
|
1266
|
-
console.log(`➕ Добавляем в выделение: ${object}`);
|
|
1267
1260
|
this.selection.add(object);
|
|
1268
1261
|
this.emit(Events.Tool.SelectionAdd, { object });
|
|
1269
1262
|
this.updateResizeHandles();
|
|
@@ -2061,13 +2054,11 @@ export class SelectTool extends BaseTool {
|
|
|
2061
2054
|
// Завершение
|
|
2062
2055
|
const isNewCreation = !!create;
|
|
2063
2056
|
const finalize = (commit) => {
|
|
2064
|
-
console.log('🔧 SelectTool: finalize called with commit:', commit, 'objectId:', objectId, 'objectType:', this.textEditor.objectType);
|
|
2065
2057
|
const value = textarea.value.trim();
|
|
2066
2058
|
const commitValue = commit && value.length > 0;
|
|
2067
2059
|
|
|
2068
2060
|
// Сохраняем objectType ДО сброса this.textEditor
|
|
2069
2061
|
const currentObjectType = this.textEditor.objectType;
|
|
2070
|
-
console.log('🔧 SelectTool: finalize - saved objectType:', currentObjectType);
|
|
2071
2062
|
|
|
2072
2063
|
// Показываем статичный текст только если не отменяем создание нового пустого
|
|
2073
2064
|
if (objectId && (commitValue || !isNewCreation)) {
|
|
@@ -2140,11 +2131,9 @@ export class SelectTool extends BaseTool {
|
|
|
2140
2131
|
if (isNewCreation && objectId) {
|
|
2141
2132
|
this.eventBus.emit(Events.Tool.ObjectsDelete, { objects: [objectId] });
|
|
2142
2133
|
}
|
|
2143
|
-
console.log('🔧 SelectTool: finalize - no commit, returning');
|
|
2144
2134
|
return;
|
|
2145
2135
|
}
|
|
2146
2136
|
if (objectId == null) {
|
|
2147
|
-
console.log('🔧 SelectTool: finalize - creating new object');
|
|
2148
2137
|
// Создаем объект с правильным типом
|
|
2149
2138
|
const objectType = currentObjectType || 'text';
|
|
2150
2139
|
// Конвертируем размеры редактора (px) в мировые единицы
|
|
@@ -2163,7 +2152,6 @@ export class SelectTool extends BaseTool {
|
|
|
2163
2152
|
} else {
|
|
2164
2153
|
// Обновление существующего: используем команду обновления содержимого
|
|
2165
2154
|
if (currentObjectType === 'note') {
|
|
2166
|
-
console.log('🔧 SelectTool: updating note content via UpdateObjectContent');
|
|
2167
2155
|
// Для записок обновляем содержимое через PixiEngine
|
|
2168
2156
|
this.eventBus.emit(Events.Tool.UpdateObjectContent, {
|
|
2169
2157
|
objectId: objectId,
|
|
@@ -2179,7 +2167,6 @@ export class SelectTool extends BaseTool {
|
|
|
2179
2167
|
});
|
|
2180
2168
|
} else {
|
|
2181
2169
|
// Для обычного текста тоже используем обновление содержимого
|
|
2182
|
-
console.log('🔧 SelectTool: finalize - updating text content via UpdateObjectContent');
|
|
2183
2170
|
this.eventBus.emit(Events.Tool.UpdateObjectContent, {
|
|
2184
2171
|
objectId: objectId,
|
|
2185
2172
|
content: value
|
|
@@ -2429,7 +2416,6 @@ export class SelectTool extends BaseTool {
|
|
|
2429
2416
|
* Закрывает редактор названия файла
|
|
2430
2417
|
*/
|
|
2431
2418
|
_closeFileNameEditor(commit) {
|
|
2432
|
-
console.log('🔧 SelectTool: _closeFileNameEditor called with commit:', commit);
|
|
2433
2419
|
|
|
2434
2420
|
// Проверяем, что редактор существует и не закрыт
|
|
2435
2421
|
if (!this.textEditor || !this.textEditor.textarea || this.textEditor.closing) {
|
|
@@ -2444,7 +2430,6 @@ export class SelectTool extends BaseTool {
|
|
|
2444
2430
|
const commitValue = commit && value.length > 0;
|
|
2445
2431
|
const objectId = this.textEditor.objectId;
|
|
2446
2432
|
|
|
2447
|
-
console.log('🔧 SelectTool: _closeFileNameEditor - objectId:', objectId, 'commitValue:', commitValue, 'newName:', value);
|
|
2448
2433
|
|
|
2449
2434
|
// Убираем wrapper из DOM
|
|
2450
2435
|
if (this.textEditor.wrapper && this.textEditor.wrapper.parentNode) {
|
|
@@ -2464,7 +2449,6 @@ export class SelectTool extends BaseTool {
|
|
|
2464
2449
|
|
|
2465
2450
|
// Применяем изменения если нужно
|
|
2466
2451
|
if (commitValue && value !== this.textEditor.properties.fileName) {
|
|
2467
|
-
console.log('🔧 Применяем новое название файла:', value);
|
|
2468
2452
|
|
|
2469
2453
|
// Создаем команду изменения названия файла
|
|
2470
2454
|
const oldName = this.textEditor.properties.fileName || 'Untitled';
|
|
@@ -2492,7 +2476,6 @@ export class SelectTool extends BaseTool {
|
|
|
2492
2476
|
}
|
|
2493
2477
|
|
|
2494
2478
|
_closeTextEditor(commit) {
|
|
2495
|
-
console.log('🔧 SelectTool: _closeTextEditor called with commit:', commit);
|
|
2496
2479
|
const textarea = this.textEditor.textarea;
|
|
2497
2480
|
if (!textarea) return;
|
|
2498
2481
|
const value = textarea.value.trim();
|
|
@@ -2502,7 +2485,6 @@ export class SelectTool extends BaseTool {
|
|
|
2502
2485
|
const position = this.textEditor.position;
|
|
2503
2486
|
const properties = this.textEditor.properties;
|
|
2504
2487
|
|
|
2505
|
-
console.log('🔧 SelectTool: _closeTextEditor - objectType:', objectType, 'objectId:', objectId, 'commitValue:', commitValue);
|
|
2506
2488
|
|
|
2507
2489
|
// Показываем статичный текст после завершения редактирования для всех типов объектов
|
|
2508
2490
|
if (objectId) {
|
|
@@ -2524,7 +2506,6 @@ export class SelectTool extends BaseTool {
|
|
|
2524
2506
|
if (!commitValue) return;
|
|
2525
2507
|
if (objectId == null) {
|
|
2526
2508
|
// Создаём новый объект через ToolbarAction
|
|
2527
|
-
console.log('🔧 SelectTool: creating new object via ToolbarAction, type:', objectType);
|
|
2528
2509
|
this.eventBus.emit(Events.UI.ToolbarAction, {
|
|
2529
2510
|
type: objectType,
|
|
2530
2511
|
id: objectType,
|
|
@@ -74,7 +74,6 @@ export class FilePropertiesPanel {
|
|
|
74
74
|
const pixi = this.core?.pixi?.objects?.get ? this.core.pixi.objects.get(id) : null;
|
|
75
75
|
const isFile = !!(pixi && pixi._mb && pixi._mb.type === 'file');
|
|
76
76
|
|
|
77
|
-
console.log('📎 FilePropertiesPanel: updateFromSelection - id=', id, 'isFile=', isFile);
|
|
78
77
|
|
|
79
78
|
if (isFile) {
|
|
80
79
|
this.showFor(id);
|
|
@@ -84,7 +83,6 @@ export class FilePropertiesPanel {
|
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
showFor(objectId) {
|
|
87
|
-
console.log('📎 FilePropertiesPanel: Showing panel for objectId:', objectId);
|
|
88
86
|
this.currentId = objectId;
|
|
89
87
|
if (this.panel) {
|
|
90
88
|
this.panel.style.display = 'flex';
|
|
@@ -223,7 +221,6 @@ export class FilePropertiesPanel {
|
|
|
223
221
|
|
|
224
222
|
// Скачиваем файл
|
|
225
223
|
await this.core.fileUploadService.downloadFile(fileId, fileName);
|
|
226
|
-
console.log('✅ Файл скачан:', fileName);
|
|
227
224
|
|
|
228
225
|
// Восстанавливаем кнопку
|
|
229
226
|
setTimeout(() => {
|
|
@@ -73,7 +73,6 @@ export class FramePropertiesPanel {
|
|
|
73
73
|
const pixi = this.core?.pixi?.objects?.get ? this.core.pixi.objects.get(id) : null;
|
|
74
74
|
const isFrame = !!(pixi && pixi._mb && pixi._mb.type === 'frame');
|
|
75
75
|
|
|
76
|
-
console.log('🖼️ FramePropertiesPanel: updateFromSelection - id=', id, 'isFrame=', isFrame);
|
|
77
76
|
|
|
78
77
|
if (isFrame) {
|
|
79
78
|
this.showFor(id);
|
|
@@ -83,7 +82,6 @@ export class FramePropertiesPanel {
|
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
showFor(objectId) {
|
|
86
|
-
console.log('🖼️ FramePropertiesPanel: Showing panel for objectId:', objectId);
|
|
87
85
|
this.currentId = objectId;
|
|
88
86
|
if (this.panel) {
|
|
89
87
|
this.panel.style.display = 'flex';
|
|
@@ -164,18 +162,10 @@ export class FramePropertiesPanel {
|
|
|
164
162
|
panelY = y + height + 40;
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
console.log('🖼️ FramePropertiesPanel: Positioning above frame:', {
|
|
168
|
-
frameX: x, frameY: y, frameWidth: width, frameHeight: height,
|
|
169
|
-
panelX, panelY
|
|
170
|
-
});
|
|
171
165
|
|
|
172
166
|
this.panel.style.left = `${Math.round(panelX)}px`;
|
|
173
167
|
this.panel.style.top = `${Math.round(panelY)}px`;
|
|
174
168
|
|
|
175
|
-
console.log('🖼️ FramePropertiesPanel: Panel CSS applied:', {
|
|
176
|
-
left: this.panel.style.left,
|
|
177
|
-
top: this.panel.style.top
|
|
178
|
-
});
|
|
179
169
|
}
|
|
180
170
|
|
|
181
171
|
_createFrameControls(panel) {
|
|
@@ -302,7 +292,6 @@ export class FramePropertiesPanel {
|
|
|
302
292
|
_changeFrameTitle(newTitle) {
|
|
303
293
|
if (!this.currentId) return;
|
|
304
294
|
|
|
305
|
-
console.log('🖼️ FramePropertiesPanel: Changing frame title to:', newTitle);
|
|
306
295
|
|
|
307
296
|
// Обновляем свойства объекта
|
|
308
297
|
this.eventBus.emit(Events.Object.StateChanged, {
|
|
@@ -455,7 +444,6 @@ export class FramePropertiesPanel {
|
|
|
455
444
|
_selectColor(color) {
|
|
456
445
|
if (!this.currentId) return;
|
|
457
446
|
|
|
458
|
-
console.log('🖼️ FramePropertiesPanel: Selecting color:', color);
|
|
459
447
|
|
|
460
448
|
// Обновляем визуальное отображение кнопки
|
|
461
449
|
this.colorButton.style.backgroundColor = color.hex;
|
|
@@ -61,7 +61,6 @@ export class HtmlHandlesLayer {
|
|
|
61
61
|
if (this.core?.selectTool && data.objectId) {
|
|
62
62
|
const isSelected = this.core.selectTool.selectedObjects.has(data.objectId);
|
|
63
63
|
if (isSelected) {
|
|
64
|
-
console.log(`🔄 HtmlHandlesLayer: Объект ${data.objectId} изменен через команду, обновляем рамку`);
|
|
65
64
|
this.update();
|
|
66
65
|
}
|
|
67
66
|
}
|
|
@@ -73,7 +73,6 @@ export class NotePropertiesPanel {
|
|
|
73
73
|
const pixi = this.core?.pixi?.objects?.get ? this.core.pixi.objects.get(id) : null;
|
|
74
74
|
const isNote = !!(pixi && pixi._mb && pixi._mb.type === 'note');
|
|
75
75
|
|
|
76
|
-
console.log('📝 NotePropertiesPanel: updateFromSelection - id=', id, 'isNote=', isNote);
|
|
77
76
|
|
|
78
77
|
if (isNote) {
|
|
79
78
|
this.showFor(id);
|
|
@@ -83,7 +82,6 @@ export class NotePropertiesPanel {
|
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
showFor(objectId) {
|
|
86
|
-
console.log('📝 NotePropertiesPanel: Showing panel for objectId:', objectId);
|
|
87
85
|
this.currentId = objectId;
|
|
88
86
|
if (this.panel) {
|
|
89
87
|
this.panel.style.display = 'flex';
|
|
@@ -471,7 +469,6 @@ export class NotePropertiesPanel {
|
|
|
471
469
|
_selectColor(color, propertyName) {
|
|
472
470
|
if (!this.currentId) return;
|
|
473
471
|
|
|
474
|
-
console.log(`📝 NotePropertiesPanel: Selecting ${propertyName}:`, color);
|
|
475
472
|
|
|
476
473
|
// Обновляем соответствующую кнопку
|
|
477
474
|
if (propertyName === 'backgroundColor' && this.backgroundColorButton) {
|
|
@@ -497,7 +494,6 @@ export class NotePropertiesPanel {
|
|
|
497
494
|
_changeFontSize(fontSize) {
|
|
498
495
|
if (!this.currentId) return;
|
|
499
496
|
|
|
500
|
-
console.log('📝 NotePropertiesPanel: Changing font size to:', fontSize);
|
|
501
497
|
|
|
502
498
|
// Отправляем событие изменения размера шрифта
|
|
503
499
|
this.eventBus.emit(Events.Object.StateChanged, {
|
|
@@ -509,7 +505,6 @@ export class NotePropertiesPanel {
|
|
|
509
505
|
_changeFontFamily(fontFamily) {
|
|
510
506
|
if (!this.currentId) return;
|
|
511
507
|
|
|
512
|
-
console.log('📝 NotePropertiesPanel: Changing font family to:', fontFamily);
|
|
513
508
|
|
|
514
509
|
this.eventBus.emit(Events.Object.StateChanged, {
|
|
515
510
|
objectId: this.currentId,
|
|
@@ -681,7 +681,6 @@ export class TextPropertiesPanel {
|
|
|
681
681
|
_changeFontFamily(fontFamily) {
|
|
682
682
|
if (!this.currentId) return;
|
|
683
683
|
|
|
684
|
-
console.log('🔧 TextPropertiesPanel: Changing font family to:', fontFamily);
|
|
685
684
|
|
|
686
685
|
// Обновляем свойства объекта через StateManager (в properties)
|
|
687
686
|
this.eventBus.emit(Events.Object.StateChanged, {
|
|
@@ -698,7 +697,6 @@ export class TextPropertiesPanel {
|
|
|
698
697
|
_changeFontSize(fontSize) {
|
|
699
698
|
if (!this.currentId) return;
|
|
700
699
|
|
|
701
|
-
console.log('🔧 TextPropertiesPanel: Changing font size to:', fontSize);
|
|
702
700
|
|
|
703
701
|
// Обновляем свойства объекта через StateManager
|
|
704
702
|
this.eventBus.emit(Events.Object.StateChanged, {
|
|
@@ -715,7 +713,6 @@ export class TextPropertiesPanel {
|
|
|
715
713
|
_changeTextColor(color) {
|
|
716
714
|
if (!this.currentId) return;
|
|
717
715
|
|
|
718
|
-
console.log('🔧 TextPropertiesPanel: Changing text color to:', color);
|
|
719
716
|
|
|
720
717
|
// Обновляем свойства объекта через StateManager
|
|
721
718
|
this.eventBus.emit(Events.Object.StateChanged, {
|
|
@@ -732,7 +729,6 @@ export class TextPropertiesPanel {
|
|
|
732
729
|
_changeBackgroundColor(backgroundColor) {
|
|
733
730
|
if (!this.currentId) return;
|
|
734
731
|
|
|
735
|
-
console.log('🔧 TextPropertiesPanel: Changing background color to:', backgroundColor);
|
|
736
732
|
|
|
737
733
|
// Обновляем свойства объекта через StateManager
|
|
738
734
|
this.eventBus.emit(Events.Object.StateChanged, {
|
package/src/ui/Toolbar.js
CHANGED
|
@@ -578,11 +578,9 @@ export class Toolbar {
|
|
|
578
578
|
setActiveToolbarButton(toolName) {
|
|
579
579
|
if (!this.element) return;
|
|
580
580
|
|
|
581
|
-
console.log('🎯 Toolbar: Установка активной кнопки для инструмента:', toolName, 'placeSelectedButtonId:', this.placeSelectedButtonId);
|
|
582
581
|
|
|
583
582
|
// Сбрасываем активные классы
|
|
584
583
|
this.element.querySelectorAll('.moodboard-toolbar__button--active').forEach(el => {
|
|
585
|
-
console.log('🔄 Deactivating button:', el.dataset.toolId);
|
|
586
584
|
el.classList.remove('moodboard-toolbar__button--active');
|
|
587
585
|
});
|
|
588
586
|
|
|
@@ -614,16 +612,13 @@ export class Toolbar {
|
|
|
614
612
|
}
|
|
615
613
|
|
|
616
614
|
if (!btnId) {
|
|
617
|
-
console.warn('⚠️ Toolbar: Не найден btnId для инструмента:', toolName);
|
|
618
615
|
return;
|
|
619
616
|
}
|
|
620
617
|
|
|
621
618
|
const btn = this.element.querySelector(`.moodboard-toolbar__button--${btnId}`);
|
|
622
619
|
if (btn) {
|
|
623
620
|
btn.classList.add('moodboard-toolbar__button--active');
|
|
624
|
-
console.log('✅ Toolbar: Активирована кнопка:', btnId);
|
|
625
621
|
} else {
|
|
626
|
-
console.warn('⚠️ Toolbar: Не найдена кнопка с селектором:', `.moodboard-toolbar__button--${btnId}`);
|
|
627
622
|
}
|
|
628
623
|
}
|
|
629
624
|
|
|
@@ -933,7 +928,6 @@ export class Toolbar {
|
|
|
933
928
|
});
|
|
934
929
|
} else {
|
|
935
930
|
// Режим без bundler - используем статичный список
|
|
936
|
-
console.log('🎭 Toolbar: Режим без bundler, используем статичные эмоджи');
|
|
937
931
|
groups = this.getFallbackEmojiGroups();
|
|
938
932
|
}
|
|
939
933
|
|
|
@@ -1242,7 +1236,7 @@ export class Toolbar {
|
|
|
1242
1236
|
}
|
|
1243
1237
|
|
|
1244
1238
|
// Файл выбран - запускаем режим "призрака"
|
|
1245
|
-
|
|
1239
|
+
this.eventBus.emit(Events.Place.FileSelected, {
|
|
1246
1240
|
file: file,
|
|
1247
1241
|
fileName: file.name,
|
|
1248
1242
|
fileSize: file.size,
|
|
@@ -1251,10 +1245,7 @@ export class Toolbar {
|
|
|
1251
1245
|
width: 120,
|
|
1252
1246
|
height: 140
|
|
1253
1247
|
}
|
|
1254
|
-
};
|
|
1255
|
-
|
|
1256
|
-
console.log('📁 Toolbar: эмитируем FileSelected:', fileSelectedData);
|
|
1257
|
-
this.eventBus.emit(Events.Place.FileSelected, fileSelectedData);
|
|
1248
|
+
});
|
|
1258
1249
|
|
|
1259
1250
|
// Активируем инструмент размещения
|
|
1260
1251
|
this.eventBus.emit(Events.Keyboard.ToolSelect, { tool: 'place' });
|
|
@@ -1400,7 +1391,6 @@ export class Toolbar {
|
|
|
1400
1391
|
* @param {string} iconName - имя иконки
|
|
1401
1392
|
*/
|
|
1402
1393
|
async reloadToolbarIcon(iconName) {
|
|
1403
|
-
console.log(`🔄 Начинаем обновление иконки ${iconName} в тулбаре...`);
|
|
1404
1394
|
try {
|
|
1405
1395
|
// Перезагружаем иконку
|
|
1406
1396
|
const newSvgContent = await this.iconLoader.reloadIcon(iconName);
|
|
@@ -1417,9 +1407,7 @@ export class Toolbar {
|
|
|
1417
1407
|
|
|
1418
1408
|
// Добавляем новый SVG
|
|
1419
1409
|
this.createSvgIcon(button, iconName);
|
|
1420
|
-
console.log(`✅ Иконка ${iconName} обновлена в интерфейсе!`);
|
|
1421
1410
|
} else {
|
|
1422
|
-
console.warn(`⚠️ Кнопка с иконкой ${iconName} не найдена`);
|
|
1423
1411
|
}
|
|
1424
1412
|
} catch (error) {
|
|
1425
1413
|
console.error(`❌ Ошибка обновления иконки ${iconName}:`, error);
|
package/src/ui/Topbar.js
CHANGED
|
@@ -64,9 +64,6 @@ export class Topbar {
|
|
|
64
64
|
this.element = document.createElement('div');
|
|
65
65
|
this.element.className = `moodboard-topbar moodboard-topbar--${this.theme}`;
|
|
66
66
|
|
|
67
|
-
console.log('🔍 Topbar: создаю верхнюю панель');
|
|
68
|
-
console.log('🔍 Topbar: this.icons содержит:', this.icons);
|
|
69
|
-
console.log('🔍 Topbar: количество иконок:', Object.keys(this.icons).length);
|
|
70
67
|
|
|
71
68
|
// Кнопки выбора вида сетки (без функциональности)
|
|
72
69
|
const buttons = [
|
|
@@ -80,14 +77,11 @@ export class Topbar {
|
|
|
80
77
|
const btn = document.createElement('button');
|
|
81
78
|
btn.className = 'moodboard-topbar__button';
|
|
82
79
|
|
|
83
|
-
console.log(`🔍 Topbar: создаю кнопку для иконки "${cfg.icon}"`);
|
|
84
80
|
|
|
85
81
|
// Создаем SVG иконку
|
|
86
82
|
if (this.icons[cfg.icon]) {
|
|
87
|
-
console.log(`✅ Topbar: иконка "${cfg.icon}" найдена, создаю SVG`);
|
|
88
83
|
this.createSvgIcon(btn, cfg.icon);
|
|
89
84
|
} else {
|
|
90
|
-
console.warn(`⚠️ Topbar: иконка "${cfg.icon}" не найдена, создаю fallback`);
|
|
91
85
|
// Fallback: создаем простую текстовую иконку
|
|
92
86
|
const fallbackIcon = document.createElement('span');
|
|
93
87
|
fallbackIcon.textContent = cfg.icon.charAt(0).toUpperCase();
|
|
@@ -111,14 +105,11 @@ export class Topbar {
|
|
|
111
105
|
paintBtn.className = 'moodboard-topbar__button moodboard-topbar__button--paint';
|
|
112
106
|
paintBtn.title = 'Палитра фона';
|
|
113
107
|
|
|
114
|
-
console.log('🔍 Topbar: создаю кнопку краски');
|
|
115
108
|
|
|
116
109
|
// Создаем SVG иконку
|
|
117
110
|
if (this.icons['paint']) {
|
|
118
|
-
console.log('✅ Topbar: иконка paint найдена, создаю SVG');
|
|
119
111
|
this.createSvgIcon(paintBtn, 'paint');
|
|
120
112
|
} else {
|
|
121
|
-
console.warn('⚠️ Topbar: иконка paint не найдена, создаю fallback');
|
|
122
113
|
// Fallback: создаем простую текстовую иконку
|
|
123
114
|
const fallbackIcon = document.createElement('span');
|
|
124
115
|
fallbackIcon.textContent = '🎨';
|
|
@@ -144,11 +135,8 @@ export class Topbar {
|
|
|
144
135
|
* Создает SVG иконку для кнопки
|
|
145
136
|
*/
|
|
146
137
|
createSvgIcon(button, iconName) {
|
|
147
|
-
console.log(`🔍 Topbar: создаю SVG иконку "${iconName}"`);
|
|
148
|
-
console.log(`🔍 Topbar: доступные иконки:`, Object.keys(this.icons));
|
|
149
138
|
|
|
150
139
|
if (this.icons[iconName]) {
|
|
151
|
-
console.log(`✅ Topbar: иконка "${iconName}" найдена, создаю SVG элемент`);
|
|
152
140
|
// Создаем SVG элемент из загруженного содержимого
|
|
153
141
|
const tempDiv = document.createElement('div');
|
|
154
142
|
tempDiv.innerHTML = this.icons[iconName];
|
|
@@ -162,12 +150,9 @@ export class Topbar {
|
|
|
162
150
|
|
|
163
151
|
// Добавляем SVG в кнопку
|
|
164
152
|
button.appendChild(svg);
|
|
165
|
-
console.log(`✅ Topbar: SVG иконка "${iconName}" успешно добавлена в кнопку`);
|
|
166
153
|
} else {
|
|
167
|
-
console.warn(`⚠️ Topbar: не удалось найти SVG элемент в содержимом иконки "${iconName}"`);
|
|
168
154
|
}
|
|
169
155
|
} else {
|
|
170
|
-
console.warn(`⚠️ Topbar: иконка "${iconName}" не найдена в this.icons`);
|
|
171
156
|
}
|
|
172
157
|
}
|
|
173
158
|
|
|
@@ -74,7 +74,6 @@ const _localEmojiModules = (() => {
|
|
|
74
74
|
try {
|
|
75
75
|
return import.meta.glob('../assets/emodji/**/*.{svg,SVG,png,PNG}', { eager: true, query: '?url', import: 'default' });
|
|
76
76
|
} catch (error) {
|
|
77
|
-
console.warn('⚠️ import.meta.glob failed, using fallback for emoji resolution');
|
|
78
77
|
return {};
|
|
79
78
|
}
|
|
80
79
|
}
|
|
@@ -161,7 +160,6 @@ export function resolveEmojiAbsoluteUrl(emoji, basePath = null) {
|
|
|
161
160
|
return `${resolvedBasePath}Смайлики/${base}.png`; // Большинство эмоджи в папке Смайлики
|
|
162
161
|
|
|
163
162
|
} catch (error) {
|
|
164
|
-
console.warn('⚠️ Ошибка resolveEmojiAbsoluteUrl:', error);
|
|
165
163
|
return null;
|
|
166
164
|
}
|
|
167
165
|
}
|
package/src/utils/styleLoader.js
CHANGED
|
@@ -19,18 +19,15 @@ export class StyleLoader {
|
|
|
19
19
|
'src/ui/styles/panels.css'
|
|
20
20
|
];
|
|
21
21
|
|
|
22
|
-
console.log('🎨 StyleLoader: Загружаем стили MoodBoard...');
|
|
23
22
|
|
|
24
23
|
for (const stylePath of styles) {
|
|
25
24
|
try {
|
|
26
25
|
await this.loadStyle(basePath + stylePath);
|
|
27
|
-
console.log(`✅ Стиль загружен: ${stylePath}`);
|
|
28
26
|
} catch (error) {
|
|
29
27
|
console.warn(`⚠️ Ошибка загрузки стиля ${stylePath}:`, error);
|
|
30
28
|
}
|
|
31
29
|
}
|
|
32
30
|
|
|
33
|
-
console.log('🎨 StyleLoader: Все стили загружены');
|
|
34
31
|
}
|
|
35
32
|
|
|
36
33
|
/**
|