collabdocchat 1.2.13 → 2.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 (62) hide show
  1. package/README.md +219 -218
  2. package/index.html +2 -0
  3. package/install-and-start.bat +5 -0
  4. package/install-and-start.sh +5 -0
  5. package/package.json +9 -2
  6. package/scripts/pre-publish-check.js +213 -0
  7. package/scripts/start-app.js +15 -15
  8. package/server/index.js +38 -6
  9. package/server/middleware/cache.js +115 -0
  10. package/server/middleware/errorHandler.js +209 -0
  11. package/server/models/Document.js +66 -59
  12. package/server/models/File.js +49 -43
  13. package/server/models/Group.js +6 -0
  14. package/server/models/KnowledgeBase.js +254 -0
  15. package/server/models/Message.js +43 -0
  16. package/server/models/Task.js +87 -55
  17. package/server/models/User.js +67 -60
  18. package/server/models/Workflow.js +249 -0
  19. package/server/routes/ai.js +327 -0
  20. package/server/routes/audit.js +245 -210
  21. package/server/routes/backup.js +108 -0
  22. package/server/routes/chunked-upload.js +343 -0
  23. package/server/routes/export.js +440 -0
  24. package/server/routes/files.js +294 -218
  25. package/server/routes/groups.js +182 -0
  26. package/server/routes/knowledge.js +509 -0
  27. package/server/routes/tasks.js +257 -110
  28. package/server/routes/workflows.js +380 -0
  29. package/server/utils/backup.js +439 -0
  30. package/server/utils/cache.js +223 -0
  31. package/server/utils/workflow-engine.js +479 -0
  32. package/server/websocket/enhanced.js +509 -0
  33. package/server/websocket/index.js +233 -1
  34. package/src/components/knowledge-modal.js +485 -0
  35. package/src/components/optimized-poll-detail.js +724 -0
  36. package/src/main.js +5 -0
  37. package/src/pages/admin-dashboard.js +2248 -44
  38. package/src/pages/optimized-backup-view.js +616 -0
  39. package/src/pages/optimized-knowledge-view.js +803 -0
  40. package/src/pages/optimized-task-detail.js +843 -0
  41. package/src/pages/optimized-workflow-view.js +806 -0
  42. package/src/pages/simplified-workflows.js +651 -0
  43. package/src/pages/user-dashboard.js +677 -58
  44. package/src/services/api.js +65 -1
  45. package/src/services/auth.js +1 -1
  46. package/src/services/websocket.js +124 -16
  47. package/src/styles/collaboration-modern.js +708 -0
  48. package/src/styles/enhancements.css +392 -0
  49. package/src/styles/main.css +620 -1420
  50. package/src/styles/responsive.css +1000 -0
  51. package/src/styles/sidebar-fix.css +60 -0
  52. package/src/utils/ai-assistant.js +1398 -0
  53. package/src/utils/chat-enhancements.js +509 -0
  54. package/src/utils/collaboration-enhancer.js +1151 -0
  55. package/src/utils/feature-integrator.js +1724 -0
  56. package/src/utils/onboarding-guide.js +734 -0
  57. package/src/utils/performance.js +394 -0
  58. package/src/utils/permission-manager.js +890 -0
  59. package/src/utils/responsive-handler.js +491 -0
  60. package/src/utils/theme-manager.js +811 -0
  61. package/src/utils/ui-enhancements-loader.js +329 -0
  62. package/USAGE.md +0 -298
