@sequent-org/moodboard 1.4.32 → 1.4.34

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 (137) hide show
  1. package/package.json +5 -1
  2. package/src/assets/fonts/inter/inter-cyrillic-400-normal.woff2 +0 -0
  3. package/src/assets/fonts/inter/inter-cyrillic-500-normal.woff2 +0 -0
  4. package/src/assets/fonts/inter/inter-latin-400-normal.woff2 +0 -0
  5. package/src/assets/fonts/inter/inter-latin-500-normal.woff2 +0 -0
  6. package/src/assets/icons/attachments.svg +3 -1
  7. package/src/assets/icons/comments.svg +2 -2
  8. package/src/assets/icons/connector.svg +6 -0
  9. package/src/assets/icons/emoji.svg +6 -1
  10. package/src/assets/icons/frame.svg +4 -1
  11. package/src/assets/icons/image.svg +5 -1
  12. package/src/assets/icons/laser.svg +1 -0
  13. package/src/assets/icons/lasso.svg +5 -0
  14. package/src/assets/icons/mindmap.svg +10 -2
  15. package/src/assets/icons/note.svg +4 -1
  16. package/src/assets/icons/pan.svg +5 -2
  17. package/src/assets/icons/pencil.svg +4 -1
  18. package/src/assets/icons/reactions.svg +5 -0
  19. package/src/assets/icons/redo.svg +3 -2
  20. package/src/assets/icons/select.svg +2 -8
  21. package/src/assets/icons/shapes.svg +5 -1
  22. package/src/assets/icons/text-add.svg +15 -1
  23. package/src/assets/icons/undo.svg +3 -2
  24. package/src/assets/reactions/1f44d.svg +20 -0
  25. package/src/assets/reactions/1f44e.svg +20 -0
  26. package/src/assets/reactions/2705.svg +20 -0
  27. package/src/assets/reactions/274c.svg +19 -0
  28. package/src/assets/reactions/2753.svg +20 -0
  29. package/src/assets/reactions/2764.svg +22 -0
  30. package/src/assets/reactions/2b50.svg +19 -0
  31. package/src/assets/reactions/plus-one.svg +25 -0
  32. package/src/core/PixiEngine.js +23 -0
  33. package/src/core/bootstrap/CoreInitializer.js +43 -0
  34. package/src/core/commands/GroupDeleteCommand.js +13 -1
  35. package/src/core/commands/UpdateShapeStyleCommand.js +121 -0
  36. package/src/core/commands/UpdateTextStyleCommand.js +17 -6
  37. package/src/core/commands/index.js +3 -0
  38. package/src/core/events/Events.js +22 -0
  39. package/src/core/flows/LayerAndViewportFlow.js +1 -0
  40. package/src/core/flows/ObjectLifecycleFlow.js +155 -7
  41. package/src/core/index.js +28 -1
  42. package/src/grid/CrossGridZoomPhases.js +3 -3
  43. package/src/initNoBundler.js +1 -1
  44. package/src/moodboard/DataManager.js +28 -0
  45. package/src/moodboard/MoodBoard.js +27 -0
  46. package/src/moodboard/bootstrap/MoodBoardInitializer.js +69 -1
  47. package/src/moodboard/bootstrap/MoodBoardUiFactory.js +22 -4
  48. package/src/moodboard/integration/MoodBoardEventBindings.js +5 -1
  49. package/src/moodboard/integration/MoodBoardLoadApi.js +10 -1
  50. package/src/moodboard/lifecycle/MoodBoardDestroyer.js +9 -0
  51. package/src/objects/ConnectorObject.js +2 -2
  52. package/src/objects/FrameObject.js +119 -59
  53. package/src/objects/ShapeObject.js +49 -74
  54. package/src/objects/shape/ShapeDrawer.js +210 -0
  55. package/src/services/ConnectorBindingResolver.js +112 -0
  56. package/src/services/ConnectorRouter.js +210 -0
  57. package/src/services/ai/ChatSessionController.js +14 -8
  58. package/src/services/comments/CommentService.js +344 -0
  59. package/src/tools/object-tools/CommentTool.js +85 -0
  60. package/src/tools/object-tools/DrawingTool.js +110 -10
  61. package/src/tools/object-tools/LaserPointerTool.js +121 -0
  62. package/src/tools/object-tools/SelectTool.js +25 -1
  63. package/src/tools/object-tools/TextTool.js +6 -1
  64. package/src/tools/object-tools/connector/ConnectorDragController.js +50 -3
  65. package/src/tools/object-tools/connector/connectorGesture.js +33 -19
  66. package/src/tools/object-tools/placement/PlacementInputRouter.js +22 -1
  67. package/src/tools/object-tools/selection/BoxSelectController.js +24 -2
  68. package/src/tools/object-tools/selection/FrameTitleInlineEditorController.js +139 -0
  69. package/src/tools/object-tools/selection/InlineEditorController.js +12 -0
  70. package/src/tools/object-tools/selection/InlineEditorDomFactory.js +36 -0
  71. package/src/tools/object-tools/selection/LassoSelectController.js +125 -0
  72. package/src/tools/object-tools/selection/MindmapInlineEditorController.js +1 -0
  73. package/src/tools/object-tools/selection/SelectInputRouter.js +64 -5
  74. package/src/tools/object-tools/selection/SelectToolLifecycleController.js +11 -1
  75. package/src/tools/object-tools/selection/SelectToolSetup.js +13 -1
  76. package/src/tools/object-tools/selection/TextEditorInteractionController.js +46 -12
  77. package/src/tools/object-tools/selection/TextEditorSyncService.js +1 -0
  78. package/src/tools/object-tools/selection/TextInlineEditorController.js +65 -6
  79. package/src/ui/CommentPopover.js +6 -0
  80. package/src/ui/CommentsBar.js +91 -0
  81. package/src/ui/ConnectorPropertiesPanel.js +150 -0
  82. package/src/ui/ContextMenu.js +25 -0
  83. package/src/ui/DrawingPropertiesPanel.js +362 -0
  84. package/src/ui/FilePropertiesPanel.js +5 -0
  85. package/src/ui/FramePropertiesPanel.js +5 -0
  86. package/src/ui/HtmlTextLayer.js +246 -66
  87. package/src/ui/NotePropertiesPanel.js +6 -0
  88. package/src/ui/ShapePropertiesPanel.js +307 -0
  89. package/src/ui/TextPropertiesPanel.js +100 -1
  90. package/src/ui/Toolbar.js +25 -2
  91. package/src/ui/Topbar.js +2 -2
  92. package/src/ui/animation/HoverLiftController.js +6 -7
  93. package/src/ui/chat/ChatComposer.js +63 -9
  94. package/src/ui/chat/ChatWindow.js +329 -166
  95. package/src/ui/comments/CommentListPanel.js +213 -0
  96. package/src/ui/comments/CommentPinLayer.js +448 -0
  97. package/src/ui/comments/CommentThreadPopover.js +539 -0
  98. package/src/ui/comments/commentFormat.js +32 -0
  99. package/src/ui/connector-properties/ConnectorPropertiesPanelBindings.js +223 -0
  100. package/src/ui/connector-properties/ConnectorPropertiesPanelEventBridge.js +114 -0
  101. package/src/ui/connector-properties/ConnectorPropertiesPanelMapper.js +144 -0
  102. package/src/ui/connector-properties/ConnectorPropertiesPanelRenderer.js +447 -0
  103. package/src/ui/connector-properties/ConnectorPropertiesPanelState.js +61 -0
  104. package/src/ui/connectors/ConnectionAnchorsLayer.js +1 -0
  105. package/src/ui/connectors/ConnectorHandlesLayer.js +321 -0
  106. package/src/ui/connectors/ConnectorLabelLayer.js +334 -0
  107. package/src/ui/connectors/ConnectorLayer.js +264 -57
  108. package/src/ui/handles/HandlesDomRenderer.js +5 -13
  109. package/src/ui/handles/HandlesEventBridge.js +1 -0
  110. package/src/ui/handles/SingleSelectionHandlesController.js +4 -0
  111. package/src/ui/mindmap/MindmapCollapseLayer.js +1 -0
  112. package/src/ui/mindmap/MindmapConnectionLayer.js +1 -0
  113. package/src/ui/mindmap/MindmapHtmlTextLayer.js +6 -0
  114. package/src/ui/shape-properties/ShapePropertiesPanelDom.js +533 -0
  115. package/src/ui/shape-properties/ShapePropertiesPanelSync.js +132 -0
  116. package/src/ui/styles/chat.css +710 -18
  117. package/src/ui/styles/index.css +1 -0
  118. package/src/ui/styles/panels.css +112 -2
  119. package/src/ui/styles/shape-properties-panel.css +250 -0
  120. package/src/ui/styles/toolbar.css +7 -2
  121. package/src/ui/styles/topbar.css +1 -1
  122. package/src/ui/styles/workspace.css +257 -6
  123. package/src/ui/text-properties/TextFormatControls.js +88 -0
  124. package/src/ui/text-properties/TextListRenderer.js +137 -0
  125. package/src/ui/text-properties/TextPropertiesPanelBindings.js +27 -0
  126. package/src/ui/text-properties/TextPropertiesPanelEventBridge.js +3 -1
  127. package/src/ui/text-properties/TextPropertiesPanelMapper.js +56 -0
  128. package/src/ui/text-properties/TextPropertiesPanelRenderer.js +24 -0
  129. package/src/ui/text-properties/TextPropertiesPanelState.js +8 -0
  130. package/src/ui/toolbar/ReactionsPopupController.js +88 -0
  131. package/src/ui/toolbar/ToolbarActionRouter.js +71 -5
  132. package/src/ui/toolbar/ToolbarPopupsController.js +120 -118
  133. package/src/ui/toolbar/ToolbarRenderer.js +9 -1
  134. package/src/ui/toolbar/ToolbarStateController.js +4 -1
  135. package/src/utils/iconLoader.js +17 -16
  136. package/src/utils/markdown.js +14 -0
  137. package/src/utils/richText.js +125 -0
