@sequent-org/moodboard 1.4.32 → 1.4.33

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