@@ -0,0 +1,708 @@
1
+ /**
2
+ * 优化后的协作工具样式
3
+ * 美化白板、投票、代码编辑器等协作工具界面
4
+ */
5
+
6
+ export function addCollaborationStyles() {
7
+ if (document.getElementById('collaboration-modern-styles')) return;
8
+
9
+ const style = document.createElement('style');
10
+ style.id = 'collaboration-modern-styles';
11
+ style.textContent = `
12
+ /* ========================================
13
+ 协作工具 - 现代化样式
14
+ ======================================== */
15
+
16
+ /* 协作工具内容区域 - 添加滚动 */
17
+ .collab-tools-content {
18
+ max-height: calc(100vh - 250px);
19
+ overflow-y: auto;
20
+ overflow-x: hidden;
21
+ padding: 10px;
22
+ }
23
+
24
+ .collab-tools-content::-webkit-scrollbar {
25
+ width: 8px;
26
+ }
27
+
28
+ .collab-tools-content::-webkit-scrollbar-track {
29
+ background: var(--bg-dark);
30
+ border-radius: 4px;
31
+ }
32
+
33
+ .collab-tools-content::-webkit-scrollbar-thumb {
34
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
35
+ border-radius: 4px;
36
+ }
37
+
38
+ .collab-tools-content::-webkit-scrollbar-thumb:hover {
39
+ background: linear-gradient(135deg, var(--secondary) 0%, var(--primary) 100%);
40
+ }
41
+
42
+ /* 白板容器 */
43
+ .whiteboard-container {
44
+ display: flex;
45
+ flex-direction: column;
46
+ height: 100%;
47
+ min-height: 500px;
48
+ background: var(--bg-dark);
49
+ border-radius: 16px;
50
+ overflow: hidden;
51
+ }
52
+
53
+ /* 白板工具栏 */
54
+ .whiteboard-toolbar {
55
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(99,102,241,0.05) 100%);
56
+ padding: 16px;
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 12px;
60
+ flex-wrap: wrap;
61
+ border-bottom: 2px solid var(--border);
62
+ }
63
+
64
+ .tool-btn {
65
+ padding: 10px 16px;
66
+ background: var(--bg-dark);
67
+ border: 2px solid var(--border);
68
+ border-radius: 10px;
69
+ color: var(--text-primary);
70
+ font-size: 14px;
71
+ font-weight: 600;
72
+ cursor: pointer;
73
+ transition: all 0.3s ease;
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 6px;
77
+ }
78
+
79
+ .tool-btn:hover {
80
+ border-color: var(--primary);
81
+ transform: translateY(-2px);
82
+ box-shadow: 0 4px 12px rgba(99,102,241,0.2);
83
+ }
84
+
85
+ .tool-btn.active {
86
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
87
+ color: white;
88
+ border-color: var(--primary);
89
+ }
90
+
91
+ #colorPicker {
92
+ width: 50px;
93
+ height: 40px;
94
+ border: 2px solid var(--border);
95
+ border-radius: 10px;
96
+ cursor: pointer;
97
+ transition: all 0.3s ease;
98
+ }
99
+
100
+ #colorPicker:hover {
101
+ border-color: var(--primary);
102
+ transform: scale(1.1);
103
+ }
104
+
105
+ #brushSize {
106
+ width: 120px;
107
+ height: 8px;
108
+ border-radius: 4px;
109
+ background: var(--bg-dark);
110
+ outline: none;
111
+ -webkit-appearance: none;
112
+ }
113
+
114
+ #brushSize::-webkit-slider-thumb {
115
+ -webkit-appearance: none;
116
+ width: 20px;
117
+ height: 20px;
118
+ border-radius: 50%;
119
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
120
+ cursor: pointer;
121
+ box-shadow: 0 2px 8px rgba(99,102,241,0.4);
122
+ }
123
+
124
+ #brushSize::-moz-range-thumb {
125
+ width: 20px;
126
+ height: 20px;
127
+ border-radius: 50%;
128
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
129
+ cursor: pointer;
130
+ box-shadow: 0 2px 8px rgba(99,102,241,0.4);
131
+ border: none;
132
+ }
133
+
134
+ /* 画布 */
135
+ #whiteboard {
136
+ flex: 1;
137
+ background: white;
138
+ cursor: crosshair;
139
+ margin: 20px;
140
+ border-radius: 12px;
141
+ box-shadow: 0 4px 20px rgba(0,0,0,0.1);
142
+ min-height: 300px;
143
+ max-height: 500px;
144
+ }
145
+
146
+ /* 白板底部 */
147
+ .whiteboard-footer {
148
+ background: var(--bg-card);
149
+ padding: 16px;
150
+ display: flex;
151
+ justify-content: space-between;
152
+ align-items: center;
153
+ border-top: 2px solid var(--border);
154
+ }
155
+
156
+ .whiteboard-users {
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 8px;
160
+ flex-wrap: wrap;
161
+ }
162
+
163
+ .user-badge {
164
+ padding: 6px 12px;
165
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
166
+ color: white;
167
+ border-radius: 8px;
168
+ font-size: 12px;
169
+ font-weight: 600;
170
+ display: inline-flex;
171
+ align-items: center;
172
+ gap: 6px;
173
+ }
174
+
175
+ .whiteboard-status {
176
+ display: flex;
177
+ gap: 8px;
178
+ }
179
+
180
+ .status-badge {
181
+ padding: 8px 16px;
182
+ border-radius: 8px;
183
+ font-size: 13px;
184
+ font-weight: 700;
185
+ display: flex;
186
+ align-items: center;
187
+ gap: 6px;
188
+ }
189
+
190
+ .status-active {
191
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
192
+ color: white;
193
+ }
194
+
195
+ .status-locked {
196
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
197
+ color: white;
198
+ }
199
+
200
+ /* 绘画通知 */
201
+ .drawing-notification {
202
+ animation: slideInRight 0.3s ease;
203
+ }
204
+
205
+ @keyframes slideInRight {
206
+ from {
207
+ opacity: 0;
208
+ transform: translateX(20px);
209
+ }
210
+ to {
211
+ opacity: 1;
212
+ transform: translateX(0);
213
+ }
214
+ }
215
+
216
+ @keyframes slideOut {
217
+ from {
218
+ opacity: 1;
219
+ transform: translateX(0);
220
+ }
221
+ to {
222
+ opacity: 0;
223
+ transform: translateX(20px);
224
+ }
225
+ }
226
+
227
+ /* 投票创建器 */
228
+ .poll-creator {
229
+ background: var(--bg-dark);
230
+ border-radius: 16px;
231
+ padding: 24px;
232
+ max-width: 600px;
233
+ margin: 0 auto;
234
+ max-height: calc(100vh - 300px);
235
+ overflow-y: auto;
236
+ }
237
+
238
+ .poll-creator h3 {
239
+ margin: 0 0 8px;
240
+ font-size: 24px;
241
+ color: var(--text-primary);
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 10px;
245
+ }
246
+
247
+ .info-text {
248
+ margin: 0 0 24px;
249
+ padding: 12px;
250
+ background: rgba(99,102,241,0.1);
251
+ border-left: 4px solid var(--primary);
252
+ border-radius: 8px;
253
+ font-size: 14px;
254
+ color: var(--text-secondary);
255
+ line-height: 1.6;
256
+ }
257
+
258
+ .form-group {
259
+ margin-bottom: 20px;
260
+ }
261
+
262
+ .form-group label {
263
+ display: block;
264
+ margin-bottom: 8px;
265
+ font-size: 14px;
266
+ font-weight: 600;
267
+ color: var(--text-primary);
268
+ }
269
+
270
+ .form-group input[type="text"],
271
+ .form-group input[type="datetime-local"],
272
+ .form-group textarea {
273
+ width: 100%;
274
+ padding: 12px 16px;
275
+ background: var(--bg-card);
276
+ border: 2px solid var(--border);
277
+ border-radius: 10px;
278
+ color: var(--text-primary);
279
+ font-size: 14px;
280
+ font-family: inherit;
281
+ transition: all 0.3s ease;
282
+ }
283
+
284
+ .form-group input:focus,
285
+ .form-group textarea:focus {
286
+ outline: none;
287
+ border-color: var(--primary);
288
+ box-shadow: 0 0 0 3px rgba(99,102,241,0.1);
289
+ }
290
+
291
+ #pollOptions {
292
+ display: flex;
293
+ flex-direction: column;
294
+ gap: 10px;
295
+ margin-bottom: 12px;
296
+ }
297
+
298
+ .poll-option {
299
+ padding: 12px 16px;
300
+ background: var(--bg-card);
301
+ border: 2px solid var(--border);
302
+ border-radius: 10px;
303
+ color: var(--text-primary);
304
+ font-size: 14px;
305
+ transition: all 0.3s ease;
306
+ }
307
+
308
+ .poll-option:focus {
309
+ outline: none;
310
+ border-color: var(--primary);
311
+ box-shadow: 0 0 0 3px rgba(99,102,241,0.1);
312
+ }
313
+
314
+ /* 成功消息 */
315
+ .success-message {
316
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(16,185,129,0.05) 100%);
317
+ border: 2px solid var(--success);
318
+ border-radius: 16px;
319
+ padding: 32px;
320
+ text-align: center;
321
+ max-width: 500px;
322
+ margin: 0 auto;
323
+ }
324
+
325
+ .success-message h3 {
326
+ margin: 0 0 16px;
327
+ font-size: 24px;
328
+ color: var(--success);
329
+ }
330
+
331
+ .success-message p {
332
+ margin: 8px 0;
333
+ font-size: 14px;
334
+ color: var(--text-primary);
335
+ }
336
+
337
+ /* 代码编辑器 */
338
+ .code-editor {
339
+ display: flex;
340
+ flex-direction: column;
341
+ height: 100%;
342
+ background: var(--bg-dark);
343
+ border-radius: 16px;
344
+ overflow: hidden;
345
+ }
346
+
347
+ .editor-toolbar {
348
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(99,102,241,0.05) 100%);
349
+ padding: 16px;
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 12px;
353
+ border-bottom: 2px solid var(--border);
354
+ }
355
+
356
+ #languageSelect {
357
+ padding: 10px 16px;
358
+ background: var(--bg-dark);
359
+ border: 2px solid var(--border);
360
+ border-radius: 10px;
361
+ color: var(--text-primary);
362
+ font-size: 14px;
363
+ font-weight: 600;
364
+ cursor: pointer;
365
+ transition: all 0.3s ease;
366
+ }
367
+
368
+ #languageSelect:focus {
369
+ outline: none;
370
+ border-color: var(--primary);
371
+ }
372
+
373
+ #codeEditor {
374
+ flex: 1;
375
+ padding: 20px;
376
+ background: #1e1e1e;
377
+ color: #d4d4d4;
378
+ border: none;
379
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
380
+ font-size: 14px;
381
+ line-height: 1.6;
382
+ resize: none;
383
+ }
384
+
385
+ #codeEditor:focus {
386
+ outline: none;
387
+ }
388
+
389
+ .code-output {
390
+ background: var(--bg-card);
391
+ border-top: 2px solid var(--border);
392
+ padding: 16px;
393
+ max-height: 200px;
394
+ overflow-y: auto;
395
+ }
396
+
397
+ .code-output h4 {
398
+ margin: 0 0 12px;
399
+ font-size: 14px;
400
+ color: var(--text-secondary);
401
+ text-transform: uppercase;
402
+ letter-spacing: 0.5px;
403
+ }
404
+
405
+ #outputContent {
406
+ margin: 0;
407
+ padding: 12px;
408
+ background: #1e1e1e;
409
+ color: #d4d4d4;
410
+ border-radius: 8px;
411
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
412
+ font-size: 13px;
413
+ line-height: 1.6;
414
+ white-space: pre-wrap;
415
+ }
416
+
417
+ /* 思维导图 */
418
+ .mindmap-container {
419
+ display: flex;
420
+ flex-direction: column;
421
+ height: 100%;
422
+ min-height: 500px;
423
+ background: var(--bg-dark);
424
+ border-radius: 16px;
425
+ overflow: hidden;
426
+ }
427
+
428
+ .mindmap-toolbar {
429
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(99,102,241,0.05) 100%);
430
+ padding: 16px;
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 12px;
434
+ flex-wrap: wrap;
435
+ border-bottom: 2px solid var(--border);
436
+ }
437
+
438
+ .mindmap-canvas {
439
+ flex: 1;
440
+ position: relative;
441
+ background: linear-gradient(90deg, rgba(99,102,241,0.03) 1px, transparent 1px),
442
+ linear-gradient(rgba(99,102,241,0.03) 1px, transparent 1px);
443
+ background-size: 20px 20px;
444
+ overflow: auto;
445
+ min-height: 400px;
446
+ }
447
+
448
+ /* SVG连线层 */
449
+ .mindmap-lines {
450
+ position: absolute;
451
+ top: 0;
452
+ left: 0;
453
+ pointer-events: none;
454
+ z-index: 1;
455
+ }
456
+
457
+ .mindmap-node {
458
+ position: absolute;
459
+ min-width: 120px;
460
+ padding: 12px 16px;
461
+ background: linear-gradient(135deg, var(--bg-card) 0%, rgba(99,102,241,0.05) 100%);
462
+ border: 2px solid var(--border);
463
+ border-radius: 12px;
464
+ cursor: move;
465
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
466
+ user-select: none;
467
+ /* 移除过渡动画以提高拖拽性能 */
468
+ transition: none;
469
+ }
470
+
471
+ /* 仅在非拖拽状态下显示悬停效果 */
472
+ .mindmap-node:not([style*="z-index: 1000"]):hover {
473
+ border-color: var(--primary);
474
+ box-shadow: 0 4px 16px rgba(99,102,241,0.2);
475
+ z-index: 10;
476
+ transition: all 0.2s ease;
477
+ }
478
+
479
+ .mindmap-node.selected {
480
+ border-color: var(--success);
481
+ box-shadow: 0 0 0 3px rgba(16,185,129,0.3);
482
+ z-index: 20;
483
+ }
484
+
485
+ .mindmap-node.root {
486
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
487
+ color: white;
488
+ font-weight: 700;
489
+ font-size: 18px;
490
+ min-width: 180px;
491
+ padding: 16px 24px;
492
+ }
493
+
494
+ .mindmap-node.child {
495
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
496
+ color: white;
497
+ font-weight: 600;
498
+ }
499
+
500
+ .mindmap-node.grandchild {
501
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
502
+ color: white;
503
+ }
504
+
505
+ .node-content {
506
+ outline: none;
507
+ min-width: 80px;
508
+ text-align: center;
509
+ word-break: break-word;
510
+ }
511
+
512
+ .node-content:focus {
513
+ background: rgba(255,255,255,0.1);
514
+ border-radius: 4px;
515
+ padding: 2px 4px;
516
+ }
517
+
518
+ /* 思维导图连接线 */
519
+ .mindmap-line {
520
+ position: absolute;
521
+ pointer-events: none;
522
+ z-index: 1;
523
+ }
524
+
525
+ .mindmap-line line {
526
+ stroke: var(--primary);
527
+ stroke-width: 2;
528
+ stroke-linecap: round;
529
+ }
530
+
531
+ /* 节点操作按钮 */
532
+ .node-actions {
533
+ position: absolute;
534
+ top: -30px;
535
+ right: 0;
536
+ display: none;
537
+ gap: 4px;
538
+ z-index: 30;
539
+ }
540
+
541
+ .mindmap-node.selected .node-actions {
542
+ display: flex;
543
+ }
544
+
545
+ .node-action-btn {
546
+ width: 24px;
547
+ height: 24px;
548
+ border-radius: 50%;
549
+ border: none;
550
+ background: var(--bg-card);
551
+ color: var(--text-primary);
552
+ cursor: pointer;
553
+ display: flex;
554
+ align-items: center;
555
+ justify-content: center;
556
+ font-size: 12px;
557
+ transition: all 0.2s ease;
558
+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);
559
+ }
560
+
561
+ .node-action-btn:hover {
562
+ transform: scale(1.2);
563
+ background: var(--primary);
564
+ color: white;
565
+ }
566
+
567
+ .node-action-btn.delete:hover {
568
+ background: var(--danger);
569
+ }
570
+
571
+ /* 思维导图图例 */
572
+ .mindmap-legend {
573
+ position: absolute;
574
+ top: 10px;
575
+ right: 10px;
576
+ background: var(--bg-card);
577
+ border: 2px solid var(--border);
578
+ border-radius: 12px;
579
+ padding: 12px;
580
+ font-size: 12px;
581
+ z-index: 100;
582
+ }
583
+
584
+ .mindmap-legend-item {
585
+ display: flex;
586
+ align-items: center;
587
+ gap: 8px;
588
+ margin-bottom: 6px;
589
+ }
590
+
591
+ .mindmap-legend-item:last-child {
592
+ margin-bottom: 0;
593
+ }
594
+
595
+ .legend-color {
596
+ width: 20px;
597
+ height: 20px;
598
+ border-radius: 4px;
599
+ }
600
+
601
+ /* 按钮样式 */
602
+ .btn-primary,
603
+ .btn-secondary,
604
+ .btn-warning,
605
+ .btn-success,
606
+ .btn-danger {
607
+ padding: 10px 20px;
608
+ border: none;
609
+ border-radius: 10px;
610
+ font-size: 14px;
611
+ font-weight: 700;
612
+ cursor: pointer;
613
+ transition: all 0.3s ease;
614
+ display: inline-flex;
615
+ align-items: center;
616
+ gap: 8px;
617
+ }
618
+
619
+ .btn-primary {
620
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
621
+ color: white;
622
+ }
623
+
624
+ .btn-primary:hover {
625
+ transform: translateY(-2px);
626
+ box-shadow: 0 4px 12px rgba(99,102,241,0.4);
627
+ }
628
+
629
+ .btn-secondary {
630
+ background: var(--bg-card);
631
+ color: var(--text-primary);
632
+ border: 2px solid var(--border);
633
+ }
634
+
635
+ .btn-secondary:hover {
636
+ border-color: var(--primary);
637
+ transform: translateY(-2px);
638
+ }
639
+
640
+ .btn-warning {
641
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
642
+ color: white;
643
+ }
644
+
645
+ .btn-warning:hover {
646
+ transform: translateY(-2px);
647
+ box-shadow: 0 4px 12px rgba(245,158,11,0.4);
648
+ }
649
+
650
+ .btn-success {
651
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
652
+ color: white;
653
+ }
654
+
655
+ .btn-success:hover {
656
+ transform: translateY(-2px);
657
+ box-shadow: 0 4px 12px rgba(16,185,129,0.4);
658
+ }
659
+
660
+ .btn-danger {
661
+ background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
662
+ color: white;
663
+ }
664
+
665
+ .btn-danger:hover {
666
+ transform: translateY(-2px);
667
+ box-shadow: 0 4px 12px rgba(239,68,68,0.4);
668
+ }
669
+
670
+ /* 响应式 */
671
+ @media (max-width: 768px) {
672
+ .whiteboard-toolbar,
673
+ .editor-toolbar,
674
+ .mindmap-toolbar {
675
+ flex-wrap: wrap;
676
+ }
677
+
678
+ .tool-btn {
679
+ font-size: 12px;
680
+ padding: 8px 12px;
681
+ }
682
+
683
+ #brushSize {
684
+ width: 100%;
685
+ }
686
+
687
+ .whiteboard-footer {
688
+ flex-direction: column;
689
+ gap: 12px;
690
+ }
691
+ }
692
+ `;
693
+ document.head.appendChild(style);
694
+ }
695
+
696
+ // 自动加载样式
697
+ if (typeof window !== 'undefined') {
698
+ if (document.readyState === 'loading') {
699
+ document.addEventListener('DOMContentLoaded', () => {
700
+ addCollaborationStyles();
701
+ });
702
+ } else {
703
+ addCollaborationStyles();
704
+ }
705
+ }
706
+
707
+ export default { addCollaborationStyles };
708
+