@@ -34,6 +34,7 @@
34
34
  scroll-behavior: smooth;
35
35
  }
36
36
 
37
+ /* TODO: установить flex, когда будем прикручивать историю */
37
38
  .moodboard-chat__history.is-visible {
38
39
  display: none;
39
40
  }
@@ -202,30 +203,12 @@
202
203
  transition: background-color 120ms ease, box-shadow 120ms ease;
203
204
  }
204
205
 
205
- .moodboard-chat__input-row.is-reference-drop-target {
206
- background: rgba(99, 102, 241, 0.08);
207
- box-shadow: inset 0 0 0 1px rgba(99, 102, 241, 0.22);
208
- }
209
-
210
206
  .moodboard-chat__textarea-row {
211
207
  display: flex;
212
208
  align-items: flex-start;
213
209
  gap: 8px;
214
210
  }
215
211
 
216
- .moodboard-chat__reference-drag-preview {
217
- position: fixed;
218
- z-index: 2700;
219
- width: 96px;
220
- height: 96px;
221
- object-fit: cover;
222
- border-radius: 10px;
223
- box-shadow: 0 14px 32px rgba(15, 23, 42, 0.24);
224
- transform: translate(-50%, -50%) scale(0.92);
225
- pointer-events: none;
226
- opacity: 0.96;
227
- }
228
-
229
212
  .moodboard-chat__input-row.has-attachments .moodboard-chat__textarea-row .moodboard-chat__pill-wrapper {
230
213
  position: absolute;
231
214
  top: 0;
@@ -721,6 +704,7 @@
721
704
  pointer-events: none;
722
705
  z-index: 10;
723
706
  transition:
707
+ left var(--moodboard-chat-board-animation-ms) cubic-bezier(0.22, 1, 0.36, 1),
724
708
  transform var(--moodboard-chat-board-animation-ms) cubic-bezier(0.22, 1, 0.36, 1),
725
709
  opacity var(--moodboard-chat-board-animation-ms) ease;
726
710
  will-change: transform, opacity;
@@ -976,3 +960,711 @@
976
960
  .moodboard-chat__extended-clear:hover {
977
961
  color: #374151;
978
962
  }
963
+
964
+ .moodboard-chat__extended-enhance {
965
+ background: transparent;
966
+ border: none;
967
+ color: #6B7280;
968
+ font-size: 13px;
969
+ font-weight: 500;
970
+ cursor: pointer;
971
+ padding: 0;
972
+ display: inline-flex;
973
+ align-items: center;
974
+ gap: 6px;
975
+ transition: color 120ms ease;
976
+ }
977
+
978
+ .moodboard-chat__extended-enhance:hover {
979
+ color: #374151;
980
+ }
981
+
982
+ .moodboard-chat__extended-enhance-icon {
983
+ display: inline-flex;
984
+ color: inherit;
985
+ }
986
+
987
+ .moodboard-chat__extended-enhance-icon svg {
988
+ width: 16px;
989
+ height: 16px;
990
+ }
991
+
992
+ /* ── Пины комментариев ───────────────────────────────────────────── */
993
+
994
+ /* Positioned-обёртка: занимает место в DOM-потоке, задаёт 28×28 */
995
+ .comment-pin-wrap {
996
+ position: absolute;
997
+ width: 28px;
998
+ height: 28px;
999
+ pointer-events: none;
1000
+ }
1001
+
1002
+ .comment-pin {
1003
+ /* position: relative — children (avatar/initials) абсолютны относительно кнопки */
1004
+ position: relative;
1005
+ width: 100%;
1006
+ height: 100%;
1007
+ display: block;
1008
+ overflow: hidden; /* clip аватара по кругу без влияния на badge (он в wrap, не в кнопке) */
1009
+ border-radius: 50%;
1010
+ border: 2px solid var(--pin-color, #7c4dff);
1011
+ background: #fff;
1012
+ padding: 0;
1013
+ cursor: grab;
1014
+ box-sizing: border-box;
1015
+ transition: transform 120ms ease, box-shadow 120ms ease;
1016
+ }
1017
+
1018
+ .comment-pin:active {
1019
+ cursor: grabbing;
1020
+ }
1021
+
1022
+ .comment-pin:hover {
1023
+ transform: scale(1.18);
1024
+ box-shadow: 0 2px 8px rgba(124, 77, 255, 0.32);
1025
+ }
1026
+
1027
+ .comment-pin--resolved {
1028
+ border-color: #22C55E;
1029
+ opacity: 0.85;
1030
+ }
1031
+
1032
+ /* Зелёный индикатор-галочка resolved: позиционируется в правом нижнем углу wrap */
1033
+ .comment-pin__resolved-badge {
1034
+ position: absolute;
1035
+ bottom: -4px;
1036
+ right: -4px;
1037
+ width: 14px;
1038
+ height: 14px;
1039
+ border-radius: 50%;
1040
+ background: #22C55E;
1041
+ color: #fff;
1042
+ display: flex;
1043
+ align-items: center;
1044
+ justify-content: center;
1045
+ border: 1.5px solid #fff;
1046
+ pointer-events: none;
1047
+ box-sizing: border-box;
1048
+ }
1049
+
1050
+ /* Аватар автора: заполняет кнопку, обрезается через overflow:hidden родителя */
1051
+ .comment-pin__avatar {
1052
+ position: absolute;
1053
+ inset: 0;
1054
+ width: 100%;
1055
+ height: 100%;
1056
+ object-fit: cover;
1057
+ border-radius: 50%;
1058
+ pointer-events: none;
1059
+ }
1060
+
1061
+ /* Fallback инициала, если аватара нет */
1062
+ .comment-pin__initials {
1063
+ position: absolute;
1064
+ inset: 0;
1065
+ display: flex;
1066
+ align-items: center;
1067
+ justify-content: center;
1068
+ font-size: 11px;
1069
+ font-weight: 700;
1070
+ line-height: 1;
1071
+ color: #7c4dff;
1072
+ pointer-events: none;
1073
+ user-select: none;
1074
+ }
1075
+
1076
+ /* Бейдж непрочитанных */
1077
+ .comment-pin__badge {
1078
+ position: absolute;
1079
+ top: -5px;
1080
+ right: -5px;
1081
+ min-width: 16px;
1082
+ height: 16px;
1083
+ padding: 0 3px;
1084
+ border-radius: 8px;
1085
+ background: #EF4444;
1086
+ color: #fff;
1087
+ font-size: 10px;
1088
+ font-weight: 700;
1089
+ line-height: 16px;
1090
+ text-align: center;
1091
+ box-sizing: border-box;
1092
+ pointer-events: none;
1093
+ border: 1px solid #fff;
1094
+ }
1095
+
1096
+ /* Кнопка фильтра resolved-пинов */
1097
+ /* ── Поповер треда ───────────────────────────────────────────────── */
1098
+
1099
+ .comment-thread-popover {
1100
+ background: #fff;
1101
+ border-radius: 16px;
1102
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);
1103
+ overflow: visible;
1104
+ font-family: 'Roboto', Arial, sans-serif;
1105
+ color: #374151;
1106
+ /* сброс наследования от .moodboard-chat */
1107
+ bottom: auto;
1108
+ transform: none;
1109
+ width: auto;
1110
+ left: auto;
1111
+ }
1112
+
1113
+ .comment-thread-popover__header {
1114
+ display: flex;
1115
+ align-items: center;
1116
+ gap: 6px;
1117
+ padding: 10px 12px 8px;
1118
+ border-bottom: 1px solid #F3F4F6;
1119
+ flex-shrink: 0;
1120
+ }
1121
+
1122
+ /* В режиме нового комментария шапка скрыта */
1123
+ .comment-thread-popover--draft .comment-thread-popover__header {
1124
+ display: none;
1125
+ }
1126
+
1127
+ .comment-thread-popover__title {
1128
+ flex: 1;
1129
+ min-width: 0;
1130
+ font-size: 12px;
1131
+ font-weight: 600;
1132
+ color: #374151;
1133
+ text-transform: none;
1134
+ letter-spacing: 0;
1135
+ }
1136
+
1137
+ /* ── Кнопки шапки: единая геометрия 24×24 и центрирование ─────────── */
1138
+
1139
+ .comment-thread-popover__delete-btn,
1140
+ .comment-thread-popover__color-btn,
1141
+ .comment-thread-popover__resolve,
1142
+ .comment-thread-popover__close {
1143
+ flex: 0 0 auto;
1144
+ width: 24px;
1145
+ height: 24px;
1146
+ padding: 0;
1147
+ display: flex;
1148
+ align-items: center;
1149
+ justify-content: center;
1150
+ box-sizing: border-box;
1151
+ cursor: pointer;
1152
+ font-family: inherit;
1153
+ font-size: 12px;
1154
+ }
1155
+
1156
+ /* Корзина и крестик: голые иконки, квадрат → круг при наведении */
1157
+ .comment-thread-popover__delete-btn,
1158
+ .comment-thread-popover__close {
1159
+ border: 0;
1160
+ background: transparent;
1161
+ color: #6B7280;
1162
+ border-radius: 6px;
1163
+ transition: background 100ms ease, color 100ms ease, border-radius 100ms ease;
1164
+ }
1165
+
1166
+ .comment-thread-popover__close:hover {
1167
+ background: #F3F4F6;
1168
+ color: #374151;
1169
+ border-radius: 50%;
1170
+ }
1171
+
1172
+ .comment-thread-popover__delete-btn:hover {
1173
+ background: #FEF2F2;
1174
+ color: #EF4444;
1175
+ border-radius: 50%;
1176
+ }
1177
+
1178
+ .comment-thread-popover--draft .comment-thread-popover__delete-btn {
1179
+ display: none;
1180
+ }
1181
+
1182
+ /* Галочка «решить»: круглый чип с обводкой */
1183
+ .comment-thread-popover__resolve {
1184
+ border: 1.5px solid #D1D5DB !important;
1185
+ border-radius: 50%;
1186
+ color: #6B7280;
1187
+ background: transparent;
1188
+ transition: background 100ms ease, color 100ms ease, border-color 100ms ease;
1189
+ }
1190
+
1191
+ .comment-thread-popover__resolve:hover {
1192
+ border-color: #22C55E !important;
1193
+ color: #22C55E;
1194
+ background: #F0FDF4;
1195
+ }
1196
+
1197
+ .comment-thread-popover__resolve--resolved {
1198
+ border-color: #22C55E !important;
1199
+ color: #22C55E;
1200
+ background: #DCFCE7;
1201
+ }
1202
+
1203
+ .comment-thread-popover__resolve--resolved:hover {
1204
+ border-color: #16A34A !important;
1205
+ color: #16A34A;
1206
+ background: #BBF7D0;
1207
+ }
1208
+
1209
+ /* ── Кнопка цвета: круглая заливка, радиус и размер как у галочки ──── */
1210
+
1211
+ .comment-thread-popover__color-wrap {
1212
+ position: relative;
1213
+ flex-shrink: 0;
1214
+ display: flex;
1215
+ align-items: center;
1216
+ }
1217
+
1218
+ .comment-thread-popover__color-btn {
1219
+ border-radius: 50%;
1220
+ border: 2px solid rgba(0, 0, 0, 0.18);
1221
+ transition: border-color 100ms ease;
1222
+ }
1223
+
1224
+ .comment-thread-popover__color-btn:hover {
1225
+ border-color: rgba(0, 0, 0, 0.4);
1226
+ }
1227
+
1228
+ .comment-thread-popover__palette {
1229
+ position: absolute;
1230
+ top: calc(100% + 4px);
1231
+ left: 0;
1232
+ z-index: 30;
1233
+ background: #fff;
1234
+ border-radius: 10px;
1235
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.14), 0 0 0 1px rgba(0, 0, 0, 0.06);
1236
+ padding: 8px;
1237
+ display: flex;
1238
+ flex-wrap: wrap;
1239
+ gap: 5px;
1240
+ width: 116px;
1241
+ }
1242
+
1243
+ .comment-thread-popover__palette-swatch {
1244
+ width: 18px;
1245
+ height: 18px;
1246
+ border-radius: 50%;
1247
+ border: 2px solid transparent;
1248
+ padding: 0;
1249
+ cursor: pointer;
1250
+ box-sizing: border-box;
1251
+ flex-shrink: 0;
1252
+ transition: transform 100ms ease, border-color 100ms ease;
1253
+ }
1254
+
1255
+ .comment-thread-popover__palette-swatch:hover {
1256
+ transform: scale(1.2);
1257
+ border-color: rgba(0, 0, 0, 0.25);
1258
+ }
1259
+
1260
+ .comment-thread-popover__palette-swatch--active {
1261
+ border-color: rgba(0, 0, 0, 0.5);
1262
+ transform: scale(1.1);
1263
+ }
1264
+
1265
+ .comment-thread-popover__delete {
1266
+ flex: 0 0 auto;
1267
+ border: 0;
1268
+ background: transparent;
1269
+ cursor: pointer;
1270
+ font-size: 12px;
1271
+ font-family: inherit;
1272
+ color: #EF4444;
1273
+ padding: 3px 7px;
1274
+ border-radius: 6px;
1275
+ transition: background 100ms ease;
1276
+ }
1277
+
1278
+ .comment-thread-popover__delete:hover {
1279
+ background: #FEF2F2;
1280
+ }
1281
+
1282
+ .comment-thread-popover--draft .comment-thread-popover__delete {
1283
+ display: none;
1284
+ }
1285
+
1286
+ .comment-thread-popover__swatches {
1287
+ display: flex;
1288
+ align-items: center;
1289
+ gap: 6px;
1290
+ padding: 8px 12px;
1291
+ border-bottom: 1px solid #F3F4F6;
1292
+ flex-shrink: 0;
1293
+ }
1294
+
1295
+ .comment-thread-popover--draft .comment-thread-popover__swatches {
1296
+ display: none;
1297
+ }
1298
+
1299
+ .comment-thread-popover__swatch {
1300
+ width: 18px;
1301
+ height: 18px;
1302
+ border-radius: 50%;
1303
+ border: 2px solid transparent;
1304
+ padding: 0;
1305
+ cursor: pointer;
1306
+ box-sizing: border-box;
1307
+ flex-shrink: 0;
1308
+ transition: transform 100ms ease, border-color 100ms ease;
1309
+ }
1310
+
1311
+ .comment-thread-popover__swatch:hover {
1312
+ transform: scale(1.2);
1313
+ border-color: rgba(0, 0, 0, 0.25);
1314
+ }
1315
+
1316
+ .comment-thread-popover__swatch--active {
1317
+ border-color: rgba(0, 0, 0, 0.5);
1318
+ transform: scale(1.1);
1319
+ }
1320
+
1321
+ .comment-thread-popover__history {
1322
+ max-height: 220px;
1323
+ overflow-y: auto;
1324
+ padding: 10px 12px;
1325
+ display: flex;
1326
+ flex-direction: column;
1327
+ gap: 8px;
1328
+ flex-shrink: 0;
1329
+ }
1330
+
1331
+ /* Скрываем блок истории когда сообщений нет */
1332
+ .comment-thread-popover__history:not(.is-visible) {
1333
+ display: none;
1334
+ }
1335
+
1336
+ /* Строка сообщения: аватар слева + колонка (мета + текст) */
1337
+ .comment-thread-msg {
1338
+ display: flex;
1339
+ gap: 8px;
1340
+ align-items: flex-start;
1341
+ }
1342
+
1343
+ .comment-thread-msg__avatar-wrap {
1344
+ flex: 0 0 24px;
1345
+ width: 24px;
1346
+ height: 24px;
1347
+ border-radius: 50%;
1348
+ overflow: hidden;
1349
+ background: #EDE9FE;
1350
+ position: relative;
1351
+ flex-shrink: 0;
1352
+ }
1353
+
1354
+ .comment-thread-msg__avatar {
1355
+ position: absolute;
1356
+ inset: 0;
1357
+ width: 100%;
1358
+ height: 100%;
1359
+ object-fit: cover;
1360
+ border-radius: 50%;
1361
+ }
1362
+
1363
+ .comment-thread-msg__initials {
1364
+ position: absolute;
1365
+ inset: 0;
1366
+ display: flex;
1367
+ align-items: center;
1368
+ justify-content: center;
1369
+ font-size: 10px;
1370
+ font-weight: 700;
1371
+ line-height: 1;
1372
+ color: #7c4dff;
1373
+ user-select: none;
1374
+ }
1375
+
1376
+ .comment-thread-msg__col {
1377
+ flex: 1;
1378
+ min-width: 0;
1379
+ display: flex;
1380
+ flex-direction: column;
1381
+ gap: 2px;
1382
+ }
1383
+
1384
+ .comment-thread-msg__meta {
1385
+ display: flex;
1386
+ align-items: baseline;
1387
+ gap: 5px;
1388
+ white-space: nowrap;
1389
+ }
1390
+
1391
+ .comment-thread-msg__name {
1392
+ font-size: 11px;
1393
+ font-weight: 600;
1394
+ color: #374151;
1395
+ overflow: hidden;
1396
+ text-overflow: ellipsis;
1397
+ max-width: 120px;
1398
+ }
1399
+
1400
+ .comment-thread-msg__time {
1401
+ font-size: 10px;
1402
+ color: #9CA3AF;
1403
+ white-space: nowrap;
1404
+ flex-shrink: 0;
1405
+ }
1406
+
1407
+ .comment-thread-msg__body {
1408
+ font-size: 12px;
1409
+ color: #374151;
1410
+ line-height: 1.45;
1411
+ word-break: break-word;
1412
+ }
1413
+
1414
+ .comment-thread-popover__footer {
1415
+ border-top: 1px solid #F3F4F6;
1416
+ padding: 10px 12px;
1417
+ padding-right: 48px;
1418
+ position: relative;
1419
+ pointer-events: auto;
1420
+ display: block;
1421
+ flex-shrink: 0;
1422
+ }
1423
+
1424
+ /* В draft-режиме нет разделителя сверху — нет контента выше */
1425
+ .comment-thread-popover--draft .comment-thread-popover__footer {
1426
+ border-top: 0;
1427
+ }
1428
+
1429
+ .comment-thread-popover__footer .moodboard-chat__textarea {
1430
+ min-height: 36px;
1431
+ height: 36px;
1432
+ padding: 6px 0;
1433
+ font-size: 13px;
1434
+ width: 100%;
1435
+ display: block;
1436
+ }
1437
+
1438
+ /* Синяя круглая кнопка — абсолютно в правом нижнем углу */
1439
+ .comment-thread-popover__footer .moodboard-chat__send {
1440
+ position: absolute;
1441
+ right: 10px;
1442
+ bottom: 10px;
1443
+ width: 28px;
1444
+ height: 28px;
1445
+ background: #3B82F6;
1446
+ color: #ffffff;
1447
+ border: none;
1448
+ border-radius: 50%;
1449
+ }
1450
+
1451
+ .comment-thread-popover__footer .moodboard-chat__send[data-state="idle"] {
1452
+ background: #3B82F6;
1453
+ color: #ffffff;
1454
+ opacity: 0.45;
1455
+ }
1456
+
1457
+ .comment-thread-popover__footer .moodboard-chat__send[data-state="ready"] {
1458
+ background: #3B82F6;
1459
+ color: #ffffff;
1460
+ opacity: 1;
1461
+ }
1462
+
1463
+ .comment-thread-popover__footer::after {
1464
+ display: none;
1465
+ }
1466
+
1467
+ /* ── Боковая панель: список комментариев ─────────────────────────── */
1468
+
1469
+ .moodboard-comments-list {
1470
+ position: absolute;
1471
+ top: 12px;
1472
+ right: 12px;
1473
+ bottom: 72px;
1474
+ width: 320px;
1475
+ z-index: 25;
1476
+ flex-direction: column;
1477
+ background: #ffffff;
1478
+ border-radius: 16px;
1479
+ overflow: hidden;
1480
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);
1481
+ font-family: 'Roboto', Arial, sans-serif;
1482
+ color: #374151;
1483
+ pointer-events: auto;
1484
+ }
1485
+
1486
+ .moodboard-comments-list__header {
1487
+ display: flex;
1488
+ align-items: center;
1489
+ gap: 8px;
1490
+ padding: 12px 14px;
1491
+ border-bottom: 1px solid #F3F4F6;
1492
+ flex-shrink: 0;
1493
+ }
1494
+
1495
+ .moodboard-comments-list__close {
1496
+ flex: 0 0 auto;
1497
+ width: 28px;
1498
+ height: 28px;
1499
+ padding: 0;
1500
+ border: 0;
1501
+ background: transparent;
1502
+ color: #6B7280;
1503
+ border-radius: 6px;
1504
+ cursor: pointer;
1505
+ display: flex;
1506
+ align-items: center;
1507
+ justify-content: center;
1508
+ transition: background 100ms ease, color 100ms ease;
1509
+ }
1510
+
1511
+ .moodboard-comments-list__close:hover {
1512
+ background: #F3F4F6;
1513
+ color: #374151;
1514
+ }
1515
+
1516
+ .moodboard-comments-list__title {
1517
+ flex: 1;
1518
+ font-size: 14px;
1519
+ font-weight: 600;
1520
+ color: #111827;
1521
+ }
1522
+
1523
+ .moodboard-comments-list__body {
1524
+ flex: 1;
1525
+ overflow-y: auto;
1526
+ padding: 8px;
1527
+ display: flex;
1528
+ flex-direction: column;
1529
+ gap: 6px;
1530
+ }
1531
+
1532
+ .moodboard-comments-list__empty {
1533
+ padding: 32px 16px;
1534
+ text-align: center;
1535
+ font-size: 13px;
1536
+ color: #9CA3AF;
1537
+ }
1538
+
1539
+ .moodboard-comments-list__card {
1540
+ border-radius: 12px;
1541
+ border: 1px solid #F3F4F6;
1542
+ background: #FAFAFA;
1543
+ padding: 10px 12px;
1544
+ cursor: pointer;
1545
+ display: flex;
1546
+ flex-direction: column;
1547
+ gap: 6px;
1548
+ transition: background 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
1549
+ }
1550
+
1551
+ .moodboard-comments-list__card:hover {
1552
+ background: #F9FAFB;
1553
+ border-color: #E5E7EB;
1554
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
1555
+ }
1556
+
1557
+ .moodboard-comments-list__card--resolved {
1558
+ opacity: 0.7;
1559
+ }
1560
+
1561
+ .moodboard-comments-list__card-top {
1562
+ display: flex;
1563
+ align-items: center;
1564
+ gap: 6px;
1565
+ }
1566
+
1567
+ .moodboard-comments-list__card-dot {
1568
+ flex: 0 0 10px;
1569
+ width: 10px;
1570
+ height: 10px;
1571
+ border-radius: 50%;
1572
+ background: #7c4dff;
1573
+ }
1574
+
1575
+ .moodboard-comments-list__card-meta {
1576
+ display: flex;
1577
+ align-items: baseline;
1578
+ gap: 6px;
1579
+ flex: 1;
1580
+ min-width: 0;
1581
+ }
1582
+
1583
+ .moodboard-comments-list__card-author {
1584
+ font-size: 12px;
1585
+ font-weight: 600;
1586
+ color: #374151;
1587
+ overflow: hidden;
1588
+ text-overflow: ellipsis;
1589
+ white-space: nowrap;
1590
+ max-width: 120px;
1591
+ }
1592
+
1593
+ .moodboard-comments-list__card-time {
1594
+ font-size: 11px;
1595
+ color: #9CA3AF;
1596
+ white-space: nowrap;
1597
+ flex-shrink: 0;
1598
+ }
1599
+
1600
+ .moodboard-comments-list__card-body {
1601
+ font-size: 13px;
1602
+ color: #374151;
1603
+ line-height: 1.45;
1604
+ word-break: break-word;
1605
+ display: -webkit-box;
1606
+ -webkit-line-clamp: 3;
1607
+ -webkit-box-orient: vertical;
1608
+ overflow: hidden;
1609
+ }
1610
+
1611
+ .moodboard-comments-list__card-replies {
1612
+ font-size: 11px;
1613
+ color: #6B7280;
1614
+ }
1615
+
1616
+ .moodboard-comments-list__card-actions {
1617
+ display: flex;
1618
+ align-items: center;
1619
+ gap: 6px;
1620
+ margin-top: 2px;
1621
+ }
1622
+
1623
+ .moodboard-comments-list__resolve-btn,
1624
+ .moodboard-comments-list__delete-btn {
1625
+ display: inline-flex;
1626
+ align-items: center;
1627
+ gap: 4px;
1628
+ font-size: 11px;
1629
+ font-family: inherit;
1630
+ padding: 3px 7px;
1631
+ border: 1px solid #E5E7EB;
1632
+ border-radius: 6px;
1633
+ background: transparent;
1634
+ cursor: pointer;
1635
+ transition: background 100ms ease, border-color 100ms ease, color 100ms ease;
1636
+ }
1637
+
1638
+ .moodboard-comments-list__resolve-btn {
1639
+ color: #6B7280;
1640
+ }
1641
+
1642
+ .moodboard-comments-list__resolve-btn:hover {
1643
+ background: #F0FDF4;
1644
+ border-color: #22C55E;
1645
+ color: #16A34A;
1646
+ }
1647
+
1648
+ .moodboard-comments-list__resolve-btn--resolved {
1649
+ border-color: #22C55E;
1650
+ color: #22C55E;
1651
+ background: #F0FDF4;
1652
+ }
1653
+
1654
+ .moodboard-comments-list__resolve-btn--resolved:hover {
1655
+ background: #DCFCE7;
1656
+ border-color: #16A34A;
1657
+ color: #16A34A;
1658
+ }
1659
+
1660
+ .moodboard-comments-list__delete-btn {
1661
+ color: #9CA3AF;
1662
+ border-color: transparent;
1663
+ padding: 3px 5px;
1664
+ }
1665
+
1666
+ .moodboard-comments-list__delete-btn:hover {
1667
+ background: #FEF2F2;
1668
+ border-color: #FECACA;
1669
+ color: #EF4444;
1670
+ }