@sequent-org/moodboard 1.0.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 (123) hide show
  1. package/package.json +44 -0
  2. package/src/assets/icons/README.md +105 -0
  3. package/src/assets/icons/attachments.svg +3 -0
  4. package/src/assets/icons/clear.svg +5 -0
  5. package/src/assets/icons/comments.svg +3 -0
  6. package/src/assets/icons/emoji.svg +6 -0
  7. package/src/assets/icons/frame.svg +3 -0
  8. package/src/assets/icons/image.svg +3 -0
  9. package/src/assets/icons/note.svg +3 -0
  10. package/src/assets/icons/pan.svg +3 -0
  11. package/src/assets/icons/pencil.svg +3 -0
  12. package/src/assets/icons/redo.svg +3 -0
  13. package/src/assets/icons/select.svg +9 -0
  14. package/src/assets/icons/shapes.svg +3 -0
  15. package/src/assets/icons/text-add.svg +3 -0
  16. package/src/assets/icons/topbar/README.md +39 -0
  17. package/src/assets/icons/topbar/grid-cross.svg +6 -0
  18. package/src/assets/icons/topbar/grid-dot.svg +3 -0
  19. package/src/assets/icons/topbar/grid-line.svg +3 -0
  20. package/src/assets/icons/topbar/grid-off.svg +3 -0
  21. package/src/assets/icons/topbar/paint.svg +3 -0
  22. package/src/assets/icons/undo.svg +3 -0
  23. package/src/core/ApiClient.js +309 -0
  24. package/src/core/EventBus.js +42 -0
  25. package/src/core/HistoryManager.js +261 -0
  26. package/src/core/KeyboardManager.js +710 -0
  27. package/src/core/PixiEngine.js +439 -0
  28. package/src/core/SaveManager.js +381 -0
  29. package/src/core/StateManager.js +64 -0
  30. package/src/core/commands/BaseCommand.js +68 -0
  31. package/src/core/commands/CopyObjectCommand.js +44 -0
  32. package/src/core/commands/CreateObjectCommand.js +46 -0
  33. package/src/core/commands/DeleteObjectCommand.js +146 -0
  34. package/src/core/commands/EditFileNameCommand.js +107 -0
  35. package/src/core/commands/GroupMoveCommand.js +47 -0
  36. package/src/core/commands/GroupReorderZCommand.js +74 -0
  37. package/src/core/commands/GroupResizeCommand.js +37 -0
  38. package/src/core/commands/GroupRotateCommand.js +41 -0
  39. package/src/core/commands/MoveObjectCommand.js +89 -0
  40. package/src/core/commands/PasteObjectCommand.js +103 -0
  41. package/src/core/commands/ReorderZCommand.js +45 -0
  42. package/src/core/commands/ResizeObjectCommand.js +135 -0
  43. package/src/core/commands/RotateObjectCommand.js +70 -0
  44. package/src/core/commands/index.js +14 -0
  45. package/src/core/events/Events.js +147 -0
  46. package/src/core/index.js +1632 -0
  47. package/src/core/rendering/GeometryUtils.js +89 -0
  48. package/src/core/rendering/HitTestManager.js +186 -0
  49. package/src/core/rendering/LayerManager.js +137 -0
  50. package/src/core/rendering/ObjectRenderer.js +363 -0
  51. package/src/core/rendering/PixiRenderer.js +140 -0
  52. package/src/core/rendering/index.js +9 -0
  53. package/src/grid/BaseGrid.js +164 -0
  54. package/src/grid/CrossGrid.js +75 -0
  55. package/src/grid/DotGrid.js +148 -0
  56. package/src/grid/GridFactory.js +173 -0
  57. package/src/grid/LineGrid.js +115 -0
  58. package/src/index.js +2 -0
  59. package/src/moodboard/ActionHandler.js +114 -0
  60. package/src/moodboard/DataManager.js +114 -0
  61. package/src/moodboard/MoodBoard.js +359 -0
  62. package/src/moodboard/WorkspaceManager.js +103 -0
  63. package/src/objects/BaseObject.js +1 -0
  64. package/src/objects/CommentObject.js +115 -0
  65. package/src/objects/DrawingObject.js +114 -0
  66. package/src/objects/EmojiObject.js +98 -0
  67. package/src/objects/FileObject.js +318 -0
  68. package/src/objects/FrameObject.js +127 -0
  69. package/src/objects/ImageObject.js +72 -0
  70. package/src/objects/NoteObject.js +227 -0
  71. package/src/objects/ObjectFactory.js +61 -0
  72. package/src/objects/ShapeObject.js +134 -0
  73. package/src/objects/StampObject.js +0 -0
  74. package/src/objects/StickerObject.js +0 -0
  75. package/src/objects/TextObject.js +123 -0
  76. package/src/services/BoardService.js +85 -0
  77. package/src/services/FileUploadService.js +398 -0
  78. package/src/services/FrameService.js +138 -0
  79. package/src/services/ImageUploadService.js +246 -0
  80. package/src/services/ZOrderManager.js +50 -0
  81. package/src/services/ZoomPanController.js +78 -0
  82. package/src/src.7z +0 -0
  83. package/src/src.zip +0 -0
  84. package/src/src2.zip +0 -0
  85. package/src/tools/AlignmentGuides.js +326 -0
  86. package/src/tools/BaseTool.js +257 -0
  87. package/src/tools/ResizeHandles.js +381 -0
  88. package/src/tools/ToolManager.js +580 -0
  89. package/src/tools/board-tools/PanTool.js +43 -0
  90. package/src/tools/board-tools/ZoomTool.js +393 -0
  91. package/src/tools/object-tools/DrawingTool.js +404 -0
  92. package/src/tools/object-tools/PlacementTool.js +1005 -0
  93. package/src/tools/object-tools/SelectTool.js +2183 -0
  94. package/src/tools/object-tools/TextTool.js +416 -0
  95. package/src/tools/object-tools/selection/BoxSelectController.js +105 -0
  96. package/src/tools/object-tools/selection/GeometryUtils.js +101 -0
  97. package/src/tools/object-tools/selection/GroupDragController.js +61 -0
  98. package/src/tools/object-tools/selection/GroupResizeController.js +90 -0
  99. package/src/tools/object-tools/selection/GroupRotateController.js +61 -0
  100. package/src/tools/object-tools/selection/HandlesSync.js +96 -0
  101. package/src/tools/object-tools/selection/ResizeController.js +68 -0
  102. package/src/tools/object-tools/selection/RotateController.js +58 -0
  103. package/src/tools/object-tools/selection/SelectionModel.js +42 -0
  104. package/src/tools/object-tools/selection/SimpleDragController.js +45 -0
  105. package/src/ui/CommentPopover.js +187 -0
  106. package/src/ui/ContextMenu.js +340 -0
  107. package/src/ui/FilePropertiesPanel.js +298 -0
  108. package/src/ui/FramePropertiesPanel.js +462 -0
  109. package/src/ui/HtmlHandlesLayer.js +778 -0
  110. package/src/ui/HtmlTextLayer.js +279 -0
  111. package/src/ui/MapPanel.js +290 -0
  112. package/src/ui/NotePropertiesPanel.js +502 -0
  113. package/src/ui/SaveStatus.js +250 -0
  114. package/src/ui/TextPropertiesPanel.js +911 -0
  115. package/src/ui/Toolbar.js +1118 -0
  116. package/src/ui/Topbar.js +220 -0
  117. package/src/ui/ZoomPanel.js +116 -0
  118. package/src/ui/styles/workspace.css +854 -0
  119. package/src/utils/colors.js +0 -0
  120. package/src/utils/geometry.js +0 -0
  121. package/src/utils/iconLoader.js +270 -0
  122. package/src/utils/objectIdGenerator.js +17 -0
  123. package/src/utils/topbarIconLoader.js +114 -0
@@ -0,0 +1,854 @@
1
+ /* MoodBoard Workspace Styles */
2
+
3
+ /* Основные контейнеры */
4
+ .moodboard-container {
5
+ position: relative;
6
+ width: 100%;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ }
10
+
11
+ .moodboard-canvas {
12
+ display: block;
13
+ width: 100%;
14
+ height: 100%;
15
+ }
16
+
17
+ .moodboard-workspace {
18
+ position: fixed;
19
+ inset: 0;
20
+ width: 100vw;
21
+ height: 100vh;
22
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
23
+ overflow: hidden;
24
+ }
25
+
26
+ /* Light Theme */
27
+ .moodboard-workspace--light {
28
+ background: #f8f9fa;
29
+ color: #333;
30
+ }
31
+
32
+
33
+
34
+ /* Toolbar Container */
35
+ .moodboard-workspace__toolbar {
36
+ position: absolute;
37
+ top: 50%;
38
+ left: 16px;
39
+ transform: translateY(-50%);
40
+ z-index: 3000;
41
+ pointer-events: none; /* чтобы клики проходили, сами кнопки включим */
42
+ }
43
+
44
+ .moodboard-workspace__topbar {
45
+ position: absolute;
46
+ top: 0;
47
+ left: 0;
48
+ right: 0;
49
+ height: 0; /* контейнер только для позиционирования, сам топбар абсолютный */
50
+ pointer-events: none;
51
+ }
52
+
53
+ /* Right top zoom panel container (reuses topbar container area) */
54
+ .moodboard-zoombar {
55
+ position: absolute;
56
+ top: 16px;
57
+ right: 16px;
58
+ display: inline-flex;
59
+ align-items: center;
60
+ gap: 8px;
61
+ padding: 8px 10px;
62
+ background: #fff;
63
+ border: 1px solid #e0e0e0;
64
+ border-radius: 10px;
65
+ box-shadow: 0 8px 24px rgba(0,0,0,0.12);
66
+ z-index: 3000;
67
+ pointer-events: auto;
68
+ }
69
+
70
+ .moodboard-zoombar__button {
71
+ width: 32px;
72
+ height: 32px;
73
+ border: none;
74
+ border-radius: 8px;
75
+ background: #f0f0f0;
76
+ color: #333;
77
+ font-size: 16px;
78
+ cursor: pointer;
79
+ }
80
+
81
+ .moodboard-zoombar__button:hover { background: #e6e6e6; }
82
+
83
+ .moodboard-zoombar__label {
84
+ min-width: 48px;
85
+ text-align: center;
86
+ font-size: 14px;
87
+ cursor: pointer;
88
+ color: #333;
89
+ display: inline-flex;
90
+ align-items: center;
91
+ gap: 4px;
92
+ }
93
+
94
+ .moodboard-zoombar__label-caret {
95
+ color: #999;
96
+ font-size: 12px;
97
+ }
98
+
99
+ .moodboard-zoombar__label-value {
100
+ color: #333;
101
+ }
102
+
103
+ .moodboard-zoombar__menu {
104
+ position: absolute;
105
+ right: 0;
106
+ top: 49px;
107
+ background: #fff;
108
+ border: 1px solid #e0e0e0;
109
+ border-radius: 8px;
110
+ box-shadow: 0 8px 24px rgba(0,0,0,0.12);
111
+ padding: 6px 0;
112
+ min-width: 180px;
113
+ z-index: 3100;
114
+ }
115
+
116
+ .moodboard-zoombar__menu-item {
117
+ padding: 8px 12px;
118
+ font-size: 14px;
119
+ cursor: pointer;
120
+ }
121
+ .moodboard-zoombar__menu-item:hover { background: #f5f5f5; }
122
+
123
+ /* Bottom-right map panel */
124
+ .moodboard-mapbar {
125
+ position: absolute;
126
+ right: 16px;
127
+ bottom: 16px;
128
+ display: inline-flex;
129
+ align-items: center;
130
+ gap: 8px;
131
+ padding: 8px 10px;
132
+ background: #fff;
133
+ border: 1px solid #e0e0e0;
134
+ border-radius: 10px;
135
+ box-shadow: 0 8px 24px rgba(0,0,0,0.12);
136
+ z-index: 3000;
137
+ }
138
+
139
+ .moodboard-mapbar__button {
140
+ width: 36px;
141
+ height: 36px;
142
+ border: none;
143
+ border-radius: 8px;
144
+ background: #f0f0f0;
145
+ color: #333;
146
+ font-size: 18px;
147
+ cursor: pointer;
148
+ }
149
+ .moodboard-mapbar__button:hover { background: #e6e6e6; }
150
+
151
+ .moodboard-mapbar__popup {
152
+ position: absolute;
153
+ right: 0;
154
+ bottom: 55px; /* над кнопкой (кнопка 36px + зазор) */
155
+ width: 20vw; /* 1/5 ширины экрана */
156
+ height: 20vh; /* 1/5 высоты экрана */
157
+ max-width: 520px;
158
+ max-height: 320px;
159
+ min-width: 220px;
160
+ min-height: 140px;
161
+ background: #fff;
162
+ border: 1px solid #e0e0e0;
163
+ border-radius: 10px;
164
+ box-shadow: 0 12px 28px rgba(0,0,0,0.18);
165
+ z-index: 3100;
166
+ overflow: hidden;
167
+ }
168
+
169
+ .moodboard-minimap-canvas {
170
+ display: block;
171
+ width: 100%;
172
+ height: 100%;
173
+ }
174
+
175
+ /* Canvas Container */
176
+ .moodboard-workspace__canvas {
177
+ position: absolute;
178
+ inset: 0;
179
+ overflow: hidden;
180
+ }
181
+
182
+ /* Toolbar Styles */
183
+ .moodboard-toolbar {
184
+ background: white;
185
+ border-radius: 12px;
186
+ padding: 8px;
187
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
188
+ border: 1px solid #e0e0e0;
189
+ display: inline-flex;
190
+ flex-direction: column;
191
+ align-items: center;
192
+ gap: 8px;
193
+ pointer-events: auto; /* кликабельна */
194
+ width: 50px;
195
+ }
196
+
197
+
198
+
199
+ /* Toolbar Buttons */
200
+ .moodboard-toolbar__button {
201
+ display: inline-flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ width: 40px;
205
+ height: 40px;
206
+ border: none;
207
+ border-radius: 8px;
208
+ /* background: #E1F5FE; */
209
+ /* color: #212121; */
210
+ font-size: 18px;
211
+ font-weight: 500;
212
+ cursor: pointer;
213
+ transition: all 0.2s ease;
214
+ text-align: center;
215
+ position: relative;
216
+ margin: 2px;
217
+ }
218
+
219
+ .moodboard-toolbar__button:hover {
220
+ background: #BBDEFB;
221
+ /* transform: translateY(-1px); */
222
+ }
223
+
224
+ .moodboard-toolbar__button:active {
225
+ transform: translateY(0);
226
+ }
227
+
228
+ /* Активное состояние кнопок */
229
+ .moodboard-toolbar__button--active {
230
+ background: #00B0FF !important;
231
+ color: #FFFFFF !important;
232
+ /* box-shadow: inset 0 0 0 3px #42A5F5; */
233
+ }
234
+
235
+ /* Отключенное состояние */
236
+ .moodboard-toolbar__button--disabled {
237
+ opacity: 0.4;
238
+ cursor: not-allowed;
239
+ }
240
+
241
+ /* Стили для SVG иконок */
242
+ .moodboard-toolbar__button svg {
243
+ width: 20px;
244
+ height: 20px;
245
+ /* fill: currentColor;
246
+ stroke: currentColor; */
247
+ transition: transform 0.2s ease;
248
+ }
249
+
250
+ .moodboard-toolbar__button:hover svg {
251
+ transform: scale(1.1);
252
+ }
253
+
254
+ .moodboard-toolbar__button--disabled svg {
255
+ opacity: 0.4;
256
+ }
257
+
258
+ /* Явные стили для всех кнопок тулбара */
259
+ .moodboard-toolbar__button--select,
260
+ .moodboard-toolbar__button--pan,
261
+ .moodboard-toolbar__button--text-add,
262
+ .moodboard-toolbar__button--note,
263
+ .moodboard-toolbar__button--image,
264
+ .moodboard-toolbar__button--shapes,
265
+ .moodboard-toolbar__button--pencil,
266
+ .moodboard-toolbar__button--comments,
267
+ .moodboard-toolbar__button--attachments,
268
+ .moodboard-toolbar__button--emoji,
269
+ .moodboard-toolbar__button--frame,
270
+ .moodboard-toolbar__button--clear,
271
+ .moodboard-toolbar__button--undo,
272
+ .moodboard-toolbar__button--redo {
273
+ /* background: #F5F5F5 !important; */
274
+ /* color: #212121 !important; */
275
+ /* stroke-width: 1px; */
276
+ }
277
+
278
+ .moodboard-toolbar__button--select:hover,
279
+ .moodboard-toolbar__button--pan:hover,
280
+ .moodboard-toolbar__button--text-add:hover,
281
+ .moodboard-toolbar__button--note:hover,
282
+ .moodboard-toolbar__button--image:hover,
283
+ .moodboard-toolbar__button--shapes:hover,
284
+ .moodboard-toolbar__button--pencil:hover,
285
+ .moodboard-toolbar__button--comments:hover,
286
+ .moodboard-toolbar__button--attachments:hover,
287
+ .moodboard-toolbar__button--emoji:hover,
288
+ .moodboard-toolbar__button--frame:hover,
289
+ .moodboard-toolbar__button--clear:hover,
290
+ .moodboard-toolbar__button--undo:hover:not(:disabled),
291
+ .moodboard-toolbar__button--redo:hover:not(:disabled) {
292
+ background: #80D8FF !important;
293
+ }
294
+
295
+
296
+
297
+ /* Specific button styles */
298
+
299
+ /* Попап для фигур */
300
+ .moodboard-toolbar__popup {
301
+ position: absolute;
302
+ top: 0;
303
+ left: 64px; /* по умолчанию справа от тулбара */
304
+ background: #fff;
305
+ border: 1px solid #e0e0e0;
306
+ border-radius: 10px;
307
+ box-shadow: 0 12px 28px rgba(0,0,0,0.18);
308
+ z-index: 3200;
309
+ padding: 8px;
310
+ pointer-events: auto;
311
+ }
312
+
313
+ .moodboard-toolbar__popup--shapes { width: auto; }
314
+ .moodboard-toolbar__popup--draw { width: auto; padding: 10px; }
315
+ .moodboard-toolbar__popup--emoji {
316
+ width: 360px;
317
+ max-height: none;
318
+ overflow: visible;
319
+ padding: 8px 10px;
320
+ }
321
+
322
+ .moodboard-shapes__grid {
323
+ display: grid;
324
+ grid-template-columns: repeat(3, 1fr);
325
+ gap: 8px;
326
+ }
327
+
328
+ /* Draw popup layout */
329
+ .moodboard-draw__grid { display: grid; gap: 8px; }
330
+ .moodboard-emoji__section { margin-bottom: 8px; }
331
+ .moodboard-emoji__title {
332
+ font-size: 12px;
333
+ color: #6b7280;
334
+ margin: 4px 4px 6px;
335
+ }
336
+ .moodboard-emoji__grid {
337
+ display: grid;
338
+ grid-template-columns: repeat(8, 32px);
339
+ gap: 6px;
340
+ }
341
+
342
+ .moodboard-emoji__btn {
343
+ width: 32px;
344
+ height: 32px;
345
+ border: none;
346
+ border-radius: 8px;
347
+ background: #f5f5f5;
348
+ cursor: pointer;
349
+ font-size: 18px;
350
+ display: inline-flex;
351
+ align-items: center;
352
+ justify-content: center;
353
+ transition: background .2s ease, transform .1s ease;
354
+ }
355
+ .moodboard-emoji__btn:hover { background: #eaeaea; }
356
+ .moodboard-emoji__btn:active { transform: scale(0.97); }
357
+
358
+ /* Divider inside emoji popup */
359
+ .moodboard-emoji__divider {
360
+ height: 1px;
361
+ background: #e5e7eb;
362
+ margin: 8px 2px;
363
+ }
364
+
365
+ /* Stickers section */
366
+ .moodboard-stickers__title {
367
+ font-size: 12px;
368
+ color: #6b7280;
369
+ margin: 8px 4px 6px;
370
+ }
371
+ .moodboard-stickers__grid {
372
+ display: grid;
373
+ grid-template-columns: repeat(6, 48px);
374
+ gap: 8px;
375
+ }
376
+ .moodboard-sticker__btn {
377
+ width: 48px;
378
+ height: 48px;
379
+ border: 1px solid #e5e7eb;
380
+ border-radius: 10px;
381
+ background: #fff;
382
+ box-shadow: 0 2px 6px rgba(0,0,0,0.06);
383
+ cursor: pointer;
384
+ font-size: 22px;
385
+ display: inline-flex;
386
+ align-items: center;
387
+ justify-content: center;
388
+ transition: background .2s ease, transform .1s ease;
389
+ }
390
+ .moodboard-sticker__btn:hover { background: #f8fafc; }
391
+ .moodboard-sticker__btn:active { transform: scale(0.97); }
392
+ .moodboard-draw__row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
393
+ .moodboard-draw__btn {
394
+ width: 40px;
395
+ height: 40px;
396
+ border: none;
397
+ border-radius: 8px;
398
+ background: #f5f5f5;
399
+ cursor: pointer;
400
+ display: inline-flex;
401
+ align-items: center;
402
+ justify-content: center;
403
+ transition: background .2s ease, transform .1s ease;
404
+ }
405
+ .moodboard-draw__btn:hover { background: #eaeaea; }
406
+ .moodboard-draw__btn:active { transform: scale(0.97); }
407
+ .moodboard-draw__btn--active {
408
+ background: #dbeafe;
409
+ box-shadow: inset 0 0 0 1px #93c5fd;
410
+ }
411
+ .draw-icon svg { display: block; }
412
+ .draw-size {
413
+ width: 22px;
414
+ height: 22px;
415
+ border: 2px solid #1f2937; /* темный контур круга */
416
+ border-radius: 50%;
417
+ display: inline-flex;
418
+ align-items: center;
419
+ justify-content: center;
420
+ }
421
+ .draw-dot {
422
+ display: inline-block;
423
+ border-radius: 50%;
424
+ }
425
+
426
+ /* Swatch for marker colors */
427
+ .draw-swatch {
428
+ width: 24px;
429
+ height: 16px;
430
+ border-radius: 4px;
431
+ border: 1px solid #e5e7eb;
432
+ }
433
+
434
+ .moodboard-shapes__btn {
435
+ width: 40px;
436
+ height: 40px;
437
+ border: none;
438
+ border-radius: 8px;
439
+ background: #f5f5f5;
440
+ cursor: pointer;
441
+ display: inline-flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ transition: background .2s ease, transform .1s ease;
445
+ }
446
+ .moodboard-shapes__btn:hover { background: #eaeaea; }
447
+ .moodboard-shapes__btn:active { transform: scale(0.97); }
448
+
449
+ /* Иконки фигур — рисуем CSSом */
450
+ .moodboard-shapes__icon { display: inline-block; }
451
+ .shape-square {
452
+ width: 15px; height: 15px; background: #1d4ed8; border-radius: 2px;
453
+ }
454
+ .shape-rounded-square {
455
+ width: 15px; height: 15px; background: #1d4ed8; border-radius: 4px;
456
+ }
457
+ .shape-circle {
458
+ width: 15px; height: 15px; background: #1d4ed8; border-radius: 50%;
459
+ }
460
+ .shape-triangle {
461
+ width: 0; height: 0;
462
+ border-left: 8px solid transparent;
463
+ border-right: 8px solid transparent;
464
+ border-bottom: 14px solid #1d4ed8;
465
+ }
466
+ .shape-diamond {
467
+ width: 11px; height: 11px; background: #1d4ed8; transform: rotate(45deg);
468
+ }
469
+ .shape-parallelogram {
470
+ width: 17px; height: 11px; background: #1d4ed8; transform: skewX(-20deg);
471
+ }
472
+ .shape-arrow { font-size: 16px; color: #1d4ed8; line-height: 1; }
473
+
474
+
475
+
476
+ /* Toolbar Divider */
477
+ .moodboard-toolbar__divider {
478
+ width: 100%;
479
+ height: 1px;
480
+ background: #e0e0e0;
481
+ margin: 6px 0;
482
+ }
483
+
484
+
485
+
486
+ /* Save Status Indicator */
487
+ .moodboard-save-status {
488
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
489
+ user-select: none;
490
+ pointer-events: none;
491
+ z-index: 1000;
492
+ min-width: 120px;
493
+ max-width: 280px;
494
+ }
495
+
496
+ .moodboard-save-status .save-icon {
497
+ display: none;
498
+ }
499
+
500
+ .moodboard-save-status .save-text {
501
+ font-weight: 400;
502
+ }
503
+
504
+ .moodboard-save-status .save-time {
505
+ font-weight: 400;
506
+ opacity: 0.6;
507
+ }
508
+
509
+ /* Плоский статус в левом нижнем углу */
510
+ .moodboard-save-status {
511
+ position: absolute;
512
+ font-size: 12px;
513
+ color: #6b7280;
514
+ left: 20px !important;
515
+ bottom: 20px !important;
516
+ z-index: 3100;
517
+ pointer-events: none;
518
+ }
519
+
520
+ /* Context menu */
521
+ .moodboard-contextmenu {
522
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
523
+ font-size: 14px;
524
+ line-height: 1.4;
525
+ }
526
+
527
+ /* Topbar */
528
+ .moodboard-topbar {
529
+ position: absolute;
530
+ top: 12px;
531
+ left: 16px;
532
+ height: 50px;
533
+ display: inline-flex;
534
+ align-items: center;
535
+ gap: 8px;
536
+ padding: 8px 6px;
537
+ background: #fff;
538
+ border: 1px solid #e0e0e0;
539
+ border-radius: 10px;
540
+ box-shadow: 0 8px 24px rgba(0,0,0,0.12);
541
+ z-index: 3000;
542
+ pointer-events: auto;
543
+ }
544
+
545
+ .moodboard-topbar__button {
546
+ display: inline-flex;
547
+ align-items: center;
548
+ justify-content: center;
549
+ width: 38px;
550
+ height: 38px;
551
+ border: none;
552
+ border-radius: 8px;
553
+ /* background: #f0f0f0; */
554
+ /* color: #333; */
555
+ font-size: 16px;
556
+ cursor: pointer;
557
+ transition: all 0.2s ease;
558
+ }
559
+
560
+ /* Стили для SVG иконок в кнопках верхней панели */
561
+ .moodboard-topbar__button svg {
562
+ width: 16px;
563
+ height: 16px;
564
+ /* fill: currentColor;
565
+ stroke: currentColor; */
566
+ transition: all 0.2s ease;
567
+ }
568
+
569
+ .moodboard-topbar__button:hover svg {
570
+ /* transform: scale(1.1); */
571
+ }
572
+
573
+ .moodboard-topbar__button:hover {
574
+ background: #e6e6e6;
575
+ }
576
+
577
+ /* Divider for topbar */
578
+ .moodboard-topbar__divider {
579
+ width: 1px;
580
+ height: 28px;
581
+ background: #e5e7eb;
582
+ margin: 0 6px 0 2px;
583
+ }
584
+
585
+ /* Paint popover */
586
+ .moodboard-topbar__paint-popover {
587
+ position: absolute;
588
+ top: 48px;
589
+ left: 0;
590
+ background: #fff;
591
+ border: 1px solid #e5e7eb;
592
+ border-radius: 8px;
593
+ box-shadow: 0 8px 24px rgba(0,0,0,0.12);
594
+ padding: 8px;
595
+ z-index: 3100;
596
+ }
597
+
598
+ .moodboard-topbar__paint-grid {
599
+ display: grid;
600
+ grid-template-columns: repeat(5, 28px);
601
+ gap: 8px;
602
+ }
603
+
604
+ .moodboard-topbar__paint-btn {
605
+ width: 28px;
606
+ height: 28px;
607
+ border: 1px solid #e5e7eb;
608
+ border-radius: 6px;
609
+ cursor: pointer;
610
+ }
611
+ .moodboard-topbar__paint-btn:hover { filter: brightness(0.97); }
612
+
613
+ .moodboard-topbar__zoom {
614
+ display: inline-flex;
615
+ align-items: center;
616
+ gap: 8px;
617
+ margin-left: 8px;
618
+ }
619
+
620
+ .moodboard-topbar__button--zoom {
621
+ width: 32px;
622
+ height: 32px;
623
+ font-size: 16px;
624
+ }
625
+
626
+ .moodboard-topbar__zoom-label {
627
+ min-width: 48px;
628
+ text-align: center;
629
+ font-size: 14px;
630
+ }
631
+
632
+ .moodboard-topbar__button--active {
633
+ background: #dbeafe;
634
+ color: #1d4ed8;
635
+ }
636
+
637
+ /* Active state for toolbar buttons */
638
+
639
+ .moodboard-contextmenu__item {
640
+ padding: 8px 12px;
641
+ cursor: pointer;
642
+ display: flex;
643
+ align-items: center;
644
+ justify-content: space-between;
645
+ gap: 16px;
646
+ }
647
+
648
+ .moodboard-contextmenu__item:hover {
649
+ background: #f5f5f5;
650
+ }
651
+
652
+ .moodboard-contextmenu__shortcut {
653
+ color: #999;
654
+ font-size: 12px;
655
+ }
656
+
657
+ .moodboard-contextmenu__divider {
658
+ height: 1px;
659
+ background: #eee;
660
+ margin: 6px 0;
661
+ }
662
+
663
+ .moodboard-contextmenu__grid-row {
664
+ display: flex;
665
+ gap: 6px;
666
+ padding: 6px 8px 2px;
667
+ }
668
+
669
+ .moodboard-contextmenu__grid-button {
670
+ width: 28px;
671
+ height: 28px;
672
+ border: none;
673
+ border-radius: 6px;
674
+ background: #f0f0f0;
675
+ color: #333;
676
+ font-size: 14px;
677
+ cursor: pointer;
678
+ }
679
+
680
+ .moodboard-contextmenu__grid-button:hover {
681
+ background: #e6e6e6;
682
+ }
683
+
684
+ .moodboard-contextmenu__grid-button--active {
685
+ background: #dbeafe;
686
+ color: #1d4ed8;
687
+ }
688
+
689
+ /* Comment popover */
690
+ .comment-popover {
691
+ background: #fff;
692
+ border: 1px solid #e5e7eb;
693
+ border-radius: 10px;
694
+ box-shadow: 0 12px 28px rgba(0,0,0,0.18);
695
+ min-width: 220px;
696
+ max-width: 320px;
697
+ min-height: 140px; /* меньшее окно по умолчанию */
698
+ max-height: 260px;
699
+ display: flex;
700
+ flex-direction: column;
701
+ pointer-events: auto;
702
+ overflow: hidden;
703
+ z-index: 3300;
704
+ }
705
+ .comment-popover__header {
706
+ display: flex;
707
+ align-items: center;
708
+ justify-content: space-between;
709
+ padding: 10px 12px;
710
+ border-bottom: 1px solid #e5e7eb;
711
+ background: #fafafa;
712
+ }
713
+ .comment-popover__title {
714
+ font-size: 14px;
715
+ color: #374151;
716
+ }
717
+ .comment-popover__close {
718
+ border: none;
719
+ background: transparent;
720
+ font-size: 16px;
721
+ line-height: 1;
722
+ color: #6b7280;
723
+ cursor: pointer;
724
+ }
725
+ .comment-popover__close:hover { color: #111827; }
726
+ .comment-popover__body { padding: 12px; font-size: 14px; color: #374151; flex: 1; overflow-y: auto; min-height: 0; }
727
+ .comment-popover__footer {
728
+ padding: 10px 12px;
729
+ border-top: 1px solid #e5e7eb;
730
+ background: #fafafa;
731
+ }
732
+ .comment-popover__form { display: flex; gap: 8px; }
733
+ .comment-popover__input {
734
+ flex: 1;
735
+ height: 34px;
736
+ border: 1px solid #e5e7eb;
737
+ border-radius: 8px;
738
+ padding: 0 10px;
739
+ font-size: 14px;
740
+ }
741
+ .comment-popover__button {
742
+ height: 34px;
743
+ padding: 0 12px;
744
+ border: none;
745
+ border-radius: 8px;
746
+ background: #1d4ed8;
747
+ color: white;
748
+ font-size: 14px;
749
+ cursor: pointer;
750
+ }
751
+ .comment-popover__button:hover { filter: brightness(0.95); }
752
+ .comment-popover__row { padding: 6px 2px; border-bottom: 1px dashed #e5e7eb; }
753
+
754
+ /* Status Animation */
755
+ .moodboard-save-status.status-saving .save-icon {
756
+ animation: spin 1s linear infinite;
757
+ }
758
+
759
+ @keyframes spin {
760
+ from { transform: rotate(0deg); }
761
+ to { transform: rotate(360deg); }
762
+ }
763
+
764
+ /* Notification */
765
+ .moodboard-notification {
766
+ position: absolute;
767
+ top: 20px;
768
+ right: 20px;
769
+ background: #333;
770
+ color: white;
771
+ padding: 12px 20px;
772
+ border-radius: 6px;
773
+ font-size: 14px;
774
+ z-index: 1000;
775
+ animation: slideIn 0.3s ease;
776
+ }
777
+
778
+ @keyframes slideIn {
779
+ from {
780
+ transform: translateX(100%);
781
+ opacity: 0;
782
+ }
783
+ to {
784
+ transform: translateX(0);
785
+ opacity: 1;
786
+ }
787
+ }
788
+
789
+ /* Responsive */
790
+ @media (max-width: 768px) {
791
+ .moodboard-toolbar {
792
+ overflow-x: auto;
793
+ padding: 10px;
794
+ }
795
+ }
796
+
797
+ /* Tooltips */
798
+ .moodboard-tooltip {
799
+ position: absolute;
800
+ background: rgba(0, 0, 0, 0.9);
801
+ color: white;
802
+ padding: 8px 12px;
803
+ border-radius: 6px;
804
+ font-size: 12px;
805
+ font-weight: 500;
806
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
807
+ white-space: nowrap;
808
+ pointer-events: none;
809
+ z-index: 10000;
810
+ opacity: 0;
811
+ visibility: hidden;
812
+ transition: all 0.2s ease;
813
+ transform: translateX(-4px);
814
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
815
+ }
816
+
817
+ .moodboard-tooltip::before {
818
+ content: '';
819
+ position: absolute;
820
+ top: 50%;
821
+ left: -4px;
822
+ transform: translateY(-50%);
823
+ width: 0;
824
+ height: 0;
825
+ border-top: 4px solid transparent;
826
+ border-bottom: 4px solid transparent;
827
+ border-right: 4px solid rgba(0, 0, 0, 0.9);
828
+ }
829
+
830
+ .moodboard-tooltip--show {
831
+ opacity: 1;
832
+ visibility: visible;
833
+ transform: translateY(0);
834
+ }
835
+
836
+ /* Стили для текстового редактора */
837
+ .moodboard-text-editor {
838
+ /* Убираем рамки и тени */
839
+ }
840
+
841
+ .moodboard-text-input {
842
+ border-radius: 2px;
843
+ transition: all 0.2s ease;
844
+ outline: 2px solid #007ACC;
845
+ outline-offset: 1px;
846
+ }
847
+
848
+ .moodboard-text-input:focus {
849
+ /* Убираем дополнительную тень при фокусе */
850
+ outline: 2px solid #007ACC;
851
+ outline-offset: 1px;
852
+ }
853
+
854
+