@billtaofbj/explosion-image 1.0.0 → 1.2.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.
@@ -1,2 +1,2 @@
1
- .ai-chat-panel[data-v-01960100]{z-index:2000;background:#fff;border-left:1px solid #e4e7ed;flex-direction:column;height:100vh;display:flex;position:fixed;top:0;right:0;box-shadow:-2px 0 12px #0000001a}.chat-header[data-v-01960100]{background:linear-gradient(#fff,#fafafa);border-bottom:1px solid #e4e7ed;justify-content:space-between;align-items:center;min-height:44px;padding:10px 16px;display:flex}.chat-header-left[data-v-01960100]{align-items:center;gap:8px;display:flex}.chat-title[data-v-01960100]{color:#303133;font-size:14px;font-weight:600}.chat-header-right[data-v-01960100]{align-items:center;gap:2px;display:flex}.online-tag[data-v-01960100]{cursor:pointer}.mention-bell[data-v-01960100]{cursor:pointer;justify-content:center;align-items:center;padding:2px;animation:.8s ease-in-out infinite bellShake-01960100;display:flex}.mention-bell[data-v-01960100]:hover{opacity:.8}@keyframes bellShake-01960100{0%,to{transform:rotate(0)}15%{transform:rotate(15deg)}30%{transform:rotate(-15deg)}45%{transform:rotate(10deg)}60%{transform:rotate(-10deg)}75%{transform:rotate(5deg)}}.online-users-list[data-v-01960100]{flex-direction:column;gap:8px;max-height:280px;display:flex;overflow-y:auto}.online-user-item[data-v-01960100]{align-items:center;gap:10px;display:flex}.online-user-avatar[data-v-01960100]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;font-size:13px;font-weight:600;display:flex}.online-user-name[data-v-01960100]{color:#303133;text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;overflow:hidden}.role-tag[data-v-01960100]{flex-shrink:0}.self-tag[data-v-01960100]{color:#909399;flex-shrink:0;font-size:12px}.chat-messages[data-v-01960100]{flex-direction:column;flex:1;gap:12px;padding:16px;display:flex;overflow-y:auto}.chat-empty[data-v-01960100]{color:#909399;flex-direction:column;justify-content:center;align-items:center;height:100%;display:flex}.chat-empty p[data-v-01960100]{margin:8px 0 0;font-size:14px}.chat-empty-hint[data-v-01960100]{color:#c0c4cc!important;font-size:12px!important}.chat-message[data-v-01960100]{gap:10px;max-width:90%;display:flex}.chat-message-user[data-v-01960100]{flex-direction:row-reverse;align-self:flex-end}.chat-message-ai[data-v-01960100],.chat-message-other[data-v-01960100]{align-self:flex-start}.message-avatar[data-v-01960100]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:13px;font-weight:600;display:flex}.message-avatar.ai[data-v-01960100]{background:linear-gradient(135deg,#409eff,#337ecc)}.message-content[data-v-01960100]{flex-direction:column;gap:4px;display:flex}.chat-message-user .message-content[data-v-01960100]{align-items:flex-end}.message-meta[data-v-01960100]{align-items:center;gap:6px;padding:0 4px;display:flex}.message-sender[data-v-01960100]{font-size:11px;font-weight:600}.message-mention[data-v-01960100]{color:#409eff;font-size:11px;font-weight:600}.message-text[data-v-01960100]{word-break:break-word;border-radius:12px;padding:10px 14px;font-size:13px;line-height:1.6}.chat-message-ai .message-text[data-v-01960100]{color:#303133;background:#f4f4f5;border-top-left-radius:4px}.chat-message-user .message-text[data-v-01960100]{color:#fff;background:linear-gradient(135deg,#409eff,#337ecc);border-top-right-radius:4px}.chat-message-other .message-text[data-v-01960100]{color:#303133;background:#f0f9ff;border:1px solid #d9ecff;border-top-left-radius:4px}.message-time[data-v-01960100]{color:#c0c4cc;padding:0 4px;font-size:11px}.chat-input-area[data-v-01960100]{background:#fafafa;border-top:1px solid #e4e7ed;padding:12px 16px}.chat-input-wrapper[data-v-01960100]{align-items:flex-end;gap:8px;display:flex;position:relative}.chat-input-wrapper[data-v-01960100] .el-textarea__inner{border:1px solid #dcdfe6;border-radius:10px;padding:8px 12px;font-size:13px;box-shadow:0 1px 4px #0000000f}.chat-input-wrapper[data-v-01960100] .el-textarea__inner:focus{border-color:#409eff;box-shadow:0 1px 6px #409eff26}.send-btn[data-v-01960100]{flex-shrink:0;width:34px;height:34px}.mention-popup[data-v-01960100]{z-index:10;background:#fff;border:1px solid #e4e7ed;border-radius:8px;min-width:160px;max-height:200px;margin-bottom:4px;position:absolute;bottom:100%;left:0;overflow-y:auto;box-shadow:0 4px 12px #0000001a}.mention-item[data-v-01960100]{cursor:pointer;align-items:center;gap:8px;padding:8px 12px;font-size:13px;display:flex}.mention-item[data-v-01960100]:hover,.mention-item.active[data-v-01960100]{background:#f5f7fa}.mention-avatar[data-v-01960100]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:24px;height:24px;font-size:12px;font-weight:600;display:flex}.typing-indicator[data-v-01960100]{align-items:center;gap:4px;display:flex;padding:12px 16px!important}.typing-indicator span[data-v-01960100]{background:#c0c4cc;border-radius:50%;width:6px;height:6px;animation:1.2s infinite typingBounce-01960100}.typing-indicator span[data-v-01960100]:nth-child(2){animation-delay:.2s}.typing-indicator span[data-v-01960100]:nth-child(3){animation-delay:.4s}@keyframes typingBounce-01960100{0%,60%,to{opacity:.4;transform:translateY(0)}30%{opacity:1;transform:translateY(-4px)}}.version-history-panel[data-v-87924b7c]{flex-direction:column;height:100%;display:flex}.loading-state[data-v-87924b7c],.empty-state[data-v-87924b7c]{color:#909399;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-state p[data-v-87924b7c]{margin-top:12px}.version-list[data-v-87924b7c]{flex:1;padding:0 4px;overflow-y:auto}.current-version[data-v-87924b7c]{background:#f0f9eb;border-radius:6px;flex-direction:column;gap:4px;margin-bottom:16px;padding:8px 12px;display:flex}.current-version-header[data-v-87924b7c]{align-items:center;gap:8px;display:flex}.version-meta[data-v-87924b7c]{color:#606266;font-size:13px}.version-item[data-v-87924b7c]{cursor:pointer;border-radius:6px;align-items:center;gap:20px;padding:8px 12px;transition:background .2s;display:flex}.version-item[data-v-87924b7c]:hover{background:#f5f7fa}.version-item.active[data-v-87924b7c]{background:#ecf5ff}.version-number[data-v-87924b7c]{color:#409eff;font-size:14px;font-weight:600}.version-user[data-v-87924b7c]{color:#303133;font-size:14px}.version-time[data-v-87924b7c]{color:#909399;margin-top:2px;font-size:12px}.panel-footer[data-v-87924b7c]{justify-content:flex-end;padding:12px 0;display:flex}.toolbar[data-v-081fbd64]{background:#fff;border-bottom:1px solid #e4e7ed;justify-content:space-between;align-items:center;height:48px;padding:6px 12px;display:flex}.toolbar-left[data-v-081fbd64],.toolbar-center[data-v-081fbd64],.toolbar-right[data-v-081fbd64]{align-items:center;gap:4px;display:flex}.title-input[data-v-081fbd64]{width:180px}.collab-users[data-v-081fbd64]{align-items:center;gap:2px;margin-right:4px;display:flex}.collab-avatar[data-v-081fbd64]{color:#fff;border:2px solid #fff;border-radius:50%;justify-content:center;align-items:center;width:22px;height:22px;margin-left:-4px;font-size:10px;font-weight:600;display:flex}.group-badge[data-v-081fbd64]{position:absolute;top:-4px;right:-4px}.group-popover[data-v-081fbd64]{flex-direction:column;max-height:360px;display:flex}.group-popover-header[data-v-081fbd64]{flex-shrink:0;gap:8px;display:flex}.group-list[data-v-081fbd64]{flex:1;overflow-y:auto}.group-item[data-v-081fbd64]{cursor:pointer;border-radius:4px;justify-content:space-between;align-items:center;padding:6px 8px;transition:background .15s;display:flex}.group-item[data-v-081fbd64]:hover{background:#f5f7fa}.group-item.active[data-v-081fbd64]{background:#ecf5ff}.group-item-main[data-v-081fbd64]{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.group-name[data-v-081fbd64]{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.group-item-actions[data-v-081fbd64]{flex-shrink:0;gap:2px;display:flex}.group-empty[data-v-081fbd64]{text-align:center;color:#999;padding:16px;font-size:13px}[data-v-081fbd64] .is-active{color:#409eff;font-weight:700}.annotation-canvas[data-v-d9ef76f4]{background:#f5f5f5;justify-content:center;align-items:center;width:100%;height:100%;padding:20px;display:flex;overflow:auto}.annotation-canvas.is-dragging[data-v-d9ef76f4]{cursor:grabbing}.annotation-canvas.is-dragging[data-v-d9ef76f4] *{cursor:grabbing!important}.image-wrapper[data-v-d9ef76f4]{flex-shrink:0;display:inline-block;position:relative}.annotation-image[data-v-d9ef76f4]{-webkit-user-select:none;user-select:none;width:100%;height:100%;display:block}.upload-placeholder[data-v-d9ef76f4]{cursor:pointer;color:#999;border:2px dashed #d9d9d9;border-radius:8px;flex-direction:column;flex-shrink:0;justify-content:center;align-items:center;width:400px;height:300px;display:flex}.upload-placeholder[data-v-d9ef76f4]:hover{color:#409eff;border-color:#409eff}.annotation-group[data-v-d9ef76f4]{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.annotation-group.selected .annotation-label[data-v-d9ef76f4]{box-shadow:0 0 0 2px #409eff}.annotation-group.is-active .annotation-label[data-v-d9ef76f4]{background:#f0f7ff}.leader-line-svg[data-v-d9ef76f4]{pointer-events:none;position:absolute;top:0;left:0;overflow:visible}.annotation-label[data-v-d9ef76f4]{cursor:move;pointer-events:auto;white-space:nowrap;background:#fff;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:4px 10px;font-size:13px;transition:all .15s;display:flex;position:absolute;box-shadow:0 2px 8px #0000001f}.annotation-label[data-v-d9ef76f4]:hover{transform:translateY(-1px);box-shadow:0 4px 12px #0000002e}.annotation-label.dragging[data-v-d9ef76f4]{z-index:100;transform:scale(1.05);box-shadow:0 8px 20px #00000040}.annotation-number[data-v-d9ef76f4]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:22px;height:22px;font-size:11px;font-weight:700;transition:transform .15s;display:flex}.annotation-group.selected .annotation-number[data-v-d9ef76f4]{transform:scale(1.15)}.annotation-text[data-v-d9ef76f4]{outline:none;min-width:20px}.annotation-dot[data-v-d9ef76f4]{pointer-events:auto;cursor:move;z-index:10;border:2px solid #fff;border-radius:50%;width:12px;height:12px;transition:all .15s;position:absolute;transform:translate(-50%,-50%);box-shadow:0 2px 6px #00000040}.annotation-dot[data-v-d9ef76f4]:hover{transform:translate(-50%,-50%)scale(1.3);box-shadow:0 4px 12px #00000059}.annotation-dot.dragging[data-v-d9ef76f4]{z-index:100;transform:translate(-50%,-50%)scale(1.5);box-shadow:0 6px 16px #0006}.annotation-dot.square[data-v-d9ef76f4]{border-radius:3px}.annotation-dot.diamond[data-v-d9ef76f4]{border-radius:2px;transform:translate(-50%,-50%)rotate(45deg)}.annotation-dot.diamond.dragging[data-v-d9ef76f4]{transform:translate(-50%,-50%)rotate(45deg)scale(1.5)}.annotation-dot.arrow-point[data-v-d9ef76f4]{width:14px;height:14px;box-shadow:none!important;background:0 0!important;border:none!important}.annotation-flag[data-v-d9ef76f4]{pointer-events:auto;cursor:move;z-index:10;flex-direction:column;align-items:flex-start;display:flex;position:absolute;transform:translate(-1px,-20px)}.flag-pole[data-v-d9ef76f4]{background:currentColor;width:2px;height:18px}.flag-cloth[data-v-d9ef76f4]{border-radius:0 2px 2px 0;width:14px;height:10px;position:absolute;top:0;left:2px}.explosion-image-editor[data-v-8aef20c7]{background:#f5f5f5;flex-direction:column;height:100vh;display:flex}.ai-chat-fab[data-v-8aef20c7]{z-index:1000;position:fixed;bottom:24px;right:24px;box-shadow:0 4px 12px #00000026}.editor-body[data-v-8aef20c7]{flex:1;display:flex;overflow:hidden}.canvas-area[data-v-8aef20c7]{flex:1;overflow:auto}.props-panel[data-v-8aef20c7]{background:#fff;border-left:1px solid #e4e7ed;flex-direction:column;width:260px;padding:16px;display:flex;overflow-y:auto}.props-panel h4[data-v-8aef20c7]{color:#333;border-bottom:1px solid #eee;margin:0 0 12px;padding-bottom:8px;font-size:14px}.prop-row[data-v-8aef20c7]{margin-bottom:12px}.prop-row label[data-v-8aef20c7]{color:#666;margin-bottom:4px;font-size:12px;display:block}.font-style-btns[data-v-8aef20c7]{flex-wrap:wrap;gap:4px;display:flex}.font-style-btns .el-button[data-v-8aef20c7]{min-width:32px;padding:4px 8px}.filter-info[data-v-8aef20c7]{margin-top:8px}.filter-info .el-tag[data-v-8aef20c7]{cursor:pointer}.no-selection[data-v-8aef20c7]{color:#999;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.no-selection p[data-v-8aef20c7]{margin-top:12px;font-size:13px}.color-dialog-body[data-v-8aef20c7]{align-items:center;gap:12px;padding:8px 0;display:flex}.color-dialog-body span[data-v-8aef20c7]{font-size:14px}
1
+ .ai-chat-panel[data-v-01960100]{z-index:2000;background:#fff;border-left:1px solid #e4e7ed;flex-direction:column;height:100vh;display:flex;position:fixed;top:0;right:0;box-shadow:-2px 0 12px #0000001a}.chat-header[data-v-01960100]{background:linear-gradient(#fff,#fafafa);border-bottom:1px solid #e4e7ed;justify-content:space-between;align-items:center;min-height:44px;padding:10px 16px;display:flex}.chat-header-left[data-v-01960100]{align-items:center;gap:8px;display:flex}.chat-title[data-v-01960100]{color:#303133;font-size:14px;font-weight:600}.chat-header-right[data-v-01960100]{align-items:center;gap:2px;display:flex}.online-tag[data-v-01960100]{cursor:pointer}.mention-bell[data-v-01960100]{cursor:pointer;justify-content:center;align-items:center;padding:2px;animation:.8s ease-in-out infinite bellShake-01960100;display:flex}.mention-bell[data-v-01960100]:hover{opacity:.8}@keyframes bellShake-01960100{0%,to{transform:rotate(0)}15%{transform:rotate(15deg)}30%{transform:rotate(-15deg)}45%{transform:rotate(10deg)}60%{transform:rotate(-10deg)}75%{transform:rotate(5deg)}}.online-users-list[data-v-01960100]{flex-direction:column;gap:8px;max-height:280px;display:flex;overflow-y:auto}.online-user-item[data-v-01960100]{align-items:center;gap:10px;display:flex}.online-user-avatar[data-v-01960100]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;font-size:13px;font-weight:600;display:flex}.online-user-name[data-v-01960100]{color:#303133;text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;overflow:hidden}.role-tag[data-v-01960100]{flex-shrink:0}.self-tag[data-v-01960100]{color:#909399;flex-shrink:0;font-size:12px}.chat-messages[data-v-01960100]{flex-direction:column;flex:1;gap:12px;padding:16px;display:flex;overflow-y:auto}.chat-empty[data-v-01960100]{color:#909399;flex-direction:column;justify-content:center;align-items:center;height:100%;display:flex}.chat-empty p[data-v-01960100]{margin:8px 0 0;font-size:14px}.chat-empty-hint[data-v-01960100]{color:#c0c4cc!important;font-size:12px!important}.chat-message[data-v-01960100]{gap:10px;max-width:90%;display:flex}.chat-message-user[data-v-01960100]{flex-direction:row-reverse;align-self:flex-end}.chat-message-ai[data-v-01960100],.chat-message-other[data-v-01960100]{align-self:flex-start}.message-avatar[data-v-01960100]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:13px;font-weight:600;display:flex}.message-avatar.ai[data-v-01960100]{background:linear-gradient(135deg,#409eff,#337ecc)}.message-content[data-v-01960100]{flex-direction:column;gap:4px;display:flex}.chat-message-user .message-content[data-v-01960100]{align-items:flex-end}.message-meta[data-v-01960100]{align-items:center;gap:6px;padding:0 4px;display:flex}.message-sender[data-v-01960100]{font-size:11px;font-weight:600}.message-mention[data-v-01960100]{color:#409eff;font-size:11px;font-weight:600}.message-text[data-v-01960100]{word-break:break-word;border-radius:12px;padding:10px 14px;font-size:13px;line-height:1.6}.chat-message-ai .message-text[data-v-01960100]{color:#303133;background:#f4f4f5;border-top-left-radius:4px}.chat-message-user .message-text[data-v-01960100]{color:#fff;background:linear-gradient(135deg,#409eff,#337ecc);border-top-right-radius:4px}.chat-message-other .message-text[data-v-01960100]{color:#303133;background:#f0f9ff;border:1px solid #d9ecff;border-top-left-radius:4px}.message-time[data-v-01960100]{color:#c0c4cc;padding:0 4px;font-size:11px}.chat-input-area[data-v-01960100]{background:#fafafa;border-top:1px solid #e4e7ed;padding:12px 16px}.chat-input-wrapper[data-v-01960100]{align-items:flex-end;gap:8px;display:flex;position:relative}.chat-input-wrapper[data-v-01960100] .el-textarea__inner{border:1px solid #dcdfe6;border-radius:10px;padding:8px 12px;font-size:13px;box-shadow:0 1px 4px #0000000f}.chat-input-wrapper[data-v-01960100] .el-textarea__inner:focus{border-color:#409eff;box-shadow:0 1px 6px #409eff26}.send-btn[data-v-01960100]{flex-shrink:0;width:34px;height:34px}.mention-popup[data-v-01960100]{z-index:10;background:#fff;border:1px solid #e4e7ed;border-radius:8px;min-width:160px;max-height:200px;margin-bottom:4px;position:absolute;bottom:100%;left:0;overflow-y:auto;box-shadow:0 4px 12px #0000001a}.mention-item[data-v-01960100]{cursor:pointer;align-items:center;gap:8px;padding:8px 12px;font-size:13px;display:flex}.mention-item[data-v-01960100]:hover,.mention-item.active[data-v-01960100]{background:#f5f7fa}.mention-avatar[data-v-01960100]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:24px;height:24px;font-size:12px;font-weight:600;display:flex}.typing-indicator[data-v-01960100]{align-items:center;gap:4px;display:flex;padding:12px 16px!important}.typing-indicator span[data-v-01960100]{background:#c0c4cc;border-radius:50%;width:6px;height:6px;animation:1.2s infinite typingBounce-01960100}.typing-indicator span[data-v-01960100]:nth-child(2){animation-delay:.2s}.typing-indicator span[data-v-01960100]:nth-child(3){animation-delay:.4s}@keyframes typingBounce-01960100{0%,60%,to{opacity:.4;transform:translateY(0)}30%{opacity:1;transform:translateY(-4px)}}.version-history-panel[data-v-87924b7c]{flex-direction:column;height:100%;display:flex}.loading-state[data-v-87924b7c],.empty-state[data-v-87924b7c]{color:#909399;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-state p[data-v-87924b7c]{margin-top:12px}.version-list[data-v-87924b7c]{flex:1;padding:0 4px;overflow-y:auto}.current-version[data-v-87924b7c]{background:#f0f9eb;border-radius:6px;flex-direction:column;gap:4px;margin-bottom:16px;padding:8px 12px;display:flex}.current-version-header[data-v-87924b7c]{align-items:center;gap:8px;display:flex}.version-meta[data-v-87924b7c]{color:#606266;font-size:13px}.version-item[data-v-87924b7c]{cursor:pointer;border-radius:6px;align-items:center;gap:20px;padding:8px 12px;transition:background .2s;display:flex}.version-item[data-v-87924b7c]:hover{background:#f5f7fa}.version-item.active[data-v-87924b7c]{background:#ecf5ff}.version-number[data-v-87924b7c]{color:#409eff;font-size:14px;font-weight:600}.version-user[data-v-87924b7c]{color:#303133;font-size:14px}.version-time[data-v-87924b7c]{color:#909399;margin-top:2px;font-size:12px}.panel-footer[data-v-87924b7c]{justify-content:flex-end;padding:12px 0;display:flex}.toolbar[data-v-1c493741]{background:#fff;border-bottom:1px solid #e4e7ed;justify-content:space-between;align-items:center;height:48px;padding:6px 12px;display:flex}.toolbar-left[data-v-1c493741],.toolbar-center[data-v-1c493741],.toolbar-right[data-v-1c493741]{align-items:center;gap:4px;display:flex}.title-input[data-v-1c493741]{width:180px}.collab-users[data-v-1c493741]{align-items:center;gap:2px;margin-right:4px;display:flex}.collab-avatar[data-v-1c493741]{color:#fff;border:2px solid #fff;border-radius:50%;justify-content:center;align-items:center;width:22px;height:22px;margin-left:-4px;font-size:10px;font-weight:600;display:flex}.group-badge[data-v-1c493741]{position:absolute;top:-4px;right:-4px}.group-popover[data-v-1c493741]{flex-direction:column;max-height:360px;display:flex}.group-popover-header[data-v-1c493741]{flex-shrink:0;gap:8px;display:flex}.group-list[data-v-1c493741]{flex:1;overflow-y:auto}.group-item[data-v-1c493741]{cursor:pointer;border-radius:4px;justify-content:space-between;align-items:center;padding:6px 8px;transition:background .15s;display:flex}.group-item[data-v-1c493741]:hover{background:#f5f7fa}.group-item.active[data-v-1c493741]{background:#ecf5ff}.group-item-main[data-v-1c493741]{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.group-name[data-v-1c493741]{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.group-item-actions[data-v-1c493741]{flex-shrink:0;gap:2px;display:flex}.group-empty[data-v-1c493741]{text-align:center;color:#999;padding:16px;font-size:13px}[data-v-1c493741] .is-active{color:#409eff;font-weight:700}.annotation-canvas[data-v-d9ef76f4]{background:#f5f5f5;justify-content:center;align-items:center;width:100%;height:100%;padding:20px;display:flex;overflow:auto}.annotation-canvas.is-dragging[data-v-d9ef76f4]{cursor:grabbing}.annotation-canvas.is-dragging[data-v-d9ef76f4] *{cursor:grabbing!important}.image-wrapper[data-v-d9ef76f4]{flex-shrink:0;display:inline-block;position:relative}.annotation-image[data-v-d9ef76f4]{-webkit-user-select:none;user-select:none;width:100%;height:100%;display:block}.upload-placeholder[data-v-d9ef76f4]{cursor:pointer;color:#999;border:2px dashed #d9d9d9;border-radius:8px;flex-direction:column;flex-shrink:0;justify-content:center;align-items:center;width:400px;height:300px;display:flex}.upload-placeholder[data-v-d9ef76f4]:hover{color:#409eff;border-color:#409eff}.annotation-group[data-v-d9ef76f4]{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.annotation-group.selected .annotation-label[data-v-d9ef76f4]{box-shadow:0 0 0 2px #409eff}.annotation-group.is-active .annotation-label[data-v-d9ef76f4]{background:#f0f7ff}.leader-line-svg[data-v-d9ef76f4]{pointer-events:none;position:absolute;top:0;left:0;overflow:visible}.annotation-label[data-v-d9ef76f4]{cursor:move;pointer-events:auto;white-space:nowrap;background:#fff;border:1px solid #0000;border-radius:6px;align-items:center;gap:4px;padding:4px 10px;font-size:13px;transition:all .15s;display:flex;position:absolute;box-shadow:0 2px 8px #0000001f}.annotation-label[data-v-d9ef76f4]:hover{transform:translateY(-1px);box-shadow:0 4px 12px #0000002e}.annotation-label.dragging[data-v-d9ef76f4]{z-index:100;transform:scale(1.05);box-shadow:0 8px 20px #00000040}.annotation-number[data-v-d9ef76f4]{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:22px;height:22px;font-size:11px;font-weight:700;transition:transform .15s;display:flex}.annotation-group.selected .annotation-number[data-v-d9ef76f4]{transform:scale(1.15)}.annotation-text[data-v-d9ef76f4]{outline:none;min-width:20px}.annotation-dot[data-v-d9ef76f4]{pointer-events:auto;cursor:move;z-index:10;border:2px solid #fff;border-radius:50%;width:12px;height:12px;transition:all .15s;position:absolute;transform:translate(-50%,-50%);box-shadow:0 2px 6px #00000040}.annotation-dot[data-v-d9ef76f4]:hover{transform:translate(-50%,-50%)scale(1.3);box-shadow:0 4px 12px #00000059}.annotation-dot.dragging[data-v-d9ef76f4]{z-index:100;transform:translate(-50%,-50%)scale(1.5);box-shadow:0 6px 16px #0006}.annotation-dot.square[data-v-d9ef76f4]{border-radius:3px}.annotation-dot.diamond[data-v-d9ef76f4]{border-radius:2px;transform:translate(-50%,-50%)rotate(45deg)}.annotation-dot.diamond.dragging[data-v-d9ef76f4]{transform:translate(-50%,-50%)rotate(45deg)scale(1.5)}.annotation-dot.arrow-point[data-v-d9ef76f4]{width:14px;height:14px;box-shadow:none!important;background:0 0!important;border:none!important}.annotation-flag[data-v-d9ef76f4]{pointer-events:auto;cursor:move;z-index:10;flex-direction:column;align-items:flex-start;display:flex;position:absolute;transform:translate(-1px,-20px)}.flag-pole[data-v-d9ef76f4]{background:currentColor;width:2px;height:18px}.flag-cloth[data-v-d9ef76f4]{border-radius:0 2px 2px 0;width:14px;height:10px;position:absolute;top:0;left:2px}.explosion-image-editor[data-v-e25c1b61]{background:#f5f5f5;flex-direction:column;height:100vh;display:flex}.ai-chat-fab[data-v-e25c1b61]{z-index:1000;position:fixed;bottom:24px;right:24px;box-shadow:0 4px 12px #00000026}.editor-body[data-v-e25c1b61]{flex:1;display:flex;overflow:hidden}.canvas-area[data-v-e25c1b61]{flex:1;overflow:auto}.props-panel[data-v-e25c1b61]{background:#fff;border-left:1px solid #e4e7ed;flex-direction:column;width:260px;padding:16px;display:flex;overflow-y:auto}.props-panel h4[data-v-e25c1b61]{color:#333;border-bottom:1px solid #eee;margin:0 0 12px;padding-bottom:8px;font-size:14px}.prop-row[data-v-e25c1b61]{margin-bottom:12px}.prop-row label[data-v-e25c1b61]{color:#666;margin-bottom:4px;font-size:12px;display:block}.font-style-btns[data-v-e25c1b61]{flex-wrap:wrap;gap:4px;display:flex}.font-style-btns .el-button[data-v-e25c1b61]{min-width:32px;padding:4px 8px}.filter-info[data-v-e25c1b61]{margin-top:8px}.filter-info .el-tag[data-v-e25c1b61]{cursor:pointer}.no-selection[data-v-e25c1b61]{color:#999;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.no-selection p[data-v-e25c1b61]{margin-top:12px;font-size:13px}.color-dialog-body[data-v-e25c1b61]{align-items:center;gap:12px;padding:8px 0;display:flex}.color-dialog-body span[data-v-e25c1b61]{font-size:14px}
2
2
  /*$vite$:1*/
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?module.exports=t(require("vue"),require("@billtaofbj/core"),require("vue-router"),require("element-plus"),require("@element-plus/icons-vue"),require("axios"),require("yjs"),require("@hocuspocus/provider")):typeof define==`function`&&define.amd?define([`vue`,`@billtaofbj/core`,`vue-router`,`element-plus`,`@element-plus/icons-vue`,`axios`,`yjs`,`@hocuspocus/provider`],t):(e=typeof globalThis<`u`?globalThis:e||self,e.YourCompanyExplosionImage=t(e.Vue,e._billtaofbj_core,e.VueRouter,e.ElementPlus,e.ElementPlusIconsVue,e.axios,e.yjs,e._hocuspocus_provider))})(this,function(e,t,n,r,i,a,o,s){var c=Object.create,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,f=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty,m=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=d(t),a=0,o=i.length,s;a<o;a++)s=i[a],!p.call(e,s)&&s!==n&&l(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=u(t,s))||r.enumerable});return e},h=(e,t,n)=>(n=e==null?{}:c(f(e)),m(t||!e||!e.__esModule?l(n,`default`,{value:e,enumerable:!0}):n,e));let g=h(a,1);a=h(a),o=h(o,1);var _=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},v={class:`chat-header`},y={class:`chat-header-left`},b={class:`chat-title`},x={class:`online-users-list`},S={class:`online-user-item`},C={class:`online-user-name`},w={key:1},T={class:`online-user-name`},E={class:`chat-header-right`},D={key:0,class:`chat-empty`},O={class:`chat-empty-hint`},k={key:1},A={class:`message-content`},j={key:0,class:`message-meta`},ee={key:0,class:`message-mention`},M=[`innerHTML`],te={class:`message-time`},ne={key:1,class:`chat-message chat-message-ai`},N={class:`message-avatar ai`},P={class:`chat-input-area`},F={key:0,class:`mention-popup`},re=[`onClick`,`onMouseenter`],I={key:1},ie=_({__name:`AiChatPanel`,props:{visible:{type:Boolean,default:!1},messages:{type:Array,default:()=>[]},loading:{type:Boolean,default:!1},panelWidth:{type:Number,default:360},isCollab:{type:Boolean,default:!1},collabUsers:{type:Array,default:()=>[]},currentUser:{type:Object,default:()=>({id:``,name:``,color:``})},isOwner:{type:Boolean,default:!0},unreadMention:{type:Boolean,default:!1}},emits:[`send`,`close`,`clear`,`clear-unread`],setup(t,{emit:n}){let r=t,a=n,o=(0,e.ref)(``),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(!1),u=(0,e.ref)([]),d=(0,e.ref)(0),f=``,p=-1,m={id:`ai-assistant`,name:`AI助手`,color:`#409EFF`,isAi:!0},h=(0,e.computed)(()=>{let e=r.currentUser.id,t=new Set;return[m,...r.collabUsers.filter(n=>{let r=n.clientId||n.id||``;if(r&&r===e)return!1;let i=String(r||n.name||``);return t.has(i)?!1:(t.add(i),!0)})]}),g=(0,e.computed)(()=>h.value.length+1),_=e=>e.role===`ai`?`chat-message-ai`:r.isCollab&&e.user_id&&e.user_id!==r.currentUser.id?`chat-message-other`:`chat-message-user`,ie=e=>e.role===`ai`?{background:`linear-gradient(135deg, #409EFF, #337ECC)`}:{background:e.user_color||`#67C23A`},L=e=>(e.user_name||`U`).charAt(0),R=e=>{if(!r.isCollab)return;let t=typeof e==`string`?e:e.target?.value||o.value,n=t.length,i=t.lastIndexOf(`@`,n);if(i!==-1&&i<n){let e=t.slice(i+1,n);if(!e.includes(` `)&&!e.includes(`
2
- `)){f=e,p=i,u.value=h.value.filter(t=>t.name&&t.name.toLowerCase().includes(e.toLowerCase())),l.value=u.value.length>0,d.value=0;return}}l.value=!1},z=()=>{l.value&&(d.value=Math.min(d.value+1,u.value.length-1))},B=()=>{l.value&&(d.value=Math.max(d.value-1,0))},V=e=>{let t=o.value.slice(0,p),n=o.value.slice(p+f.length+1);o.value=`${t}@${e.name} ${n}`,l.value=!1},H=e=>{if(e){if(e.shiftKey)return;if(l.value){let t=u.value[d.value];if(t){e.preventDefault(),V(t);return}}e.preventDefault()}let t=o.value.trim();if(!t||r.loading)return;let n=null;if(r.isCollab){let e=t.match(/@(\S+)/);e&&(n=e[1])}a(`send`,t,{mentionedUser:n}),o.value=``,l.value=!1},U=()=>{(0,e.nextTick)(()=>{s.value&&(s.value.scrollTop=s.value.scrollHeight)})};return(0,e.watch)(()=>r.messages.length,U),(0,e.watch)(()=>r.messages,U,{deep:!0}),(n,r)=>{let f=(0,e.resolveComponent)(`el-icon`),p=(0,e.resolveComponent)(`el-tag`),m=(0,e.resolveComponent)(`el-popover`),U=(0,e.resolveComponent)(`el-button`),W=(0,e.resolveComponent)(`el-input`);return t.visible?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`ai-chat-panel`,style:(0,e.normalizeStyle)({width:t.panelWidth+`px`})},[(0,e.createElementVNode)(`div`,v,[(0,e.createElementVNode)(`div`,y,[(0,e.createVNode)(f,{size:18,color:`#409EFF`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1}),(0,e.createElementVNode)(`span`,b,(0,e.toDisplayString)(t.isCollab?`协作聊天`:`AI 助手`),1),t.isCollab?((0,e.openBlock)(),(0,e.createBlock)(m,{key:0,width:200,placement:`bottom-start`,trigger:`click`},{reference:(0,e.withCtx)(()=>[(0,e.createVNode)(p,{size:`small`,type:`success`,effect:`plain`,class:`online-tag`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(g.value)+`人在线 `,1)]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,x,[(0,e.createElementVNode)(`div`,S,[(0,e.createElementVNode)(`div`,{class:`online-user-avatar`,style:(0,e.normalizeStyle)({background:t.currentUser.color||`#409EFF`})},(0,e.toDisplayString)((t.currentUser.name||`U`).charAt(0)),5),(0,e.createElementVNode)(`span`,C,(0,e.toDisplayString)(t.currentUser.name||`我`),1),(0,e.createVNode)(p,{size:`small`,type:t.isOwner?`warning`:`success`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(t.isOwner?`发起人`:`协作人`),1)]),_:1},8,[`type`]),r[4]||=(0,e.createElementVNode)(`span`,{class:`self-tag`},`(我)`,-1)]),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(h.value,t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id||t.clientId,class:`online-user-item`},[(0,e.createElementVNode)(`div`,{class:`online-user-avatar`,style:(0,e.normalizeStyle)({background:t.color||`#909399`})},[t.isAi?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:14},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,w,(0,e.toDisplayString)((t.name||`U`).charAt(0)),1))],4),(0,e.createElementVNode)(`span`,T,(0,e.toDisplayString)(t.name||`未知用户`),1),t.isAi?((0,e.openBlock)(),(0,e.createBlock)(p,{key:0,size:`small`,type:`primary`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[...r[5]||=[(0,e.createTextVNode)(`AI助手`,-1)]]),_:1})):((0,e.openBlock)(),(0,e.createBlock)(p,{key:1,size:`small`,type:`success`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[...r[6]||=[(0,e.createTextVNode)(`协作人`,-1)]]),_:1}))]))),128))])]),_:1})):(0,e.createCommentVNode)(``,!0)]),(0,e.createElementVNode)(`div`,E,[t.isCollab&&t.unreadMention?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`mention-bell`,title:`有新消息`,onClick:r[0]||=e=>a(`clear-unread`)},[(0,e.createVNode)(f,{size:18,color:`#F56C6C`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Bell))]),_:1})])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(U,{text:``,circle:``,size:`small`,onClick:r[1]||=e=>n.$emit(`clear`),title:`清空对话`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Delete))]),_:1})]),_:1}),(0,e.createVNode)(U,{text:``,circle:``,size:`small`,onClick:r[2]||=e=>n.$emit(`close`),title:`关闭`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1})]),_:1})])]),(0,e.createElementVNode)(`div`,{class:`chat-messages`,ref_key:`messagesRef`,ref:s},[t.messages.length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,D,[(0,e.createVNode)(f,{size:40,color:`#c0c4cc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1}),(0,e.createElementVNode)(`p`,null,(0,e.toDisplayString)(t.isCollab?`协作聊天室`:`你好!我是 AI 助手`),1),(0,e.createElementVNode)(`p`,O,(0,e.toDisplayString)(t.isCollab?`与团队成员和AI助手实时聊天`:`可以问我任何关于文档编辑的问题`),1)])):(0,e.createCommentVNode)(``,!0),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.messages,n=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:n._msgId||n.time+n.content,class:(0,e.normalizeClass)([`chat-message`,_(n)])},[(0,e.createElementVNode)(`div`,{class:`message-avatar`,style:(0,e.normalizeStyle)(ie(n))},[n.role===`ai`?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:16},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,k,(0,e.toDisplayString)(L(n)),1))],4),(0,e.createElementVNode)(`div`,A,[t.isCollab&&n.role===`user`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,j,[(0,e.createElementVNode)(`span`,{class:`message-sender`,style:(0,e.normalizeStyle)({color:n.user_color||`#67C23A`})},(0,e.toDisplayString)(n.user_name||`用户`),5),n.mentioned_user?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,ee,`@`+(0,e.toDisplayString)(n.mentioned_user),1)):(0,e.createCommentVNode)(``,!0)])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,{class:`message-text`,innerHTML:n.content},null,8,M),(0,e.createElementVNode)(`div`,te,(0,e.toDisplayString)(n.time),1)])],2))),128)),t.loading?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ne,[(0,e.createElementVNode)(`div`,N,[(0,e.createVNode)(f,{size:16},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})]),r[7]||=(0,e.createElementVNode)(`div`,{class:`message-content`},[(0,e.createElementVNode)(`div`,{class:`message-text typing-indicator`},[(0,e.createElementVNode)(`span`),(0,e.createElementVNode)(`span`),(0,e.createElementVNode)(`span`)])],-1)])):(0,e.createCommentVNode)(``,!0)],512),(0,e.createElementVNode)(`div`,P,[(0,e.createElementVNode)(`div`,{class:`chat-input-wrapper`,ref_key:`inputWrapperRef`,ref:c},[(0,e.createVNode)(W,{modelValue:o.value,"onUpdate:modelValue":r[3]||=e=>o.value=e,type:`textarea`,autosize:{minRows:1,maxRows:4},placeholder:t.isCollab?`输入消息... @提及成员`:`输入消息...`,onKeydown:[(0,e.withKeys)((0,e.withModifiers)(H,[`exact`]),[`enter`]),(0,e.withKeys)((0,e.withModifiers)(z,[`prevent`]),[`down`]),(0,e.withKeys)((0,e.withModifiers)(B,[`prevent`]),[`up`])],onInput:R,resize:`none`},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,F,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(u.value,(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id||t.clientId,class:(0,e.normalizeClass)([`mention-item`,{active:n===d.value}]),onClick:e=>V(t),onMouseenter:e=>d.value=n},[(0,e.createElementVNode)(`div`,{class:`mention-avatar`,style:(0,e.normalizeStyle)({background:t.color||`#909399`})},[t.isAi?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:12},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,I,(0,e.toDisplayString)((t.name||`U`).charAt(0)),1))],4),(0,e.createElementVNode)(`span`,null,(0,e.toDisplayString)(t.name),1)],42,re))),128))])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(U,{class:`send-btn`,type:`primary`,circle:``,disabled:!o.value.trim()||t.loading,onClick:H},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Promotion))]),_:1})]),_:1},8,[`disabled`])],512)])],4)):(0,e.createCommentVNode)(``,!0)}}},[[`__scopeId`,`data-v-01960100`]]);function L(){let t=(0,e.ref)([]),n=(0,e.ref)(!1),r=(0,e.ref)(!1),i=(0,e.ref)([]),a=(0,e.ref)({id:``,name:``,color:``}),o=(0,e.ref)(!1),s=null,c=null,l=null,u=new Set,d=`/api/chat`,f=null,p=({ydoc:n,provider:c,onlineUsers:d})=>{if(n){r.value=!0,l=d,f&&f(),f=(0,e.watch)(l,e=>{i.value=Array.isArray(e)?e:[]},{immediate:!0,deep:!0});try{s=n.getArray(`chat-messages`),s.observe(e=>{try{e.changes.added.forEach(e=>{e.content.getContent().forEach(e=>{e&&e._msgId&&!u.has(e._msgId)&&(u.add(e._msgId),t.value=[...t.value,e],e.mentioned_user&&e.user_id!==a.value.id&&(o.value=!0))})})}catch(e){console.warn(`[useChat] Y.Array observer error:`,e)}})}catch(e){console.warn(`[useChat] Failed to create Y.Array:`,e)}}},m=e=>{a.value={...a.value,...e}},h=e=>{i.value=e||[]},_=()=>{let e=new Date;return`${e.getHours().toString().padStart(2,`0`)}:${e.getMinutes().toString().padStart(2,`0`)}`},v=async(n,i={})=>{let o={_msgId:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,role:`user`,content:n,time:_(),user_id:a.value.id,user_name:a.value.name,user_color:a.value.color,mentioned_user:i.mentionedUser||null};if(u.add(o._msgId),t.value=[...t.value,o],s&&(0,e.unref)(r))try{s.push([o])}catch(e){console.warn(`[useChat] Failed to push to Y.Array:`,e)}if(i.roomId)try{await g.default.post(d,{room_id:i.roomId,role:`user`,content:n,user_id:a.value.id,user_name:a.value.name,mentioned_user:i.mentionedUser||null})}catch(e){console.warn(`[useChat] Failed to persist message:`,e)}},y=async(n,i)=>{let a={_msgId:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,role:`ai`,content:n,time:_(),user_id:`ai-assistant`,user_name:`AI助手`};if(u.add(a._msgId),t.value=[...t.value,a],s&&(0,e.unref)(r))try{s.push([a])}catch(e){console.warn(`[useChat] Failed to push AI message to Y.Array:`,e)}if(i)try{await g.default.post(d,{room_id:i,role:`ai`,content:n,user_id:`ai-assistant`,user_name:`AI助手`})}catch(e){console.warn(`[useChat] Failed to persist AI message:`,e)}},b=async e=>{if(e)try{let n=await g.default.get(d,{params:{room_id:e}});if(Array.isArray(n.data)){let e=n.data.map(e=>({_msgId:e._msgId||`hist-${e.id||Date.now()}`,role:e.role,content:e.content,time:e.time||_(),user_id:e.user_id||``,user_name:e.user_name||``,user_color:e.user_color||``,mentioned_user:e.mentioned_user||null}));e.forEach(e=>u.add(e._msgId)),t.value=[...e,...t.value]}}catch(e){console.warn(`[useChat] Failed to load history:`,e)}},x=async e=>{if(t.value=[],u.clear(),e)try{await g.default.delete(d,{params:{room_id:e}})}catch(e){console.warn(`[useChat] Failed to clear messages on server:`,e)}},S=()=>{o.value=!1},C=()=>{if(f&&=(f(),null),s&&c){try{s.unobserve(c)}catch{}c=null}s=null,l=null,u.clear()};return(0,e.onUnmounted)(()=>C()),{messages:t,loading:n,isCollabMode:r,collabUsers:i,currentUser:a,unreadMention:o,setCollabContext:p,setCurrentUser:m,updateCollabUsers:h,sendMessage:v,sendAiMessage:y,loadHistory:b,clearMessages:x,clearUnreadMention:S,destroy:C}}var R=`/api/document-versions`,z=5e3,B=()=>{let t=(0,e.ref)([]),n=(0,e.ref)(!1);return{versions:t,loading:n,saveVersion:async({documentId:e,docType:t,content:n,userId:r,userName:i})=>{if(!e||!t||!n)return null;try{let{data:a}=await g.default.post(R,{document_id:e,doc_type:t,content:typeof n==`string`?n:JSON.stringify(n),user_id:r||null,user_name:i||null},{timeout:z});return a}catch(e){return console.warn(`[useVersionHistory] Failed to save version:`,e),null}},loadVersions:async e=>{if(!e)return[];n.value=!0;try{let{data:n}=await g.default.get(R,{params:{document_id:e},timeout:z});return t.value=n,n}catch(e){return console.warn(`[useVersionHistory] Failed to load versions:`,e),t.value=[],[]}finally{n.value=!1}},getVersionContent:async e=>{try{let{data:t}=await g.default.get(`${R}/${e}`,{timeout:z});return t}catch(e){return console.warn(`[useVersionHistory] Failed to get version content:`,e),null}}}},V={class:`version-history-panel`},H={key:0,class:`loading-state`},U={key:1,class:`empty-state`},W={key:2,class:`version-list`},ae={key:0,class:`current-version`},G={class:`current-version-header`},K={class:`version-number`},q=[`onClick`],J={class:`version-number`},oe={class:`version-user`},Y={class:`panel-footer`},se=_({__name:`VersionHistoryPanel`,props:{modelValue:{type:Boolean,default:!1},documentId:{type:[Number,String],default:null}},emits:[`update:modelValue`,`apply`],setup(t,{expose:n,emit:a}){let o=t,s=a,{versions:c,loading:l,loadVersions:u,getVersionContent:d}=B(),f=(0,e.ref)(!1),p=(0,e.ref)(null),m=(0,e.ref)(!1),h=(0,e.ref)(null);(0,e.watch)(()=>o.modelValue,e=>{f.value=e,e&&o.documentId&&(p.value=null,u(o.documentId).then(e=>{e&&e.length>0&&(h.value=e[0])}))}),(0,e.watch)(f,e=>{s(`update:modelValue`,e)});let g=e=>{p.value=e},_=async()=>{if(p.value){m.value=!0;try{let e=await d(p.value.id);e&&e.content?(h.value=p.value,p.value=null,s(`apply`,e.content),r.ElMessage.success(`已切换到版本 v`+h.value.version_number)):r.ElMessage.error(`获取版本内容失败`)}finally{m.value=!1}}},v=()=>{f.value=!1},y=e=>{if(!e)return``;let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`};return n({currentVersion:h}),(t,n)=>{let r=(0,e.resolveComponent)(`el-icon`),a=(0,e.resolveComponent)(`el-tag`),o=(0,e.resolveComponent)(`el-timeline-item`),s=(0,e.resolveComponent)(`el-timeline`),u=(0,e.resolveComponent)(`el-button`),d=(0,e.resolveComponent)(`el-drawer`);return(0,e.openBlock)(),(0,e.createBlock)(d,{modelValue:f.value,"onUpdate:modelValue":n[0]||=e=>f.value=e,title:`更新履历`,direction:`rtl`,size:`420px`,"before-close":v},{footer:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,Y,[(0,e.createVNode)(u,{type:`primary`,disabled:!p.value,loading:m.value,onClick:_},{default:(0,e.withCtx)(()=>[...n[4]||=[(0,e.createTextVNode)(` 切换到此版本 `,-1)]]),_:1},8,[`disabled`,`loading`])])]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,V,[(0,e.unref)(l)?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,H,[(0,e.createVNode)(r,{class:`is-loading`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Loading))]),_:1}),n[1]||=(0,e.createElementVNode)(`span`,null,`加载中...`,-1)])):(0,e.unref)(c).length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,U,[(0,e.createVNode)(r,{size:48,color:`#c0c4cc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Clock))]),_:1}),n[2]||=(0,e.createElementVNode)(`p`,null,`暂无历史版本`,-1)])):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,W,[h.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ae,[(0,e.createElementVNode)(`div`,G,[(0,e.createVNode)(a,{type:`success`,size:`small`},{default:(0,e.withCtx)(()=>[...n[3]||=[(0,e.createTextVNode)(`当前版本`,-1)]]),_:1}),(0,e.createElementVNode)(`span`,K,`v`+(0,e.toDisplayString)(h.value.version_number),1)])])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(s,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)((0,e.unref)(c),t=>((0,e.openBlock)(),(0,e.createBlock)(o,{key:t.id,timestamp:y(t.created_at),placement:`top`,type:p.value?.id===t.id?`primary`:``,hollow:p.value?.id!==t.id},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`version-item`,{active:p.value?.id===t.id}]),onClick:e=>g(t)},[(0,e.createElementVNode)(`span`,J,`版本号:v`+(0,e.toDisplayString)(t.version_number),1),(0,e.createElementVNode)(`span`,oe,`提交人:`+(0,e.toDisplayString)(t.user_name||`未知用户`),1)],10,q)]),_:2},1032,[`timestamp`,`type`,`hollow`]))),128))]),_:1})]))])]),_:1},8,[`modelValue`])}}},[[`__scopeId`,`data-v-87924b7c`]]),X={class:`toolbar`},Z={class:`toolbar-left`},ce={class:`toolbar-center`},le={class:`group-popover`},ue={class:`group-popover-header`},Q={class:`group-list`},$=[`onClick`],de={class:`group-name`},fe={class:`group-item-actions`},pe={key:1,class:`group-empty`},me={class:`toolbar-right`},he={key:0,class:`collab-users`},ge=[`title`],_e=_({__name:`Toolbar`,props:{title:{type:String,default:``},lineStyle:{type:String,default:`straight`},groups:{type:Array,default:()=>[]},activeGroupId:{type:String,default:null},collapsedGroups:{type:Array,default:()=>[]},isConnected:Boolean,onlineUsers:{type:Array,default:()=>[]},isJoinMode:Boolean,showHistory:{type:Boolean,default:!1}},emits:[`update:title`,`back`,`add-annotation`,`set-line-style`,`add-group`,`group-action`,`clear-group-filter`,`export`,`import-json`,`save`,`toggle-collab`,`share-collab`,`history`],setup(t){let n=t,r=(0,e.ref)(n.title);(0,e.watch)(()=>n.title,e=>r.value=e);let a={straight:{label:`直线`,icon:i.SemiSelect},polyline:{label:`折线`,icon:i.Connection},"right-angle":{label:`直角折线`,icon:i.Right},curve:{label:`曲线`,icon:i.TrendCharts},wave:{label:`波浪线`,icon:i.TrendCharts},dashed:{label:`虚线`,icon:i.Minus},dotted:{label:`点线`,icon:i.MoreFilled},dashdot:{label:`点划线`,icon:i.SemiSelect}},o=(0,e.computed)(()=>a[n.lineStyle]?.label||`引线`),s=(0,e.computed)(()=>a[n.lineStyle]?.icon||i.SemiSelect);return(n,a)=>{let c=(0,e.resolveComponent)(`el-icon`),l=(0,e.resolveComponent)(`el-button`),u=(0,e.resolveComponent)(`el-input`),d=(0,e.resolveComponent)(`el-tooltip`),f=(0,e.resolveComponent)(`el-divider`),p=(0,e.resolveComponent)(`el-dropdown-item`),m=(0,e.resolveComponent)(`el-dropdown-menu`),h=(0,e.resolveComponent)(`el-dropdown`),g=(0,e.resolveComponent)(`el-badge`),_=(0,e.resolveComponent)(`el-tag`),v=(0,e.resolveComponent)(`el-popover`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,X,[(0,e.createElementVNode)(`div`,Z,[(0,e.createVNode)(l,{onClick:a[0]||=e=>n.$emit(`back`),size:`small`,circle:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowLeft))]),_:1})]),_:1}),(0,e.createVNode)(u,{modelValue:r.value,"onUpdate:modelValue":a[1]||=e=>r.value=e,onBlur:a[2]||=e=>n.$emit(`update:title`,r.value),placeholder:`输入标题`,class:`title-input`,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,ce,[(0,e.createVNode)(d,{content:`添加标注`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:a[3]||=e=>n.$emit(`add-annotation`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Location))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(f,{direction:`vertical`}),(0,e.createVNode)(h,{trigger:`click`,onCommand:a[4]||=e=>n.$emit(`set-line-style`,e)},{dropdown:(0,e.withCtx)(()=>[(0,e.createVNode)(m,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(p,{command:`straight`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`straight`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.SemiSelect))]),_:1}),a[14]||=(0,e.createTextVNode)(`直线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`polyline`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`polyline`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Connection))]),_:1}),a[15]||=(0,e.createTextVNode)(`折线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`right-angle`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`right-angle`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Right))]),_:1}),a[16]||=(0,e.createTextVNode)(`直角折线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`curve`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`curve`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.TrendCharts))]),_:1}),a[17]||=(0,e.createTextVNode)(`曲线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`wave`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`wave`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.TrendCharts))]),_:1}),a[18]||=(0,e.createTextVNode)(`波浪线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{divided:``,command:`dashed`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`dashed`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Minus))]),_:1}),a[19]||=(0,e.createTextVNode)(`虚线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`dotted`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`dotted`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.MoreFilled))]),_:1}),a[20]||=(0,e.createTextVNode)(`点线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`dashdot`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`dashdot`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.SemiSelect))]),_:1}),a[21]||=(0,e.createTextVNode)(`点划线 `,-1)]),_:1},8,[`class`])]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(s.value)))]),_:1}),(0,e.createTextVNode)(` `+(0,e.toDisplayString)(o.value)+` `,1),(0,e.createVNode)(c,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(f,{direction:`vertical`}),(0,e.createVNode)(v,{placement:`bottom`,width:280,trigger:`click`},{reference:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`},{default:(0,e.withCtx)(()=>[a[22]||=(0,e.createTextVNode)(` 分组 `,-1),t.activeGroupId?((0,e.openBlock)(),(0,e.createBlock)(g,{key:0,value:1,offset:[-2,-2],class:`group-badge`})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(c,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,le,[(0,e.createElementVNode)(`div`,ue,[(0,e.createVNode)(l,{size:`small`,onClick:a[5]||=e=>n.$emit(`add-group`,`new`),type:`primary`,plain:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Plus))]),_:1}),a[23]||=(0,e.createTextVNode)(`新建分组 `,-1)]),_:1}),t.activeGroupId?((0,e.openBlock)(),(0,e.createBlock)(l,{key:0,size:`small`,onClick:a[6]||=e=>n.$emit(`clear-group-filter`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1}),a[24]||=(0,e.createTextVNode)(`显示全部 `,-1)]),_:1})):(0,e.createCommentVNode)(``,!0)]),t.groups.length?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,style:{margin:`8px 0`}})):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,Q,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.groups,r=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:r.id,class:(0,e.normalizeClass)([`group-item`,{active:t.activeGroupId===r.id}])},[(0,e.createElementVNode)(`div`,{class:`group-item-main`,onClick:e=>n.$emit(`group-action`,`filter`,r.id)},[(0,e.createElementVNode)(`span`,de,(0,e.toDisplayString)(r.name),1),t.activeGroupId===r.id?((0,e.openBlock)(),(0,e.createBlock)(_,{key:0,size:`small`,type:`primary`},{default:(0,e.withCtx)(()=>[...a[25]||=[(0,e.createTextVNode)(`筛选`,-1)]]),_:1})):(0,e.createCommentVNode)(``,!0)],8,$),(0,e.createElementVNode)(`div`,fe,[(0,e.createVNode)(d,{content:`展开/折叠`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:(0,e.withModifiers)(e=>n.$emit(`group-action`,`collapse`,r.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(t.collapsedGroups.includes(r.id)?`View`:`Hide`)))]),_:2},1024)]),_:2},1032,[`onClick`])]),_:2},1024),(0,e.createVNode)(d,{content:`修改颜色`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:(0,e.withModifiers)(e=>n.$emit(`group-action`,`color`,r.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Brush))]),_:1})]),_:1},8,[`onClick`])]),_:2},1024),(0,e.createVNode)(d,{content:`删除分组`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,type:`danger`,onClick:(0,e.withModifiers)(e=>n.$emit(`group-action`,`delete`,r.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Delete))]),_:1})]),_:1},8,[`onClick`])]),_:2},1024)])],2))),128))]),t.groups.length?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,pe,`暂无分组`))])]),_:1})]),(0,e.createElementVNode)(`div`,me,[t.onlineUsers.length>0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,he,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.onlineUsers.slice(0,5),t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.clientId,class:`collab-avatar`,style:(0,e.normalizeStyle)({background:t.color}),title:t.name},(0,e.toDisplayString)(t.name?.charAt(0)),13,ge))),128))])):(0,e.createCommentVNode)(``,!0),t.isJoinMode?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createBlock)(l,{key:1,size:`small`,type:t.isConnected?`success`:`default`,onClick:a[7]||=e=>n.$emit(`toggle-collab`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Share))]),_:1}),(0,e.createElementVNode)(`span`,null,(0,e.toDisplayString)(t.isConnected?`协作中`:`协作`),1)]),_:1},8,[`type`])),!t.isJoinMode&&t.isConnected?((0,e.openBlock)(),(0,e.createBlock)(l,{key:2,size:`small`,circle:``,onClick:a[8]||=e=>n.$emit(`share-collab`),title:`分享链接`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Link))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(f,{direction:`vertical`}),(0,e.createVNode)(h,{trigger:`click`,onCommand:a[9]||=e=>n.$emit(`export`,e)},{dropdown:(0,e.withCtx)(()=>[(0,e.createVNode)(m,null,{default:(0,e.withCtx)(()=>[t.activeGroupId?((0,e.openBlock)(),(0,e.createBlock)(p,{key:0,command:`png-filtered`},{default:(0,e.withCtx)(()=>[...a[27]||=[(0,e.createTextVNode)(`PNG(当前分组)`,-1)]]),_:1})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(p,{command:`png`},{default:(0,e.withCtx)(()=>[...a[28]||=[(0,e.createTextVNode)(`PNG(全部)`,-1)]]),_:1}),(0,e.createVNode)(p,{command:`svg`},{default:(0,e.withCtx)(()=>[...a[29]||=[(0,e.createTextVNode)(`SVG`,-1)]]),_:1}),(0,e.createVNode)(p,{command:`pdf`},{default:(0,e.withCtx)(()=>[...a[30]||=[(0,e.createTextVNode)(`PDF`,-1)]]),_:1}),(0,e.createVNode)(p,{command:`html`},{default:(0,e.withCtx)(()=>[...a[31]||=[(0,e.createTextVNode)(`HTML`,-1)]]),_:1}),(0,e.createVNode)(p,{divided:``,command:`json`},{default:(0,e.withCtx)(()=>[...a[32]||=[(0,e.createTextVNode)(`JSON(完整数据)`,-1)]]),_:1})]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`},{default:(0,e.withCtx)(()=>[a[26]||=(0,e.createTextVNode)(`导出`,-1),(0,e.createVNode)(c,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(d,{content:`导入JSON`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:a[10]||=e=>n.$refs.jsonInput.click()},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Upload))]),_:1})]),_:1})]),_:1}),(0,e.createElementVNode)(`input`,{ref:`jsonInput`,type:`file`,accept:`.json`,style:{display:`none`},onChange:a[11]||=e=>n.$emit(`import-json`,e)},null,544),(0,e.createVNode)(l,{size:`small`,onClick:a[12]||=e=>n.$emit(`save`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Download))]),_:1})]),_:1}),t.showHistory?((0,e.openBlock)(),(0,e.createBlock)(l,{key:3,size:`small`,circle:``,title:`更新履历`,onClick:a[13]||=e=>n.$emit(`history`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Clock))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0)])])}}},[[`__scopeId`,`data-v-081fbd64`]]),ve=[`src`],ye=[`onMousedown`],be={class:`leader-line-svg`,style:{left:0,top:0,width:`100%`,height:`100%`}},xe=[`id`,`fill`],Se=[`d`,`stroke`,`stroke-width`,`stroke-dasharray`,`marker-start`],Ce=[`onMousedown`],we=[`onBlur`],Te=[`onMousedown`],Ee=[`onMousedown`],De=[`onMousedown`],Oe=_({__name:`AnnotationCanvas`,props:{imageUrl:String,annotations:{type:Array,default:()=>[]},collapsedGroups:{type:Array,default:()=>[]},selectedId:[String,Number,null],lineStyle:{type:String,default:`straight`}},emits:[`select`,`upload-image`,`change`],setup(t,{expose:n,emit:r}){let a=t,o=r,s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(800),u=(0,e.ref)(600),d=(0,e.ref)(!1),f=(0,e.ref)(null),p=(0,e.computed)(()=>a.annotations.filter(e=>e.groupId?!a.collapsedGroups.includes(e.groupId):!0)),m=(0,e.computed)(()=>a.lineStyle===`dashed`?`8,4`:a.lineStyle===`dotted`?`3,3`:a.lineStyle===`dashdot`?`8,3,2,3`:`none`),h=()=>{let e=s.value,t=c.value;if(!e||!t)return;let n=t.naturalWidth,r=t.naturalHeight,i=e.clientWidth-40,a=e.clientHeight-40,o=i/n,d=a/r,f=Math.min(o,d,1);l.value=Math.round(n*f),u.value=Math.round(r*f)},g=()=>{h()},_=e=>{h()},v=e=>{let t=e.x/100*l.value,n=e.y/100*u.value,r=t+(e.labelX||0),i=n+(e.labelY||0),o=[`dashed`,`dotted`,`dashdot`].includes(a.lineStyle)?`straight`:a.lineStyle;if(o===`straight`||o===`dashed`||o===`dotted`||o===`dashdot`)return`M${t},${n} L${r},${i}`;if(o===`polyline`)return`M${t},${n} L${e.x<50?t+20:t-20},${n} L${r},${i}`;if(o===`right-angle`)return`M${t},${n} L${t},${i} L${r},${i}`;if(o===`curve`)return`M${t},${n} C${e.x<50?t+30:t-30},${n} ${r},${i} ${r},${i}`;if(o===`wave`){let e=r-t,a=i-n,o=Math.sqrt(e*e+a*a),s=Math.max(2,Math.floor(o/20)),c=`M${t},${n}`;for(let r=1;r<=s;r++){let i=r/s,o=t+e*i,l=n+a*i+Math.sin(i*Math.PI*s/2)*8;c+=` L${o},${l}`}return c}return`M${t},${n} L${r},${i}`},y=e=>{let t=e.x/100*l.value,n=e.y/100*u.value,r={left:`${t+(e.labelX||0)}px`,top:`${n+(e.labelY||0)}px`};if(e.labelBgColor){let t=(e.labelBgOpacity??100)/100,n=e.labelBgColor;r.background=`rgba(${parseInt(n.slice(1,3),16)}, ${parseInt(n.slice(3,5),16)}, ${parseInt(n.slice(5,7),16)}, ${t})`}return r},b=e=>({background:e.numberColor||e.color||`#e74c3c`}),x=e=>{let t={fontFamily:e.fontFamily||`inherit`,fontSize:e.fontSize?e.fontSize+`px`:`inherit`};return e.textColor&&(t.color=e.textColor),e.fontWeight===`bold`?t.fontWeight=`bold`:e.fontWeight===`bolder`&&(t.fontWeight=`bolder`),e.fontStyle===`italic`&&(t.fontStyle=`italic`),e.fontStyle===`oblique`&&(t.fontStyle=`oblique`),e.textDecoration===`underline`?t.textDecoration=`underline`:e.textDecoration===`line-through`?t.textDecoration=`line-through`:e.textDecoration===`underline line-through`&&(t.textDecoration=`underline line-through`),t},S=e=>({left:e.x+`%`,top:e.y+`%`}),C=e=>{let t={left:e.x+`%`,top:e.y+`%`,background:e.color||`#e74c3c`};return e.pointStyle===`square`?t.borderRadius=`2px`:e.pointStyle===`diamond`?(t.borderRadius=`2px`,t.transform=`translate(-50%, -50%) rotate(45deg)`):e.pointStyle===`arrow`&&(t.background=`transparent`,t.border=`none`,t.width=`0`,t.height=`0`,t.boxShadow=`none`),t},w=null,T=null,E=(e,t)=>{o(`select`,e),T=`label`,f.value=e.id,d.value=!0,w={ann:e,startX:t.clientX,startY:t.clientY,origLabelX:e.labelX||0,origLabelY:e.labelY||0},document.addEventListener(`mousemove`,O),document.addEventListener(`mouseup`,k)},D=(e,t)=>{o(`select`,e),T=`dot`,f.value=e.id,d.value=!0,w={ann:e,startX:t.clientX,startY:t.clientY,origX:e.x,origY:e.y},document.addEventListener(`mousemove`,O),document.addEventListener(`mouseup`,k)},O=e=>{if(!w)return;let t=e.clientX-w.startX,n=e.clientY-w.startY;if(T===`label`)w.ann.labelX=w.origLabelX+t,w.ann.labelY=w.origLabelY+n;else if(T===`dot`){let e=s.value;if(!e)return;let r=e.querySelector(`.image-wrapper`).getBoundingClientRect(),i=Math.max(0,Math.min(100,w.origX+t/r.width*100)),a=Math.max(0,Math.min(100,w.origY+n/r.height*100));w.ann.x=Math.round(i*10)/10,w.ann.y=Math.round(a*10)/10}},k=()=>{d.value=!1,f.value=null,w=null,T=null,o(`change`),document.removeEventListener(`mousemove`,O),document.removeEventListener(`mouseup`,k)};return n({recalculateSize:g}),(n,r)=>{let a=(0,e.resolveComponent)(`el-icon`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,{class:(0,e.normalizeClass)([`annotation-canvas`,{"is-dragging":d.value}]),ref_key:`containerRef`,ref:s},[t.imageUrl?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`image-wrapper`,style:(0,e.normalizeStyle)({width:l.value+`px`,height:u.value+`px`})},[(0,e.createElementVNode)(`img`,{src:t.imageUrl,onLoad:_,ref_key:`imgRef`,ref:c,class:`annotation-image`,draggable:`false`},null,40,ve),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(p.value,i=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:i.id,class:(0,e.normalizeClass)([`annotation-group`,{selected:t.selectedId===i.id,"is-active":t.selectedId===i.id}]),onMousedown:(0,e.withModifiers)(e=>n.$emit(`select`,i),[`stop`])},[((0,e.openBlock)(),(0,e.createElementBlock)(`svg`,be,[(0,e.createElementVNode)(`defs`,null,[(0,e.createElementVNode)(`marker`,{id:`arrow-start-`+i.id,markerWidth:`10`,markerHeight:`7`,refX:`1`,refY:`3.5`,orient:`auto`,fill:i.lineColor||(t.selectedId===i.id?`#409EFF`:i.color||`#e74c3c`)},[...r[2]||=[(0,e.createElementVNode)(`polygon`,{points:`10 0, 0 3.5, 10 7`},null,-1)]],8,xe)]),(0,e.createElementVNode)(`path`,{d:v(i),fill:`none`,stroke:i.lineColor||(t.selectedId===i.id?`#409EFF`:i.color||`#e74c3c`),"stroke-width":i.strokeWidth||1.5,"stroke-dasharray":m.value,"marker-start":i.pointStyle===`arrow`?`url(#arrow-start-${i.id})`:``},null,8,Se)])),(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`annotation-label`,{dragging:d.value&&f.value===i.id}]),style:(0,e.normalizeStyle)(y(i)),onMousedown:(0,e.withModifiers)(e=>E(i,e),[`stop`])},[(0,e.createElementVNode)(`span`,{class:`annotation-number`,style:(0,e.normalizeStyle)(b(i))},(0,e.toDisplayString)(i.number),5),(0,e.createElementVNode)(`span`,{class:`annotation-text`,style:(0,e.normalizeStyle)(x(i)),contenteditable:``,onBlur:e=>{i.text=e.target.textContent,o(`change`)},onMousedown:r[0]||=(0,e.withModifiers)(()=>{},[`stop`])},(0,e.toDisplayString)(i.text),45,we)],46,Ce),i.pointStyle===`flag`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`annotation-flag`,style:(0,e.normalizeStyle)(S(i)),onMousedown:(0,e.withModifiers)(e=>D(i,e),[`stop`])},[(0,e.createElementVNode)(`div`,{class:`flag-pole`,style:(0,e.normalizeStyle)({background:i.color||`#e74c3c`})},null,4),(0,e.createElementVNode)(`div`,{class:`flag-cloth`,style:(0,e.normalizeStyle)({background:i.color||`#e74c3c`})},null,4)],44,Te)):i.pointStyle===`arrow`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:2,class:(0,e.normalizeClass)([`annotation-dot arrow-point`,{dragging:d.value&&f.value===i.id}]),style:(0,e.normalizeStyle)(C(i)),onMousedown:(0,e.withModifiers)(e=>D(i,e),[`stop`])},null,46,De)):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:1,class:(0,e.normalizeClass)([`annotation-dot`,[i.pointStyle||`circle`,{dragging:d.value&&f.value===i.id}]]),style:(0,e.normalizeStyle)(C(i)),onMousedown:(0,e.withModifiers)(e=>D(i,e),[`stop`])},null,46,Ee))],42,ye))),128))],4)):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:1,class:`upload-placeholder`,onClick:r[1]||=e=>n.$emit(`upload-image`)},[(0,e.createVNode)(a,{size:`48`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.UploadFilled))]),_:1}),r[3]||=(0,e.createElementVNode)(`p`,null,`点击上传图片`,-1)]))],2)}}},[[`__scopeId`,`data-v-d9ef76f4`]]);function ke(t,{roomPrefix:n,syncKey:r=`_data`}={}){let i=new o.Doc,a=(0,e.ref)(!1),c=(0,e.ref)(!1),l=(0,e.ref)(!1),u=(0,e.ref)(!1),d=(0,e.ref)([]),f=null,p=null,m=null,h=null,g=!1,_=null,v=`ws://${window.location.hostname||`localhost`}:1234`,y=`${n}-${t}`,b=()=>{x(),_=setInterval(()=>{if(f&&f.connection&&f.connection.ws&&f.connection.ws.readyState===WebSocket.CLOSED)try{f.connect()}catch(e){console.warn(`[ExplosionCollab] reconnect failed:`,e)}},3e4)},x=()=>{_&&=(clearInterval(_),null)};f=new s.HocuspocusProvider({url:v,name:y,document:i,connect:!1,reconnect:!0,onConnect:()=>{a.value=!0,b()},onClose:()=>{a.value=!1,c.value=!1},onSynced:({state:e})=>{c.value=e}}),f.awareness.on(`change`,()=>{d.value=Array.from(f.awareness.getStates().entries()).filter(([e,t])=>t.user).map(([e,t])=>({clientId:e,...t.user}))}),p=i.getMap(n);let S=i.getMap(`_meta`);S.observe(e=>{e.keysChanged.has(`_closed`)&&(u.value=S.get(`_closed`)===!0,u.value&&console.log(`[ExplosionCollab] collaboration closed by owner`))});let C=()=>{f.connect()},w=()=>{if(x(),f){try{f.disconnect(),f.destroy()}catch(e){console.warn(`[ExplosionCollab] disconnect error:`,e)}f=null}a.value=!1,c.value=!1,d.value=[]},T=(e={})=>(g=!1,f.connect(),new Promise(t=>{let n=()=>{f&&c.value?(g=!0,e.userInfo&&f.awareness.setLocalStateField(`user`,e.userInfo),t()):setTimeout(n,100)};setTimeout(n,200)})),E=e=>{!a.value||!p||(m&&clearTimeout(m),m=setTimeout(()=>{let t=JSON.stringify(e);h=t,i.transact(()=>{p.set(r,t)})},50))},D=()=>{if(!p)return null;let e=p.get(r);if(!e)return null;h=e;try{return JSON.parse(e)}catch{return null}},O=e=>{f&&f.awareness.setLocalStateField(`user`,{id:e.id||`user-${Date.now()}`,name:e.name||`用户${Math.floor(Math.random()*1e3)}`,color:e.color||`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`,...e})},k=()=>{u.value=!0,i.transact(()=>{S.set(`_closed`,!0)}),g=!1,f?.awareness?.setLocalState(null),w(),l.value=!1},A=()=>S.get(`_closed`)===!0?(u.value=!0,!0):!1,j=()=>{w(),i.destroy()};return(0,e.onUnmounted)(()=>j()),{ydoc:i,provider:f,yMap:p,isConnected:a,isSynced:c,isCollabOwner:l,collaborationClosed:u,onlineUsers:d,connect:C,disconnect:w,init:T,pushToYjs:E,pullFromYjs:D,setLocalUser:O,closeCollaboration:k,checkCollaborationClosed:A,destroy:j,_getSyncReady:()=>g,_setSyncReady:e=>{g=e},_getLastSyncedValue:()=>h,_setLastSyncedValue:e=>{h=e}}}var Ae=(e,{onRemoteChange:t}={})=>{let n=ke(e,{roomPrefix:`explosion-image`,syncKey:`_data`});t&&n.yMap.observe(e=>{if(!n._getSyncReady())return;let r=n.yMap.get(`_data`);if(r&&r!==n._getLastSyncedValue()){n._setLastSyncedValue(r);try{t(JSON.parse(r))}catch(e){console.error(`[EV-Image] remote data parse error:`,e)}}});let r=e=>{n.pushToYjs({title:e.title,imageUrl:e.imageUrl,annotations:e.annotations,groups:e.groups})},i=()=>n.pullFromYjs();return{...n,pushToYjs:r,pullFromYjs:i}},je={class:`explosion-image-editor`},Me={class:`editor-body`},Ne={class:`canvas-area`},Pe={class:`props-panel`},Fe={class:`prop-row`},Ie={class:`prop-row`},Le={class:`prop-row`},Re={class:`prop-row`},ze={class:`prop-row`},Be={class:`prop-row`},Ve={class:`prop-row`},He={class:`prop-row`},Ue={class:`prop-row`},We={class:`prop-row`},Ge={class:`prop-row`},Ke={class:`prop-row`},qe={class:`font-style-btns`},Je={class:`prop-row`},Ye={class:`font-style-btns`},Xe={class:`prop-row`},Ze={class:`prop-row`},Qe={class:`prop-row`},$e={class:`prop-row`},et={key:0,class:`prop-row filter-info`},tt={key:1,class:`no-selection`},nt={class:`color-dialog-body`},rt=`explosion-image`,it=_({__name:`ExplosionImageEditor`,setup(t){let o=(0,n.useRoute)(),s=(0,n.useRouter)(),c=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.ref)(!1),d=(0,e.ref)(!1),{saveVersion:f}=B(),p=L(),m=(0,e.reactive)({title:`图片标注`,imageUrl:``,annotations:[],groups:[]}),h=(0,e.ref)(!1),g=(0,e.ref)(!1),_=(0,e.ref)(!1),v=null,y=(0,e.ref)(`straight`),b=(0,e.ref)(null),x=(0,e.ref)(null),S=(0,e.ref)(null),C=0,w=(0,e.ref)(null),T=(0,e.ref)([]),E=(0,e.computed)(()=>w.value?m.annotations.filter(e=>e.groupId===w.value):m.annotations),D=()=>l.value?.click(),O=async e=>{let t=e.target.files?.[0];if(!t)return;let n=new FormData;n.append(`file`,t);try{let e=await a.default.post(`/api/files/upload/image`,n);m.imageUrl=e.data.url||e.data.file_path,Y()}catch{r.ElMessage.error(`上传失败`)}},k=()=>{if(!m.imageUrl){r.ElMessage.warning(`请先上传图片`);return}let e=m.annotations.reduce((e,t)=>Math.max(e,t.number),0);m.annotations.push({id:`ann-${++C}-${Date.now()}`,number:e+1,text:``,x:50,y:50,labelX:80,labelY:-30,color:`#e74c3c`,numberColor:``,textColor:``,labelBgColor:``,labelBgOpacity:100,lineColor:``,strokeWidth:1.5,pointStyle:`circle`,fontFamily:``,fontSize:13,fontWeight:``,fontStyle:``,textDecoration:``,groupId:``}),Y()},A=e=>{b.value=e.id,x.value=e},j=(e,t)=>{x.value&&(x.value[e]===t?x.value[e]=``:x.value[e]=t)},ee=()=>{x.value&&(x.value.fontFamily=``,x.value.fontSize=13,x.value.fontWeight=``,x.value.fontStyle=``,x.value.textDecoration=``)},M=()=>{m.annotations=m.annotations.filter(e=>e.id!==b.value),b.value=null,x.value=null,Y()},te=e=>{e===`new`&&r.ElMessageBox.prompt(`分组名称`,`新建分组`,{inputPlaceholder:`名称`}).then(({value:e})=>{e&&(m.groups.push({id:`grp-${Date.now()}`,name:e}),Y())}).catch(()=>{})},ne=(e,t)=>{e===`filter`?w.value=w.value===t?null:t:e===`collapse`?I(t):e===`color`?(P.value=t,N.value=!0):e===`delete`&&r.ElMessageBox.confirm(`确定删除该分组?分组内的标注将保留,但分组关系将被移除。`,`删除分组`,{type:`warning`}).then(()=>{m.annotations.forEach(e=>{e.groupId===t&&(e.groupId=``)}),m.groups=m.groups.filter(e=>e.id!==t),w.value===t&&(w.value=null),r.ElMessage.success(`分组已删除`),Y()}).catch(()=>{})},N=(0,e.ref)(!1),P=(0,e.ref)(null),F=(0,e.ref)(`#e74c3c`),re=()=>{m.annotations.forEach(e=>{e.groupId===P.value&&(e.color=F.value,e.numberColor=F.value,e.lineColor=F.value,e.textColor=F.value)}),N.value=!1,r.ElMessage.success(`颜色已更新`),Y()},I=e=>{let t=T.value.indexOf(e);t===-1?T.value.push(e):T.value.splice(t,1)},R=()=>{w.value=null,T.value=[]},z=async()=>{if(h.value&&v?.collaborationClosed.value&&!_.value){r.ElMessage.warning(`协作已关闭,无法保存`);return}try{let e={title:m.title,view_type:`image`,config:JSON.stringify({imageUrl:m.imageUrl,annotations:m.annotations,groups:m.groups,lineStyle:y.value})};c.value?await a.default.put(`/api/explosion-views/${c.value}`,e):c.value=(await a.default.post(`/api/explosion-views/`,e)).data.id,r.ElMessage.success(`保存成功`),f({documentId:c.value,docType:`image`,content:JSON.stringify({imageUrl:m.imageUrl,annotations:m.annotations,groups:m.groups,lineStyle:y.value}),userId:String(p.currentUser.value?.id||``),userName:p.currentUser.value?.name||`未知`})}catch{r.ElMessage.error(`保存失败`)}},V=async()=>{if(o.params.id)try{let e=(await a.default.get(`/api/explosion-views/${o.params.id}`)).data;if(c.value=e.id,m.title=e.title,e.config){let t=JSON.parse(e.config);m.imageUrl=t.imageUrl||``,m.annotations=t.annotations||[],m.groups=t.groups||[],y.value=t.lineStyle||`straight`}}catch(e){console.error(e)}},H=()=>s.push(`/`),U=[`我可以帮您优化图片标注、检查注释内容,或者提供标注建议。请问有什么需要帮助的?`,`这张图片的标注很详细。建议检查标注线条是否清晰,避免与其他标注重叠。`,`根据当前的标注内容,我建议为关键部件添加更详细的文字说明。`,`我可以帮您检查标注中是否有遗漏的区域或重复的编号。需要我逐个分析吗?`,`建议使用不同颜色的标注来区分不同类别的部件,提高可读性。`,`图片标注的分组功能可以帮助您管理复杂的标注。建议按功能模块进行分组。`,`我可以帮您将标注信息整理成表格,方便后续查阅和修改。`,`标注的连线样式建议统一,直线适合简单标注,折线适合复杂场景。`],W=async(e,t={})=>{let n=c.value?`${rt}-${c.value}`:null;await p.sendMessage(e,{...t,roomId:n});let r=t.mentionedUser,i=r&&r.toLowerCase().includes(`ai`),a=p.collabUsers.value.filter(e=>e.name!==p.currentUser.value.name);(!r||i||a.length===0)&&(p.loading.value=!0,setTimeout(()=>{p.sendAiMessage(U[Math.floor(Math.random()*U.length)],n),p.loading.value=!1},800+Math.random()*1200))},ae=()=>{let e=c.value?`${rt}-${c.value}`:null;p.clearMessages(e)},G=()=>{if(!c.value){r.ElMessage.warning(`请先保存文档`);return}d.value=!0},K=e=>{try{let t=typeof e==`string`?JSON.parse(e):e;t.imageUrl&&(m.imageUrl=t.imageUrl),t.annotations&&(m.annotations=t.annotations),t.groups&&(m.groups=t.groups),t.lineStyle&&(y.value=t.lineStyle),b.value=null,x.value=null}catch(e){console.error(`Version apply error:`,e)}},q=e=>{if(e===`png`||e===`png-filtered`){let t=document.querySelector(`.annotation-image`);if(!t)return r.ElMessage.error(`未找到图片`);let n=document.createElement(`canvas`);n.width=t.naturalWidth,n.height=t.naturalHeight;let i=n.getContext(`2d`);i.drawImage(t,0,0);let a=n.width/t.clientWidth,o=n.height/t.clientHeight,s=Math.max(a,o),c=e===`png-filtered`?E.value:m.annotations,l=[`dashed`,`dotted`,`dashdot`].includes(y.value)?`straight`:y.value,u=c.map(e=>{let t=e.x/100*n.width,r=e.y/100*n.height;return{ann:e,x:t,y:r,lx:t+(e.labelX||0)*a,ly:r+(e.labelY||0)*o}});u.forEach(({ann:e,x:t,y:n,lx:r,ly:c})=>{let u=e.color||`#e74c3c`,d=e.lineColor||u,f=(e.strokeWidth||1.5)*s;if(i.strokeStyle=d,i.lineWidth=f,i.setLineDash([]),l===`dashed`?i.setLineDash([8*a,4*o]):l===`dotted`?i.setLineDash([3*a,3*o]):l===`dashdot`&&i.setLineDash([8*a,3*o,2*a,3*o]),i.beginPath(),l===`polyline`){let o=e.x<50?t+20*a:t-20*a;i.moveTo(t,n),i.lineTo(o,n),i.lineTo(r,c)}else if(l===`right-angle`)i.moveTo(t,n),i.lineTo(t,c),i.lineTo(r,c);else if(l===`curve`){let o=e.x<50?t+30*a:t-30*a;i.moveTo(t,n),i.bezierCurveTo(o,n,r,c,r,c)}else if(l===`wave`){let e=r-t,s=c-n,l=Math.sqrt(e*e+s*s),u=Math.max(2,Math.floor(l/(20*a)));i.moveTo(t,n);for(let r=1;r<=u;r++){let a=r/u;i.lineTo(t+e*a,n+s*a+Math.sin(a*Math.PI*u/2)*8*o)}}else i.moveTo(t,n),i.lineTo(r,c);i.stroke(),i.setLineDash([]);let p=10*s,m=e.pointStyle||`circle`;if(m===`square`)i.fillStyle=u,i.fillRect(t-p,n-p,p*2,p*2);else if(m===`diamond`)i.fillStyle=u,i.beginPath(),i.moveTo(t,n-p*1.2),i.lineTo(t+p*1.2,n),i.lineTo(t,n+p*1.2),i.lineTo(t-p*1.2,n),i.closePath(),i.fill();else if(m===`arrow`){i.fillStyle=d,i.beginPath();let e=Math.atan2(c-n,r-t),a=p*1.5;i.moveTo(t+Math.cos(e)*a,n+Math.sin(e)*a),i.lineTo(t+Math.cos(e+2.5)*a*.6,n+Math.sin(e+2.5)*a*.6),i.lineTo(t+Math.cos(e-2.5)*a*.6,n+Math.sin(e-2.5)*a*.6),i.closePath(),i.fill()}else m===`flag`?(i.strokeStyle=u,i.lineWidth=2*s,i.beginPath(),i.moveTo(t,n),i.lineTo(t,n-20*o),i.stroke(),i.fillStyle=u,i.beginPath(),i.moveTo(t,n-20*o),i.lineTo(t+14*a,n-15*o),i.lineTo(t,n-10*o),i.closePath(),i.fill()):(i.fillStyle=u,i.beginPath(),i.arc(t,n,p,0,Math.PI*2),i.fill())}),10*s,u.forEach(({ann:e,lx:t,ly:n})=>{let r=e.color||`#e74c3c`,a=e.numberColor||r,o=11*s;if(i.fillStyle=a,i.beginPath(),i.arc(t,n,o,0,Math.PI*2),i.fill(),i.fillStyle=`#fff`,i.font=`bold ${o}px sans-serif`,i.textAlign=`center`,i.textBaseline=`middle`,i.fillText(String(e.number),t,n),e.text){let r=(e.fontSize||13)*s,a=e.fontWeight===`bold`||e.fontWeight===`bolder`?`bold `:``;i.font=`${e.fontStyle===`italic`||e.fontStyle===`oblique`?`italic `:``}${a}${r}px ${e.fontFamily||`sans-serif`}`;let c=i.measureText(e.text).width,l=4*s,u=t+o+l,d=u-l,f=n-r/2-l,p=c+l*2,m=r+l*2;if(e.labelBgColor){let t=(e.labelBgOpacity??100)/100,n=e.labelBgColor;i.fillStyle=`rgba(${parseInt(n.slice(1,3),16)}, ${parseInt(n.slice(3,5),16)}, ${parseInt(n.slice(5,7),16)}, ${t})`}else i.fillStyle=`rgba(255,255,255,0.9)`;i.beginPath(),i.roundRect(d,f,p,m,3*s),i.fill(),i.fillStyle=e.textColor||`#333`,i.textAlign=`left`,i.textBaseline=`middle`,i.fillText(e.text,u,n)}}),n.toBlob(e=>{let t=document.createElement(`a`);t.href=URL.createObjectURL(e),t.download=`${m.title||`图片标注`}.png`,t.click()})}else e===`json`?J():r.ElMessage.info(`导出 ${e} 开发中`)},J=()=>{let e={title:m.title,imageUrl:m.imageUrl,annotations:m.annotations,groups:m.groups,lineStyle:y.value,exportTime:new Date().toISOString()},t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=document.createElement(`a`);n.href=URL.createObjectURL(t),n.download=`${m.title||`爆炸图`}.json`,n.click(),r.ElMessage.success(`JSON已导出`)},oe=e=>{let t=e.target.files[0];if(!t)return;let n=new FileReader;n.onload=e=>{try{let t=JSON.parse(e.target.result);if(!t.imageUrl&&(!t.annotations||!t.annotations.length)){r.ElMessage.error(`JSON格式无效:缺少图片或标注数据`);return}m.title=t.title||`图片标注`,m.imageUrl=t.imageUrl||``,m.annotations=t.annotations||[],m.groups=t.groups||[],y.value=t.lineStyle||`straight`,b.value=null,x.value=null,Y(),r.ElMessage.success(`导入成功`)}catch{r.ElMessage.error(`JSON解析失败,请检查文件格式`)}},n.readAsText(t),e.target.value=``},Y=()=>{h.value&&v&&v.pushToYjs(m)};(0,e.watch)(x,()=>{Y()},{deep:!0});let X=e=>{v&&=(v.destroy(),null),v=Ae(e,{onRemoteChange:e=>{e.title&&(m.title=e.title),e.imageUrl&&(m.imageUrl=e.imageUrl),e.annotations&&(m.annotations=e.annotations),e.groups&&(m.groups=e.groups)}}),v._setSyncReady(!1)},Z=async()=>{if(h.value)return;if(!c.value&&(await z(),!c.value)){r.ElMessage.error(`请先保存文档`);return}X(String(c.value)),v.connect();let e={name:`用户${Math.floor(Math.random()*1e3)}`,color:`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`},t=()=>{if(v.provider&&v.provider.synced){v._setSyncReady(!0),v.setLocalUser(e);let t=v.pullFromYjs();t?(t.title&&(m.title=t.title),t.imageUrl&&(m.imageUrl=t.imageUrl),t.annotations&&(m.annotations=t.annotations),t.groups&&(m.groups=t.groups)):(m.annotations.length>0||m.imageUrl)&&v.pushToYjs(m),h.value=!0,_.value=!0,g.value=!1,p.setCollabContext({ydoc:v.ydoc,provider:v.provider,onlineUsers:v.onlineUsers}),p.setCurrentUser({id:v.provider.awareness.clientID,name:e.name,color:e.color}),r.ElMessage.success(`协作已开启`)}else setTimeout(t,100)};setTimeout(t,200)},ce=()=>{v&&(v.closeCollaboration(),h.value=!1,_.value=!1,r.ElMessage.info(`协作已关闭`))},le=()=>{let e=o.params.id;if(!e)return;X(e),v.connect();let t={name:`协作人${Math.floor(Math.random()*1e3)}`,color:`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`},n=()=>{if(v.provider&&v.provider.synced){if(v.checkCollaborationClosed()){v.disconnect(),h.value=!1,r.ElMessage.warning(`该协作已关闭,无法加入`);return}v._setSyncReady(!0),v.setLocalUser(t);let e=v.pullFromYjs();e&&(e.title&&(m.title=e.title),e.imageUrl&&(m.imageUrl=e.imageUrl),e.annotations&&(m.annotations=e.annotations),e.groups&&(m.groups=e.groups)),h.value=!0,_.value=!1,p.setCollabContext({ydoc:v.ydoc,provider:v.provider,onlineUsers:v.onlineUsers}),p.setCurrentUser({id:v.provider.awareness.clientID,name:t.name,color:t.color}),r.ElMessage.success(`已加入协作`)}else setTimeout(n,100)};setTimeout(n,200)},ue=()=>{h.value?ce():Z()},Q=async()=>{if(h.value||await Z(),!c.value&&(await z(),!c.value)){r.ElMessage.warning(`请先保存文档后再分享`);return}let e=`${window.location.origin}/explosion-image/${c.value}?collab=1`;try{await navigator.clipboard.writeText(e),r.ElMessage.success(`协作链接已复制到剪贴板`)}catch{r.ElMessage.info(`协作链接: `+e)}};(0,e.onMounted)(async()=>{let e=localStorage.getItem(`editor-user-name`)||`用户${Math.floor(Math.random()*1e3)}`;localStorage.setItem(`editor-user-name`,e),p.setCurrentUser({id:Date.now(),name:e,color:`#409eff`}),await V(),o.params.id&&o.query.collab===`1`&&le()});let $=e=>{e.key===`Delete`&&b.value&&M()};return(0,e.onMounted)(()=>document.addEventListener(`keydown`,$)),(0,e.onUnmounted)(()=>{document.removeEventListener(`keydown`,$),v&&=(v.destroy(),null)}),(t,n)=>{let r=(0,e.resolveComponent)(`el-input-number`),a=(0,e.resolveComponent)(`el-input`),s=(0,e.resolveComponent)(`el-color-picker`),f=(0,e.resolveComponent)(`el-option`),g=(0,e.resolveComponent)(`el-select`),C=(0,e.resolveComponent)(`el-slider`),P=(0,e.resolveComponent)(`el-button`),I=(0,e.resolveComponent)(`el-icon`),L=(0,e.resolveComponent)(`el-tag`),B=(0,e.resolveComponent)(`el-dialog`),V=(0,e.resolveComponent)(`Monitor`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,je,[(0,e.createVNode)(_e,{title:m.title,"onUpdate:title":n[0]||=e=>m.title=e,"line-style":y.value,groups:m.groups,"active-group-id":w.value,"collapsed-groups":T.value,"is-connected":h.value,"online-users":(0,e.unref)(v)?(0,e.unref)(v).onlineUsers.value:[],"is-join-mode":(0,e.unref)(o).query.collab===`1`,onBack:H,onAddAnnotation:k,onSetLineStyle:n[1]||=e=>y.value=e,onAddGroup:te,onGroupAction:ne,onClearGroupFilter:R,onExport:q,onImportJson:oe,onSave:z,onToggleCollab:ue,onShareCollab:Q,"show-history":!!c.value,onHistory:G},null,8,[`title`,`line-style`,`groups`,`active-group-id`,`collapsed-groups`,`is-connected`,`online-users`,`is-join-mode`,`show-history`]),(0,e.createElementVNode)(`div`,Me,[(0,e.createElementVNode)(`div`,Ne,[(0,e.createVNode)(Oe,{ref_key:`annotationCanvasRef`,ref:S,"image-url":m.imageUrl,annotations:E.value,"collapsed-groups":T.value,"selected-id":b.value,"line-style":y.value,onSelect:A,onUploadImage:D,onChange:Y},null,8,[`image-url`,`annotations`,`collapsed-groups`,`selected-id`,`line-style`]),(0,e.createElementVNode)(`input`,{ref_key:`fileInputRef`,ref:l,type:`file`,accept:`image/*`,style:{display:`none`},onChange:O},null,544)]),(0,e.createElementVNode)(`div`,Pe,[n[58]||=(0,e.createElementVNode)(`h4`,null,`标注属性`,-1),x.value?((0,e.openBlock)(),(0,e.createElementBlock)(e.Fragment,{key:0},[(0,e.createElementVNode)(`div`,Fe,[n[31]||=(0,e.createElementVNode)(`label`,null,`编号`,-1),(0,e.createVNode)(r,{modelValue:x.value.number,"onUpdate:modelValue":n[2]||=e=>x.value.number=e,min:1,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ie,[n[32]||=(0,e.createElementVNode)(`label`,null,`文字`,-1),(0,e.createVNode)(a,{modelValue:x.value.text,"onUpdate:modelValue":n[3]||=e=>x.value.text=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Le,[n[33]||=(0,e.createElementVNode)(`label`,null,`引线颜色`,-1),(0,e.createVNode)(s,{modelValue:x.value.lineColor,"onUpdate:modelValue":n[4]||=e=>x.value.lineColor=e,size:`small`,"show-alpha":``},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Re,[n[34]||=(0,e.createElementVNode)(`label`,null,`标注点样式`,-1),(0,e.createVNode)(g,{modelValue:x.value.pointStyle,"onUpdate:modelValue":n[5]||=e=>x.value.pointStyle=e,size:`small`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,{label:`圆形`,value:`circle`}),(0,e.createVNode)(f,{label:`方形`,value:`square`}),(0,e.createVNode)(f,{label:`菱形`,value:`diamond`}),(0,e.createVNode)(f,{label:`箭头`,value:`arrow`}),(0,e.createVNode)(f,{label:`红旗`,value:`flag`})]),_:1},8,[`modelValue`])]),(0,e.createElementVNode)(`div`,ze,[n[35]||=(0,e.createElementVNode)(`label`,null,`标注点颜色`,-1),(0,e.createVNode)(s,{modelValue:x.value.color,"onUpdate:modelValue":n[6]||=e=>x.value.color=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Be,[n[36]||=(0,e.createElementVNode)(`label`,null,`编号颜色`,-1),(0,e.createVNode)(s,{modelValue:x.value.numberColor,"onUpdate:modelValue":n[7]||=e=>x.value.numberColor=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ve,[n[37]||=(0,e.createElementVNode)(`label`,null,`文字颜色`,-1),(0,e.createVNode)(s,{modelValue:x.value.textColor,"onUpdate:modelValue":n[8]||=e=>x.value.textColor=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,He,[n[38]||=(0,e.createElementVNode)(`label`,null,`文字背景色`,-1),(0,e.createVNode)(s,{modelValue:x.value.labelBgColor,"onUpdate:modelValue":n[9]||=e=>x.value.labelBgColor=e,size:`small`,"show-alpha":``},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ue,[n[39]||=(0,e.createElementVNode)(`label`,null,`背景透明度`,-1),(0,e.createVNode)(C,{modelValue:x.value.labelBgOpacity,"onUpdate:modelValue":n[10]||=e=>x.value.labelBgOpacity=e,min:0,max:100,step:5,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,We,[n[40]||=(0,e.createElementVNode)(`label`,null,`字体`,-1),(0,e.createVNode)(g,{modelValue:x.value.fontFamily,"onUpdate:modelValue":n[11]||=e=>x.value.fontFamily=e,size:`small`,clearable:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,{label:`默认`,value:``}),(0,e.createVNode)(f,{label:`宋体`,value:`SimSun`}),(0,e.createVNode)(f,{label:`黑体`,value:`SimHei`}),(0,e.createVNode)(f,{label:`微软雅黑`,value:`Microsoft YaHei`}),(0,e.createVNode)(f,{label:`楷体`,value:`KaiTi`}),(0,e.createVNode)(f,{label:`Arial`,value:`Arial`}),(0,e.createVNode)(f,{label:`Times New Roman`,value:`Times New Roman`})]),_:1},8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ge,[n[41]||=(0,e.createElementVNode)(`label`,null,`字号`,-1),(0,e.createVNode)(r,{modelValue:x.value.fontSize,"onUpdate:modelValue":n[12]||=e=>x.value.fontSize=e,min:10,max:32,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ke,[n[46]||=(0,e.createElementVNode)(`label`,null,`字体样式`,-1),(0,e.createElementVNode)(`div`,qe,[(0,e.createVNode)(P,{type:x.value.fontWeight===`bold`?`primary`:``,size:`small`,onClick:n[13]||=e=>j(`fontWeight`,`bold`)},{default:(0,e.withCtx)(()=>[...n[42]||=[(0,e.createElementVNode)(`b`,null,`B`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(P,{type:x.value.fontWeight===`bolder`?`primary`:``,size:`small`,onClick:n[14]||=e=>j(`fontWeight`,`bolder`)},{default:(0,e.withCtx)(()=>[...n[43]||=[(0,e.createElementVNode)(`b`,{style:{"font-size":`14px`}},`B`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(P,{type:x.value.fontStyle===`italic`?`primary`:``,size:`small`,onClick:n[15]||=e=>j(`fontStyle`,`italic`)},{default:(0,e.withCtx)(()=>[...n[44]||=[(0,e.createElementVNode)(`i`,null,`I`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(P,{type:x.value.fontStyle===`oblique`?`primary`:``,size:`small`,onClick:n[16]||=e=>j(`fontStyle`,`oblique`)},{default:(0,e.withCtx)(()=>[...n[45]||=[(0,e.createElementVNode)(`i`,{style:{"font-style":`oblique`}},`I`,-1)]]),_:1},8,[`type`])])]),(0,e.createElementVNode)(`div`,Je,[n[51]||=(0,e.createElementVNode)(`label`,null,`装饰`,-1),(0,e.createElementVNode)(`div`,Ye,[(0,e.createVNode)(P,{type:x.value.textDecoration===`underline`?`primary`:``,size:`small`,onClick:n[17]||=e=>j(`textDecoration`,`underline`)},{default:(0,e.withCtx)(()=>[...n[47]||=[(0,e.createElementVNode)(`u`,null,`U`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(P,{type:x.value.textDecoration===`line-through`?`primary`:``,size:`small`,onClick:n[18]||=e=>j(`textDecoration`,`line-through`)},{default:(0,e.withCtx)(()=>[...n[48]||=[(0,e.createElementVNode)(`s`,null,`S`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(P,{type:x.value.textDecoration===`underline line-through`?`primary`:``,size:`small`,onClick:n[19]||=e=>j(`textDecoration`,`underline line-through`)},{default:(0,e.withCtx)(()=>[...n[49]||=[(0,e.createElementVNode)(`u`,null,[(0,e.createElementVNode)(`s`,null,`U`)],-1)]]),_:1},8,[`type`]),(0,e.createVNode)(P,{size:`small`,onClick:ee},{default:(0,e.withCtx)(()=>[...n[50]||=[(0,e.createTextVNode)(`清除`,-1)]]),_:1})])]),(0,e.createElementVNode)(`div`,Xe,[n[52]||=(0,e.createElementVNode)(`label`,null,`X% (点)`,-1),(0,e.createVNode)(C,{modelValue:x.value.x,"onUpdate:modelValue":n[20]||=e=>x.value.x=e,min:0,max:100,step:.5,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ze,[n[53]||=(0,e.createElementVNode)(`label`,null,`Y% (点)`,-1),(0,e.createVNode)(C,{modelValue:x.value.y,"onUpdate:modelValue":n[21]||=e=>x.value.y=e,min:0,max:100,step:.5,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Qe,[n[54]||=(0,e.createElementVNode)(`label`,null,`线宽`,-1),(0,e.createVNode)(r,{modelValue:x.value.strokeWidth,"onUpdate:modelValue":n[22]||=e=>x.value.strokeWidth=e,min:1,max:5,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,$e,[n[55]||=(0,e.createElementVNode)(`label`,null,`分组`,-1),(0,e.createVNode)(g,{modelValue:x.value.groupId,"onUpdate:modelValue":n[23]||=e=>x.value.groupId=e,size:`small`,clearable:``},{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(m.groups,t=>((0,e.openBlock)(),(0,e.createBlock)(f,{key:t.id,label:t.name,value:t.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),w.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,et,[(0,e.createVNode)(L,{size:`small`,type:`info`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)(` 当前筛选: `+(0,e.toDisplayString)(m.groups.find(e=>e.id===w.value)?.name||`未知分组`)+` `,1),(0,e.createVNode)(I,{class:`el-tag__close`,onClick:R},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1})]),_:1})])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(P,{size:`small`,type:`danger`,onClick:M},{default:(0,e.withCtx)(()=>[...n[56]||=[(0,e.createTextVNode)(`删除`,-1)]]),_:1})],64)):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,tt,[(0,e.createVNode)(I,{size:`48`,color:`#ccc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.InfoFilled))]),_:1}),n[57]||=(0,e.createElementVNode)(`p`,null,`点击标注进行编辑`,-1)]))])]),(0,e.createVNode)(B,{modelValue:N.value,"onUpdate:modelValue":n[26]||=e=>N.value=e,title:`批量修改颜色`,width:`320px`,"show-close":!0},{footer:(0,e.withCtx)(()=>[(0,e.createVNode)(P,{onClick:n[25]||=e=>N.value=!1},{default:(0,e.withCtx)(()=>[...n[60]||=[(0,e.createTextVNode)(`取消`,-1)]]),_:1}),(0,e.createVNode)(P,{type:`primary`,onClick:re},{default:(0,e.withCtx)(()=>[...n[61]||=[(0,e.createTextVNode)(`确定`,-1)]]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,nt,[n[59]||=(0,e.createElementVNode)(`span`,null,`选择颜色:`,-1),(0,e.createVNode)(s,{modelValue:F.value,"onUpdate:modelValue":n[24]||=e=>F.value=e,"show-alpha":``},null,8,[`modelValue`])])]),_:1},8,[`modelValue`]),(0,e.createVNode)(P,{class:`ai-chat-fab`,type:u.value?`primary`:`default`,circle:``,size:`large`,onClick:n[27]||=e=>u.value=!u.value,title:`AI助手`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(I,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(V)]),_:1})]),_:1},8,[`type`]),(0,e.createVNode)(ie,{visible:u.value,messages:(0,e.unref)(p).messages.value,loading:(0,e.unref)(p).loading.value,"is-collab":(0,e.unref)(p).isCollabMode.value,"collab-users":(0,e.unref)(p).collabUsers.value,"current-user":(0,e.unref)(p).currentUser.value,"is-owner":_.value,onSend:W,onClose:n[28]||=e=>u.value=!1,"unread-mention":(0,e.unref)(p).unreadMention.value,onClearUnread:n[29]||=t=>(0,e.unref)(p).clearUnreadMention(),onClear:ae},null,8,[`visible`,`messages`,`loading`,`is-collab`,`collab-users`,`current-user`,`is-owner`,`unread-mention`]),(0,e.createVNode)(se,{modelValue:d.value,"onUpdate:modelValue":n[30]||=e=>d.value=e,"document-id":c.value,onApply:K},null,8,[`modelValue`,`document-id`])])}}},[[`__scopeId`,`data-v-8aef20c7`]]);return(0,e.defineComponent)({name:`YourCompanyExplosionImage`,props:{docId:{type:[Number,String],default:null},apiBase:{type:String,default:`/api`},wsUrl:{type:String,default:``},user:{type:Object,default:()=>({id:``,name:``,color:``})},roomId:{type:String,default:``}},setup(n,{slots:r}){return()=>(0,e.h)(`div`,{class:`yourcompany-explosion-image-wrapper`,style:`position:relative`},[(0,e.h)(it,{...n}),(0,e.h)(t.BrandWatermark)])}})});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?module.exports=t(require("vue"),require("@billtaofbj/core"),require("vue-router"),require("element-plus"),require("@element-plus/icons-vue"),require("axios"),require("yjs"),require("@hocuspocus/provider")):typeof define==`function`&&define.amd?define([`vue`,`@billtaofbj/core`,`vue-router`,`element-plus`,`@element-plus/icons-vue`,`axios`,`yjs`,`@hocuspocus/provider`],t):(e=typeof globalThis<`u`?globalThis:e||self,e.YourCompanyExplosionImage=t(e.Vue,e._billtaofbj_core,e.VueRouter,e.ElementPlus,e.ElementPlusIconsVue,e.axios,e.yjs,e._hocuspocus_provider))})(this,function(e,t,n,r,i,a,o,s){var c=Object.create,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,f=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty,m=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=d(t),a=0,o=i.length,s;a<o;a++)s=i[a],!p.call(e,s)&&s!==n&&l(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=u(t,s))||r.enumerable});return e},h=(e,t,n)=>(n=e==null?{}:c(f(e)),m(t||!e||!e.__esModule?l(n,`default`,{value:e,enumerable:!0}):n,e));let g=h(a,1);a=h(a),o=h(o,1);var _=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},v={class:`chat-header`},y={class:`chat-header-left`},b={class:`chat-title`},x={class:`online-users-list`},S={class:`online-user-item`},C={class:`online-user-name`},w={key:1},T={class:`online-user-name`},E={class:`chat-header-right`},D={key:0,class:`chat-empty`},O={class:`chat-empty-hint`},k={key:1},A={class:`message-content`},j={key:0,class:`message-meta`},M={key:0,class:`message-mention`},ee=[`innerHTML`],N={class:`message-time`},P={key:1,class:`chat-message chat-message-ai`},F={class:`message-avatar ai`},I={class:`chat-input-area`},L={key:0,class:`mention-popup`},R=[`onClick`,`onMouseenter`],z={key:1},te=_({__name:`AiChatPanel`,props:{visible:{type:Boolean,default:!1},messages:{type:Array,default:()=>[]},loading:{type:Boolean,default:!1},panelWidth:{type:Number,default:360},isCollab:{type:Boolean,default:!1},collabUsers:{type:Array,default:()=>[]},currentUser:{type:Object,default:()=>({id:``,name:``,color:``})},isOwner:{type:Boolean,default:!0},unreadMention:{type:Boolean,default:!1}},emits:[`send`,`close`,`clear`,`clear-unread`],setup(t,{emit:n}){let r=t,a=n,o=(0,e.ref)(``),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(!1),u=(0,e.ref)([]),d=(0,e.ref)(0),f=``,p=-1,m={id:`ai-assistant`,name:`AI助手`,color:`#409EFF`,isAi:!0},h=(0,e.computed)(()=>{let e=r.currentUser.id,t=new Set;return[m,...r.collabUsers.filter(n=>{let r=n.clientId||n.id||``;if(r&&r===e)return!1;let i=String(r||n.name||``);return t.has(i)?!1:(t.add(i),!0)})]}),g=(0,e.computed)(()=>h.value.length+1),_=e=>e.role===`ai`?`chat-message-ai`:r.isCollab&&e.user_id&&e.user_id!==r.currentUser.id?`chat-message-other`:`chat-message-user`,te=e=>e.role===`ai`?{background:`linear-gradient(135deg, #409EFF, #337ECC)`}:{background:e.user_color||`#67C23A`},B=e=>(e.user_name||`U`).charAt(0),V=e=>{if(!r.isCollab)return;let t=typeof e==`string`?e:e.target?.value||o.value,n=t.length,i=t.lastIndexOf(`@`,n);if(i!==-1&&i<n){let e=t.slice(i+1,n);if(!e.includes(` `)&&!e.includes(`
2
+ `)){f=e,p=i,u.value=h.value.filter(t=>t.name&&t.name.toLowerCase().includes(e.toLowerCase())),l.value=u.value.length>0,d.value=0;return}}l.value=!1},H=()=>{l.value&&(d.value=Math.min(d.value+1,u.value.length-1))},U=()=>{l.value&&(d.value=Math.max(d.value-1,0))},W=e=>{let t=o.value.slice(0,p),n=o.value.slice(p+f.length+1);o.value=`${t}@${e.name} ${n}`,l.value=!1},G=e=>{if(e){if(e.shiftKey)return;if(l.value){let t=u.value[d.value];if(t){e.preventDefault(),W(t);return}}e.preventDefault()}let t=o.value.trim();if(!t||r.loading)return;let n=null;if(r.isCollab){let e=t.match(/@(\S+)/);e&&(n=e[1])}a(`send`,t,{mentionedUser:n}),o.value=``,l.value=!1},K=()=>{(0,e.nextTick)(()=>{s.value&&(s.value.scrollTop=s.value.scrollHeight)})};return(0,e.watch)(()=>r.messages.length,K),(0,e.watch)(()=>r.messages,K,{deep:!0}),(n,r)=>{let f=(0,e.resolveComponent)(`el-icon`),p=(0,e.resolveComponent)(`el-tag`),m=(0,e.resolveComponent)(`el-popover`),K=(0,e.resolveComponent)(`el-button`),q=(0,e.resolveComponent)(`el-input`);return t.visible?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`ai-chat-panel`,style:(0,e.normalizeStyle)({width:t.panelWidth+`px`})},[(0,e.createElementVNode)(`div`,v,[(0,e.createElementVNode)(`div`,y,[(0,e.createVNode)(f,{size:18,color:`#409EFF`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1}),(0,e.createElementVNode)(`span`,b,(0,e.toDisplayString)(t.isCollab?`协作聊天`:`AI 助手`),1),t.isCollab?((0,e.openBlock)(),(0,e.createBlock)(m,{key:0,width:200,placement:`bottom-start`,trigger:`click`},{reference:(0,e.withCtx)(()=>[(0,e.createVNode)(p,{size:`small`,type:`success`,effect:`plain`,class:`online-tag`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(g.value)+`人在线 `,1)]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,x,[(0,e.createElementVNode)(`div`,S,[(0,e.createElementVNode)(`div`,{class:`online-user-avatar`,style:(0,e.normalizeStyle)({background:t.currentUser.color||`#409EFF`})},(0,e.toDisplayString)((t.currentUser.name||`U`).charAt(0)),5),(0,e.createElementVNode)(`span`,C,(0,e.toDisplayString)(t.currentUser.name||`我`),1),(0,e.createVNode)(p,{size:`small`,type:t.isOwner?`warning`:`success`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(t.isOwner?`发起人`:`协作人`),1)]),_:1},8,[`type`]),r[4]||=(0,e.createElementVNode)(`span`,{class:`self-tag`},`(我)`,-1)]),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(h.value,t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id||t.clientId,class:`online-user-item`},[(0,e.createElementVNode)(`div`,{class:`online-user-avatar`,style:(0,e.normalizeStyle)({background:t.color||`#909399`})},[t.isAi?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:14},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,w,(0,e.toDisplayString)((t.name||`U`).charAt(0)),1))],4),(0,e.createElementVNode)(`span`,T,(0,e.toDisplayString)(t.name||`未知用户`),1),t.isAi?((0,e.openBlock)(),(0,e.createBlock)(p,{key:0,size:`small`,type:`primary`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[...r[5]||=[(0,e.createTextVNode)(`AI助手`,-1)]]),_:1})):((0,e.openBlock)(),(0,e.createBlock)(p,{key:1,size:`small`,type:`success`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[...r[6]||=[(0,e.createTextVNode)(`协作人`,-1)]]),_:1}))]))),128))])]),_:1})):(0,e.createCommentVNode)(``,!0)]),(0,e.createElementVNode)(`div`,E,[t.isCollab&&t.unreadMention?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`mention-bell`,title:`有新消息`,onClick:r[0]||=e=>a(`clear-unread`)},[(0,e.createVNode)(f,{size:18,color:`#F56C6C`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Bell))]),_:1})])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(K,{text:``,circle:``,size:`small`,onClick:r[1]||=e=>n.$emit(`clear`),title:`清空对话`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Delete))]),_:1})]),_:1}),(0,e.createVNode)(K,{text:``,circle:``,size:`small`,onClick:r[2]||=e=>n.$emit(`close`),title:`关闭`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1})]),_:1})])]),(0,e.createElementVNode)(`div`,{class:`chat-messages`,ref_key:`messagesRef`,ref:s},[t.messages.length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,D,[(0,e.createVNode)(f,{size:40,color:`#c0c4cc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1}),(0,e.createElementVNode)(`p`,null,(0,e.toDisplayString)(t.isCollab?`协作聊天室`:`你好!我是 AI 助手`),1),(0,e.createElementVNode)(`p`,O,(0,e.toDisplayString)(t.isCollab?`与团队成员和AI助手实时聊天`:`可以问我任何关于文档编辑的问题`),1)])):(0,e.createCommentVNode)(``,!0),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.messages,n=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:n._msgId||n.time+n.content,class:(0,e.normalizeClass)([`chat-message`,_(n)])},[(0,e.createElementVNode)(`div`,{class:`message-avatar`,style:(0,e.normalizeStyle)(te(n))},[n.role===`ai`?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:16},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,k,(0,e.toDisplayString)(B(n)),1))],4),(0,e.createElementVNode)(`div`,A,[t.isCollab&&n.role===`user`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,j,[(0,e.createElementVNode)(`span`,{class:`message-sender`,style:(0,e.normalizeStyle)({color:n.user_color||`#67C23A`})},(0,e.toDisplayString)(n.user_name||`用户`),5),n.mentioned_user?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,M,`@`+(0,e.toDisplayString)(n.mentioned_user),1)):(0,e.createCommentVNode)(``,!0)])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,{class:`message-text`,innerHTML:n.content},null,8,ee),(0,e.createElementVNode)(`div`,N,(0,e.toDisplayString)(n.time),1)])],2))),128)),t.loading?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,P,[(0,e.createElementVNode)(`div`,F,[(0,e.createVNode)(f,{size:16},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})]),r[7]||=(0,e.createElementVNode)(`div`,{class:`message-content`},[(0,e.createElementVNode)(`div`,{class:`message-text typing-indicator`},[(0,e.createElementVNode)(`span`),(0,e.createElementVNode)(`span`),(0,e.createElementVNode)(`span`)])],-1)])):(0,e.createCommentVNode)(``,!0)],512),(0,e.createElementVNode)(`div`,I,[(0,e.createElementVNode)(`div`,{class:`chat-input-wrapper`,ref_key:`inputWrapperRef`,ref:c},[(0,e.createVNode)(q,{modelValue:o.value,"onUpdate:modelValue":r[3]||=e=>o.value=e,type:`textarea`,autosize:{minRows:1,maxRows:4},placeholder:t.isCollab?`输入消息... @提及成员`:`输入消息...`,onKeydown:[(0,e.withKeys)((0,e.withModifiers)(G,[`exact`]),[`enter`]),(0,e.withKeys)((0,e.withModifiers)(H,[`prevent`]),[`down`]),(0,e.withKeys)((0,e.withModifiers)(U,[`prevent`]),[`up`])],onInput:V,resize:`none`},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,L,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(u.value,(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id||t.clientId,class:(0,e.normalizeClass)([`mention-item`,{active:n===d.value}]),onClick:e=>W(t),onMouseenter:e=>d.value=n},[(0,e.createElementVNode)(`div`,{class:`mention-avatar`,style:(0,e.normalizeStyle)({background:t.color||`#909399`})},[t.isAi?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:12},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,z,(0,e.toDisplayString)((t.name||`U`).charAt(0)),1))],4),(0,e.createElementVNode)(`span`,null,(0,e.toDisplayString)(t.name),1)],42,R))),128))])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(K,{class:`send-btn`,type:`primary`,circle:``,disabled:!o.value.trim()||t.loading,onClick:G},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Promotion))]),_:1})]),_:1},8,[`disabled`])],512)])],4)):(0,e.createCommentVNode)(``,!0)}}},[[`__scopeId`,`data-v-01960100`]]);function B(){let t=(0,e.ref)([]),n=(0,e.ref)(!1),r=(0,e.ref)(!1),i=(0,e.ref)([]),a=(0,e.ref)({id:``,name:``,color:``}),o=(0,e.ref)(!1),s=null,c=null,l=null,u=new Set,d=`/api/chat`,f=null,p=({ydoc:n,provider:c,onlineUsers:d})=>{if(n){r.value=!0,l=d,f&&f(),f=(0,e.watch)(l,e=>{i.value=Array.isArray(e)?e:[]},{immediate:!0,deep:!0});try{s=n.getArray(`chat-messages`),s.observe(e=>{try{e.changes.added.forEach(e=>{e.content.getContent().forEach(e=>{e&&e._msgId&&!u.has(e._msgId)&&(u.add(e._msgId),t.value=[...t.value,e],e.mentioned_user&&e.user_id!==a.value.id&&(o.value=!0))})})}catch(e){console.warn(`[useChat] Y.Array observer error:`,e)}})}catch(e){console.warn(`[useChat] Failed to create Y.Array:`,e)}}},m=e=>{a.value={...a.value,...e}},h=e=>{i.value=e||[]},_=()=>{let e=new Date;return`${e.getHours().toString().padStart(2,`0`)}:${e.getMinutes().toString().padStart(2,`0`)}`},v=async(n,i={})=>{let o={_msgId:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,role:`user`,content:n,time:_(),user_id:a.value.id,user_name:a.value.name,user_color:a.value.color,mentioned_user:i.mentionedUser||null};if(u.add(o._msgId),t.value=[...t.value,o],s&&(0,e.unref)(r))try{s.push([o])}catch(e){console.warn(`[useChat] Failed to push to Y.Array:`,e)}if(i.roomId)try{await g.default.post(d,{room_id:i.roomId,role:`user`,content:n,user_id:a.value.id,user_name:a.value.name,mentioned_user:i.mentionedUser||null})}catch(e){console.warn(`[useChat] Failed to persist message:`,e)}},y=async(n,i)=>{let a={_msgId:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,role:`ai`,content:n,time:_(),user_id:`ai-assistant`,user_name:`AI助手`};if(u.add(a._msgId),t.value=[...t.value,a],s&&(0,e.unref)(r))try{s.push([a])}catch(e){console.warn(`[useChat] Failed to push AI message to Y.Array:`,e)}if(i)try{await g.default.post(d,{room_id:i,role:`ai`,content:n,user_id:`ai-assistant`,user_name:`AI助手`})}catch(e){console.warn(`[useChat] Failed to persist AI message:`,e)}},b=async e=>{if(e)try{let n=await g.default.get(d,{params:{room_id:e}});if(Array.isArray(n.data)){let e=n.data.map(e=>({_msgId:e._msgId||`hist-${e.id||Date.now()}`,role:e.role,content:e.content,time:e.time||_(),user_id:e.user_id||``,user_name:e.user_name||``,user_color:e.user_color||``,mentioned_user:e.mentioned_user||null}));e.forEach(e=>u.add(e._msgId)),t.value=[...e,...t.value]}}catch(e){console.warn(`[useChat] Failed to load history:`,e)}},x=async e=>{if(t.value=[],u.clear(),e)try{await g.default.delete(d,{params:{room_id:e}})}catch(e){console.warn(`[useChat] Failed to clear messages on server:`,e)}},S=()=>{o.value=!1},C=()=>{if(f&&=(f(),null),s&&c){try{s.unobserve(c)}catch{}c=null}s=null,l=null,u.clear()};return(0,e.onUnmounted)(()=>C()),{messages:t,loading:n,isCollabMode:r,collabUsers:i,currentUser:a,unreadMention:o,setCollabContext:p,setCurrentUser:m,updateCollabUsers:h,sendMessage:v,sendAiMessage:y,loadHistory:b,clearMessages:x,clearUnreadMention:S,destroy:C}}var V=[`我可以帮您优化流程图布局、检查节点逻辑,或者提供流程设计建议。请问有什么需要帮助的?`,`这个流程图的节点连接看起来很清晰。建议检查一下是否有遗漏的分支或异常处理路径。`,`根据当前的流程结构,我建议在关键决策节点后添加明确的条件标注,使流程更易理解。`,`流程图中的泳道划分很合理。如果需要,我可以帮您分析各角色的职责分配是否均衡。`,`我可以帮您检查流程中是否存在循环依赖或死锁风险。需要我逐条分析吗?`,`建议在流程开始和结束节点使用统一的样式,这样可以让读者更快识别流程的起止点。`,`这个执行图的逻辑链路比较长,建议在中间添加一些检查点节点,便于流程监控和调试。`,`我可以帮您生成流程图的文字说明文档,方便团队成员理解流程细节。`];function H(){return V[Math.floor(Math.random()*V.length)]}async function U(e,t,n){let r={"Content-Type":`application/json`};e.apiKey&&(r.Authorization=`Bearer ${e.apiKey}`);let i=await fetch(e.url,{method:`POST`,headers:r,body:JSON.stringify({model:e.model||`gpt-4o-mini`,messages:t,temperature:e.temperature??.7,max_tokens:e.maxTokens??4096}),signal:n});if(!i.ok){let e=await i.text().catch(()=>``);throw Error(`AI API error ${i.status}: ${e}`)}return(await i.json()).choices?.[0]?.message?.content||``}function W(t){let n=(0,e.ref)(!1),r=null,i=()=>{let e=typeof t==`function`?t():t;return!!(e&&e.url)},a=()=>typeof t==`function`?t():t||{};return{loading:n,isAvailable:i,chat:async(e,t=[])=>{let i=a();if(!i.url)return H();n.value=!0,r&&r.abort(),r=new AbortController;try{return await U(i,[{role:`system`,content:i.chatPrompt||`你是一个有帮助的AI助手,擅长文档编辑和流程设计。请简洁回答用户问题。`},...t.map(e=>({role:e.role===`ai`?`assistant`:`user`,content:e.content})),{role:`user`,content:e}],r.signal)}catch(e){return e.name===`AbortError`?``:(console.warn(`[useAiApi] Chat error, falling back to mock:`,e),H())}finally{n.value=!1}},generate:async(e,t)=>{let i=a();if(!i.url)return{success:!1,message:`AI生成功能开发中,敬请期待...`};n.value=!0,r&&r.abort(),r=new AbortController;try{let n=await U(i,[{role:`system`,content:i.generatePrompt||`你是一个专业的${t||`流程图`}生成助手。根据用户的描述,生成对应的JSON数据结构。只返回JSON,不要包含其他文字或markdown代码块标记。`},{role:`user`,content:e}],r.signal),a=null;try{let e=n.replace(/^```(?:json)?\s*/i,``).replace(/\s*```$/i,``).trim();a=JSON.parse(e)}catch{a=null}return{success:!0,content:n,parsed:a}}catch(e){return e.name===`AbortError`?{success:!1,message:`已取消`}:(console.warn(`[useAiApi] Generate error:`,e),{success:!1,message:`AI生成失败: ${e.message}`})}finally{n.value=!1}},abort:()=>{r&&=(r.abort(),null)}}}var G=`/api/document-versions`,K=5e3,q=()=>{let t=(0,e.ref)([]),n=(0,e.ref)(!1);return{versions:t,loading:n,saveVersion:async({documentId:e,docType:t,content:n,userId:r,userName:i})=>{if(!e||!t||!n)return null;try{let{data:a}=await g.default.post(G,{document_id:e,doc_type:t,content:typeof n==`string`?n:JSON.stringify(n),user_id:r||null,user_name:i||null},{timeout:K});return a}catch(e){return console.warn(`[useVersionHistory] Failed to save version:`,e),null}},loadVersions:async e=>{if(!e)return[];n.value=!0;try{let{data:n}=await g.default.get(G,{params:{document_id:e},timeout:K});return t.value=n,n}catch(e){return console.warn(`[useVersionHistory] Failed to load versions:`,e),t.value=[],[]}finally{n.value=!1}},getVersionContent:async e=>{try{let{data:t}=await g.default.get(`${G}/${e}`,{timeout:K});return t}catch(e){return console.warn(`[useVersionHistory] Failed to get version content:`,e),null}}}},J={class:`version-history-panel`},Y={key:0,class:`loading-state`},ne={key:1,class:`empty-state`},re={key:2,class:`version-list`},ie={key:0,class:`current-version`},ae={class:`current-version-header`},oe={class:`version-number`},se=[`onClick`],ce={class:`version-number`},le={class:`version-user`},X={class:`panel-footer`},ue=_({__name:`VersionHistoryPanel`,props:{modelValue:{type:Boolean,default:!1},documentId:{type:[Number,String],default:null}},emits:[`update:modelValue`,`apply`],setup(t,{expose:n,emit:a}){let o=t,s=a,{versions:c,loading:l,loadVersions:u,getVersionContent:d}=q(),f=(0,e.ref)(!1),p=(0,e.ref)(null),m=(0,e.ref)(!1),h=(0,e.ref)(null);(0,e.watch)(()=>o.modelValue,e=>{f.value=e,e&&o.documentId&&(p.value=null,u(o.documentId).then(e=>{e&&e.length>0&&(h.value=e[0])}))}),(0,e.watch)(f,e=>{s(`update:modelValue`,e)});let g=e=>{p.value=e},_=async()=>{if(p.value){m.value=!0;try{let e=await d(p.value.id);e&&e.content?(h.value=p.value,p.value=null,s(`apply`,e.content),r.ElMessage.success(`已切换到版本 v`+h.value.version_number)):r.ElMessage.error(`获取版本内容失败`)}finally{m.value=!1}}},v=()=>{f.value=!1},y=e=>{if(!e)return``;let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`};return n({currentVersion:h}),(t,n)=>{let r=(0,e.resolveComponent)(`el-icon`),a=(0,e.resolveComponent)(`el-tag`),o=(0,e.resolveComponent)(`el-timeline-item`),s=(0,e.resolveComponent)(`el-timeline`),u=(0,e.resolveComponent)(`el-button`),d=(0,e.resolveComponent)(`el-drawer`);return(0,e.openBlock)(),(0,e.createBlock)(d,{modelValue:f.value,"onUpdate:modelValue":n[0]||=e=>f.value=e,title:`更新履历`,direction:`rtl`,size:`420px`,"before-close":v},{footer:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,X,[(0,e.createVNode)(u,{type:`primary`,disabled:!p.value,loading:m.value,onClick:_},{default:(0,e.withCtx)(()=>[...n[4]||=[(0,e.createTextVNode)(` 切换到此版本 `,-1)]]),_:1},8,[`disabled`,`loading`])])]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,J,[(0,e.unref)(l)?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,Y,[(0,e.createVNode)(r,{class:`is-loading`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Loading))]),_:1}),n[1]||=(0,e.createElementVNode)(`span`,null,`加载中...`,-1)])):(0,e.unref)(c).length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ne,[(0,e.createVNode)(r,{size:48,color:`#c0c4cc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Clock))]),_:1}),n[2]||=(0,e.createElementVNode)(`p`,null,`暂无历史版本`,-1)])):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,re,[h.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ie,[(0,e.createElementVNode)(`div`,ae,[(0,e.createVNode)(a,{type:`success`,size:`small`},{default:(0,e.withCtx)(()=>[...n[3]||=[(0,e.createTextVNode)(`当前版本`,-1)]]),_:1}),(0,e.createElementVNode)(`span`,oe,`v`+(0,e.toDisplayString)(h.value.version_number),1)])])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(s,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)((0,e.unref)(c),t=>((0,e.openBlock)(),(0,e.createBlock)(o,{key:t.id,timestamp:y(t.created_at),placement:`top`,type:p.value?.id===t.id?`primary`:``,hollow:p.value?.id!==t.id},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`version-item`,{active:p.value?.id===t.id}]),onClick:e=>g(t)},[(0,e.createElementVNode)(`span`,ce,`版本号:v`+(0,e.toDisplayString)(t.version_number),1),(0,e.createElementVNode)(`span`,le,`提交人:`+(0,e.toDisplayString)(t.user_name||`未知用户`),1)],10,se)]),_:2},1032,[`timestamp`,`type`,`hollow`]))),128))]),_:1})]))])]),_:1},8,[`modelValue`])}}},[[`__scopeId`,`data-v-87924b7c`]]),Z={class:`toolbar`},Q={class:`toolbar-left`},de={class:`toolbar-center`},fe={class:`group-popover`},pe={class:`group-popover-header`},me={class:`group-list`},$=[`onClick`],he={class:`group-name`},ge={class:`group-item-actions`},_e={key:1,class:`group-empty`},ve={class:`toolbar-right`},ye={key:0,class:`collab-users`},be=[`title`],xe=_({__name:`Toolbar`,props:{title:{type:String,default:``},lineStyle:{type:String,default:`straight`},groups:{type:Array,default:()=>[]},activeGroupId:{type:String,default:null},collapsedGroups:{type:Array,default:()=>[]},isConnected:Boolean,onlineUsers:{type:Array,default:()=>[]},isJoinMode:Boolean,showHistory:{type:Boolean,default:!1},showBackButton:{type:Boolean,default:!0},titleDisabled:{type:Boolean,default:!1}},emits:[`update:title`,`back`,`add-annotation`,`set-line-style`,`add-group`,`group-action`,`clear-group-filter`,`export`,`import-json`,`save`,`toggle-collab`,`share-collab`,`history`],setup(t){let n=t,r=(0,e.ref)(n.title);(0,e.watch)(()=>n.title,e=>r.value=e);let a={straight:{label:`直线`,icon:i.SemiSelect},polyline:{label:`折线`,icon:i.Connection},"right-angle":{label:`直角折线`,icon:i.Right},curve:{label:`曲线`,icon:i.TrendCharts},wave:{label:`波浪线`,icon:i.TrendCharts},dashed:{label:`虚线`,icon:i.Minus},dotted:{label:`点线`,icon:i.MoreFilled},dashdot:{label:`点划线`,icon:i.SemiSelect}},o=(0,e.computed)(()=>a[n.lineStyle]?.label||`引线`),s=(0,e.computed)(()=>a[n.lineStyle]?.icon||i.SemiSelect);return(n,a)=>{let c=(0,e.resolveComponent)(`el-icon`),l=(0,e.resolveComponent)(`el-button`),u=(0,e.resolveComponent)(`el-input`),d=(0,e.resolveComponent)(`el-tooltip`),f=(0,e.resolveComponent)(`el-divider`),p=(0,e.resolveComponent)(`el-dropdown-item`),m=(0,e.resolveComponent)(`el-dropdown-menu`),h=(0,e.resolveComponent)(`el-dropdown`),g=(0,e.resolveComponent)(`el-badge`),_=(0,e.resolveComponent)(`el-tag`),v=(0,e.resolveComponent)(`el-popover`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,Z,[(0,e.createElementVNode)(`div`,Q,[t.showBackButton?((0,e.openBlock)(),(0,e.createBlock)(l,{key:0,onClick:a[0]||=e=>n.$emit(`back`),size:`small`,circle:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowLeft))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(u,{modelValue:r.value,"onUpdate:modelValue":a[1]||=e=>r.value=e,onBlur:a[2]||=e=>n.$emit(`update:title`,r.value),disabled:t.titleDisabled,placeholder:`输入标题`,class:`title-input`,size:`small`},null,8,[`modelValue`,`disabled`])]),(0,e.createElementVNode)(`div`,de,[(0,e.createVNode)(d,{content:`添加标注`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:a[3]||=e=>n.$emit(`add-annotation`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Location))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(f,{direction:`vertical`}),(0,e.createVNode)(h,{trigger:`click`,onCommand:a[4]||=e=>n.$emit(`set-line-style`,e)},{dropdown:(0,e.withCtx)(()=>[(0,e.createVNode)(m,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(p,{command:`straight`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`straight`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.SemiSelect))]),_:1}),a[14]||=(0,e.createTextVNode)(`直线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`polyline`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`polyline`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Connection))]),_:1}),a[15]||=(0,e.createTextVNode)(`折线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`right-angle`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`right-angle`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Right))]),_:1}),a[16]||=(0,e.createTextVNode)(`直角折线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`curve`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`curve`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.TrendCharts))]),_:1}),a[17]||=(0,e.createTextVNode)(`曲线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`wave`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`wave`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.TrendCharts))]),_:1}),a[18]||=(0,e.createTextVNode)(`波浪线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{divided:``,command:`dashed`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`dashed`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Minus))]),_:1}),a[19]||=(0,e.createTextVNode)(`虚线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`dotted`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`dotted`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.MoreFilled))]),_:1}),a[20]||=(0,e.createTextVNode)(`点线 `,-1)]),_:1},8,[`class`]),(0,e.createVNode)(p,{command:`dashdot`,class:(0,e.normalizeClass)({"is-active":t.lineStyle===`dashdot`})},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.SemiSelect))]),_:1}),a[21]||=(0,e.createTextVNode)(`点划线 `,-1)]),_:1},8,[`class`])]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(s.value)))]),_:1}),(0,e.createTextVNode)(` `+(0,e.toDisplayString)(o.value)+` `,1),(0,e.createVNode)(c,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(f,{direction:`vertical`}),(0,e.createVNode)(v,{placement:`bottom`,width:280,trigger:`click`},{reference:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`},{default:(0,e.withCtx)(()=>[a[22]||=(0,e.createTextVNode)(` 分组 `,-1),t.activeGroupId?((0,e.openBlock)(),(0,e.createBlock)(g,{key:0,value:1,offset:[-2,-2],class:`group-badge`})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(c,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,fe,[(0,e.createElementVNode)(`div`,pe,[(0,e.createVNode)(l,{size:`small`,onClick:a[5]||=e=>n.$emit(`add-group`,`new`),type:`primary`,plain:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Plus))]),_:1}),a[23]||=(0,e.createTextVNode)(`新建分组 `,-1)]),_:1}),t.activeGroupId?((0,e.openBlock)(),(0,e.createBlock)(l,{key:0,size:`small`,onClick:a[6]||=e=>n.$emit(`clear-group-filter`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1}),a[24]||=(0,e.createTextVNode)(`显示全部 `,-1)]),_:1})):(0,e.createCommentVNode)(``,!0)]),t.groups.length?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,style:{margin:`8px 0`}})):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,me,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.groups,r=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:r.id,class:(0,e.normalizeClass)([`group-item`,{active:t.activeGroupId===r.id}])},[(0,e.createElementVNode)(`div`,{class:`group-item-main`,onClick:e=>n.$emit(`group-action`,`filter`,r.id)},[(0,e.createElementVNode)(`span`,he,(0,e.toDisplayString)(r.name),1),t.activeGroupId===r.id?((0,e.openBlock)(),(0,e.createBlock)(_,{key:0,size:`small`,type:`primary`},{default:(0,e.withCtx)(()=>[...a[25]||=[(0,e.createTextVNode)(`筛选`,-1)]]),_:1})):(0,e.createCommentVNode)(``,!0)],8,$),(0,e.createElementVNode)(`div`,ge,[(0,e.createVNode)(d,{content:`展开/折叠`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:(0,e.withModifiers)(e=>n.$emit(`group-action`,`collapse`,r.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(t.collapsedGroups.includes(r.id)?`View`:`Hide`)))]),_:2},1024)]),_:2},1032,[`onClick`])]),_:2},1024),(0,e.createVNode)(d,{content:`修改颜色`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:(0,e.withModifiers)(e=>n.$emit(`group-action`,`color`,r.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Brush))]),_:1})]),_:1},8,[`onClick`])]),_:2},1024),(0,e.createVNode)(d,{content:`删除分组`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,type:`danger`,onClick:(0,e.withModifiers)(e=>n.$emit(`group-action`,`delete`,r.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Delete))]),_:1})]),_:1},8,[`onClick`])]),_:2},1024)])],2))),128))]),t.groups.length?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,_e,`暂无分组`))])]),_:1})]),(0,e.createElementVNode)(`div`,ve,[t.onlineUsers.length>0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ye,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.onlineUsers.slice(0,5),t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.clientId,class:`collab-avatar`,style:(0,e.normalizeStyle)({background:t.color}),title:t.name},(0,e.toDisplayString)(t.name?.charAt(0)),13,be))),128))])):(0,e.createCommentVNode)(``,!0),t.isJoinMode?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createBlock)(l,{key:1,size:`small`,type:t.isConnected?`success`:`default`,onClick:a[7]||=e=>n.$emit(`toggle-collab`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Share))]),_:1}),(0,e.createElementVNode)(`span`,null,(0,e.toDisplayString)(t.isConnected?`协作中`:`协作`),1)]),_:1},8,[`type`])),!t.isJoinMode&&t.isConnected?((0,e.openBlock)(),(0,e.createBlock)(l,{key:2,size:`small`,circle:``,onClick:a[8]||=e=>n.$emit(`share-collab`),title:`分享链接`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Link))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(f,{direction:`vertical`}),(0,e.createVNode)(h,{trigger:`click`,onCommand:a[9]||=e=>n.$emit(`export`,e)},{dropdown:(0,e.withCtx)(()=>[(0,e.createVNode)(m,null,{default:(0,e.withCtx)(()=>[t.activeGroupId?((0,e.openBlock)(),(0,e.createBlock)(p,{key:0,command:`png-filtered`},{default:(0,e.withCtx)(()=>[...a[27]||=[(0,e.createTextVNode)(`PNG(当前分组)`,-1)]]),_:1})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(p,{command:`png`},{default:(0,e.withCtx)(()=>[...a[28]||=[(0,e.createTextVNode)(`PNG(全部)`,-1)]]),_:1}),(0,e.createVNode)(p,{command:`svg`},{default:(0,e.withCtx)(()=>[...a[29]||=[(0,e.createTextVNode)(`SVG`,-1)]]),_:1}),(0,e.createVNode)(p,{command:`pdf`},{default:(0,e.withCtx)(()=>[...a[30]||=[(0,e.createTextVNode)(`PDF`,-1)]]),_:1}),(0,e.createVNode)(p,{command:`html`},{default:(0,e.withCtx)(()=>[...a[31]||=[(0,e.createTextVNode)(`HTML`,-1)]]),_:1}),(0,e.createVNode)(p,{divided:``,command:`json`},{default:(0,e.withCtx)(()=>[...a[32]||=[(0,e.createTextVNode)(`JSON(完整数据)`,-1)]]),_:1})]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`},{default:(0,e.withCtx)(()=>[a[26]||=(0,e.createTextVNode)(`导出`,-1),(0,e.createVNode)(c,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(d,{content:`导入JSON`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(l,{size:`small`,circle:``,onClick:a[10]||=e=>n.$refs.jsonInput.click()},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Upload))]),_:1})]),_:1})]),_:1}),(0,e.createElementVNode)(`input`,{ref:`jsonInput`,type:`file`,accept:`.json`,style:{display:`none`},onChange:a[11]||=e=>n.$emit(`import-json`,e)},null,544),(0,e.createVNode)(l,{size:`small`,onClick:a[12]||=e=>n.$emit(`save`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Download))]),_:1})]),_:1}),t.showHistory?((0,e.openBlock)(),(0,e.createBlock)(l,{key:3,size:`small`,circle:``,title:`更新履历`,onClick:a[13]||=e=>n.$emit(`history`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Clock))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0)])])}}},[[`__scopeId`,`data-v-1c493741`]]),Se=[`src`],Ce=[`onMousedown`],we={class:`leader-line-svg`,style:{left:0,top:0,width:`100%`,height:`100%`}},Te=[`id`,`fill`],Ee=[`d`,`stroke`,`stroke-width`,`stroke-dasharray`,`marker-start`],De=[`onMousedown`],Oe=[`onBlur`],ke=[`onMousedown`],Ae=[`onMousedown`],je=[`onMousedown`],Me=_({__name:`AnnotationCanvas`,props:{imageUrl:String,annotations:{type:Array,default:()=>[]},collapsedGroups:{type:Array,default:()=>[]},selectedId:[String,Number,null],lineStyle:{type:String,default:`straight`}},emits:[`select`,`upload-image`,`change`],setup(t,{expose:n,emit:r}){let a=t,o=r,s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(800),u=(0,e.ref)(600),d=(0,e.ref)(!1),f=(0,e.ref)(null),p=(0,e.computed)(()=>a.annotations.filter(e=>e.groupId?!a.collapsedGroups.includes(e.groupId):!0)),m=(0,e.computed)(()=>a.lineStyle===`dashed`?`8,4`:a.lineStyle===`dotted`?`3,3`:a.lineStyle===`dashdot`?`8,3,2,3`:`none`),h=()=>{let e=s.value,t=c.value;if(!e||!t)return;let n=t.naturalWidth,r=t.naturalHeight,i=e.clientWidth-40,a=e.clientHeight-40,o=i/n,d=a/r,f=Math.min(o,d,1);l.value=Math.round(n*f),u.value=Math.round(r*f)},g=()=>{h()},_=e=>{h()},v=e=>{let t=e.x/100*l.value,n=e.y/100*u.value,r=t+(e.labelX||0),i=n+(e.labelY||0),o=[`dashed`,`dotted`,`dashdot`].includes(a.lineStyle)?`straight`:a.lineStyle;if(o===`straight`||o===`dashed`||o===`dotted`||o===`dashdot`)return`M${t},${n} L${r},${i}`;if(o===`polyline`)return`M${t},${n} L${e.x<50?t+20:t-20},${n} L${r},${i}`;if(o===`right-angle`)return`M${t},${n} L${t},${i} L${r},${i}`;if(o===`curve`)return`M${t},${n} C${e.x<50?t+30:t-30},${n} ${r},${i} ${r},${i}`;if(o===`wave`){let e=r-t,a=i-n,o=Math.sqrt(e*e+a*a),s=Math.max(2,Math.floor(o/20)),c=`M${t},${n}`;for(let r=1;r<=s;r++){let i=r/s,o=t+e*i,l=n+a*i+Math.sin(i*Math.PI*s/2)*8;c+=` L${o},${l}`}return c}return`M${t},${n} L${r},${i}`},y=e=>{let t=e.x/100*l.value,n=e.y/100*u.value,r={left:`${t+(e.labelX||0)}px`,top:`${n+(e.labelY||0)}px`};if(e.labelBgColor){let t=(e.labelBgOpacity??100)/100,n=e.labelBgColor;r.background=`rgba(${parseInt(n.slice(1,3),16)}, ${parseInt(n.slice(3,5),16)}, ${parseInt(n.slice(5,7),16)}, ${t})`}return r},b=e=>({background:e.numberColor||e.color||`#e74c3c`}),x=e=>{let t={fontFamily:e.fontFamily||`inherit`,fontSize:e.fontSize?e.fontSize+`px`:`inherit`};return e.textColor&&(t.color=e.textColor),e.fontWeight===`bold`?t.fontWeight=`bold`:e.fontWeight===`bolder`&&(t.fontWeight=`bolder`),e.fontStyle===`italic`&&(t.fontStyle=`italic`),e.fontStyle===`oblique`&&(t.fontStyle=`oblique`),e.textDecoration===`underline`?t.textDecoration=`underline`:e.textDecoration===`line-through`?t.textDecoration=`line-through`:e.textDecoration===`underline line-through`&&(t.textDecoration=`underline line-through`),t},S=e=>({left:e.x+`%`,top:e.y+`%`}),C=e=>{let t={left:e.x+`%`,top:e.y+`%`,background:e.color||`#e74c3c`};return e.pointStyle===`square`?t.borderRadius=`2px`:e.pointStyle===`diamond`?(t.borderRadius=`2px`,t.transform=`translate(-50%, -50%) rotate(45deg)`):e.pointStyle===`arrow`&&(t.background=`transparent`,t.border=`none`,t.width=`0`,t.height=`0`,t.boxShadow=`none`),t},w=null,T=null,E=(e,t)=>{o(`select`,e),T=`label`,f.value=e.id,d.value=!0,w={ann:e,startX:t.clientX,startY:t.clientY,origLabelX:e.labelX||0,origLabelY:e.labelY||0},document.addEventListener(`mousemove`,O),document.addEventListener(`mouseup`,k)},D=(e,t)=>{o(`select`,e),T=`dot`,f.value=e.id,d.value=!0,w={ann:e,startX:t.clientX,startY:t.clientY,origX:e.x,origY:e.y},document.addEventListener(`mousemove`,O),document.addEventListener(`mouseup`,k)},O=e=>{if(!w)return;let t=e.clientX-w.startX,n=e.clientY-w.startY;if(T===`label`)w.ann.labelX=w.origLabelX+t,w.ann.labelY=w.origLabelY+n;else if(T===`dot`){let e=s.value;if(!e)return;let r=e.querySelector(`.image-wrapper`).getBoundingClientRect(),i=Math.max(0,Math.min(100,w.origX+t/r.width*100)),a=Math.max(0,Math.min(100,w.origY+n/r.height*100));w.ann.x=Math.round(i*10)/10,w.ann.y=Math.round(a*10)/10}},k=()=>{d.value=!1,f.value=null,w=null,T=null,o(`change`),document.removeEventListener(`mousemove`,O),document.removeEventListener(`mouseup`,k)};return n({recalculateSize:g}),(n,r)=>{let a=(0,e.resolveComponent)(`el-icon`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,{class:(0,e.normalizeClass)([`annotation-canvas`,{"is-dragging":d.value}]),ref_key:`containerRef`,ref:s},[t.imageUrl?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`image-wrapper`,style:(0,e.normalizeStyle)({width:l.value+`px`,height:u.value+`px`})},[(0,e.createElementVNode)(`img`,{src:t.imageUrl,onLoad:_,ref_key:`imgRef`,ref:c,class:`annotation-image`,draggable:`false`},null,40,Se),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(p.value,i=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:i.id,class:(0,e.normalizeClass)([`annotation-group`,{selected:t.selectedId===i.id,"is-active":t.selectedId===i.id}]),onMousedown:(0,e.withModifiers)(e=>n.$emit(`select`,i),[`stop`])},[((0,e.openBlock)(),(0,e.createElementBlock)(`svg`,we,[(0,e.createElementVNode)(`defs`,null,[(0,e.createElementVNode)(`marker`,{id:`arrow-start-`+i.id,markerWidth:`10`,markerHeight:`7`,refX:`1`,refY:`3.5`,orient:`auto`,fill:i.lineColor||(t.selectedId===i.id?`#409EFF`:i.color||`#e74c3c`)},[...r[2]||=[(0,e.createElementVNode)(`polygon`,{points:`10 0, 0 3.5, 10 7`},null,-1)]],8,Te)]),(0,e.createElementVNode)(`path`,{d:v(i),fill:`none`,stroke:i.lineColor||(t.selectedId===i.id?`#409EFF`:i.color||`#e74c3c`),"stroke-width":i.strokeWidth||1.5,"stroke-dasharray":m.value,"marker-start":i.pointStyle===`arrow`?`url(#arrow-start-${i.id})`:``},null,8,Ee)])),(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`annotation-label`,{dragging:d.value&&f.value===i.id}]),style:(0,e.normalizeStyle)(y(i)),onMousedown:(0,e.withModifiers)(e=>E(i,e),[`stop`])},[(0,e.createElementVNode)(`span`,{class:`annotation-number`,style:(0,e.normalizeStyle)(b(i))},(0,e.toDisplayString)(i.number),5),(0,e.createElementVNode)(`span`,{class:`annotation-text`,style:(0,e.normalizeStyle)(x(i)),contenteditable:``,onBlur:e=>{i.text=e.target.textContent,o(`change`)},onMousedown:r[0]||=(0,e.withModifiers)(()=>{},[`stop`])},(0,e.toDisplayString)(i.text),45,Oe)],46,De),i.pointStyle===`flag`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`annotation-flag`,style:(0,e.normalizeStyle)(S(i)),onMousedown:(0,e.withModifiers)(e=>D(i,e),[`stop`])},[(0,e.createElementVNode)(`div`,{class:`flag-pole`,style:(0,e.normalizeStyle)({background:i.color||`#e74c3c`})},null,4),(0,e.createElementVNode)(`div`,{class:`flag-cloth`,style:(0,e.normalizeStyle)({background:i.color||`#e74c3c`})},null,4)],44,ke)):i.pointStyle===`arrow`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:2,class:(0,e.normalizeClass)([`annotation-dot arrow-point`,{dragging:d.value&&f.value===i.id}]),style:(0,e.normalizeStyle)(C(i)),onMousedown:(0,e.withModifiers)(e=>D(i,e),[`stop`])},null,46,je)):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:1,class:(0,e.normalizeClass)([`annotation-dot`,[i.pointStyle||`circle`,{dragging:d.value&&f.value===i.id}]]),style:(0,e.normalizeStyle)(C(i)),onMousedown:(0,e.withModifiers)(e=>D(i,e),[`stop`])},null,46,Ae))],42,Ce))),128))],4)):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:1,class:`upload-placeholder`,onClick:r[1]||=e=>n.$emit(`upload-image`)},[(0,e.createVNode)(a,{size:`48`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.UploadFilled))]),_:1}),r[3]||=(0,e.createElementVNode)(`p`,null,`点击上传图片`,-1)]))],2)}}},[[`__scopeId`,`data-v-d9ef76f4`]]);function Ne(t,{roomPrefix:n,syncKey:r=`_data`}={}){let i=new o.Doc,a=(0,e.ref)(!1),c=(0,e.ref)(!1),l=(0,e.ref)(!1),u=(0,e.ref)(!1),d=(0,e.ref)([]),f=null,p=null,m=null,h=null,g=!1,_=null,v=`ws://${window.location.hostname||`localhost`}:1234`,y=`${n}-${t}`,b=()=>{x(),_=setInterval(()=>{if(f&&f.connection&&f.connection.ws&&f.connection.ws.readyState===WebSocket.CLOSED)try{f.connect()}catch(e){console.warn(`[ExplosionCollab] reconnect failed:`,e)}},3e4)},x=()=>{_&&=(clearInterval(_),null)};f=new s.HocuspocusProvider({url:v,name:y,document:i,connect:!1,reconnect:!0,onConnect:()=>{a.value=!0,b()},onClose:()=>{a.value=!1,c.value=!1},onSynced:({state:e})=>{c.value=e}}),f.awareness.on(`change`,()=>{d.value=Array.from(f.awareness.getStates().entries()).filter(([e,t])=>t.user).map(([e,t])=>({clientId:e,...t.user}))}),p=i.getMap(n);let S=i.getMap(`_meta`);S.observe(e=>{e.keysChanged.has(`_closed`)&&(u.value=S.get(`_closed`)===!0,u.value&&console.log(`[ExplosionCollab] collaboration closed by owner`))});let C=()=>{f.connect()},w=()=>{if(x(),f){try{f.disconnect(),f.destroy()}catch(e){console.warn(`[ExplosionCollab] disconnect error:`,e)}f=null}a.value=!1,c.value=!1,d.value=[]},T=(e={})=>(g=!1,f.connect(),new Promise(t=>{let n=()=>{f&&c.value?(g=!0,e.userInfo&&f.awareness.setLocalStateField(`user`,e.userInfo),t()):setTimeout(n,100)};setTimeout(n,200)})),E=e=>{!a.value||!p||(m&&clearTimeout(m),m=setTimeout(()=>{let t=JSON.stringify(e);h=t,i.transact(()=>{p.set(r,t)})},50))},D=()=>{if(!p)return null;let e=p.get(r);if(!e)return null;h=e;try{return JSON.parse(e)}catch{return null}},O=e=>{f&&f.awareness.setLocalStateField(`user`,{id:e.id||`user-${Date.now()}`,name:e.name||`用户${Math.floor(Math.random()*1e3)}`,color:e.color||`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`,...e})},k=()=>{u.value=!0,i.transact(()=>{S.set(`_closed`,!0)}),g=!1,f?.awareness?.setLocalState(null),w(),l.value=!1},A=()=>S.get(`_closed`)===!0?(u.value=!0,!0):!1,j=()=>{w(),i.destroy()};return(0,e.onUnmounted)(()=>j()),{ydoc:i,provider:f,yMap:p,isConnected:a,isSynced:c,isCollabOwner:l,collaborationClosed:u,onlineUsers:d,connect:C,disconnect:w,init:T,pushToYjs:E,pullFromYjs:D,setLocalUser:O,closeCollaboration:k,checkCollaborationClosed:A,destroy:j,_getSyncReady:()=>g,_setSyncReady:e=>{g=e},_getLastSyncedValue:()=>h,_setLastSyncedValue:e=>{h=e}}}var Pe=(e,{onRemoteChange:t}={})=>{let n=Ne(e,{roomPrefix:`explosion-image`,syncKey:`_data`});t&&n.yMap.observe(e=>{if(!n._getSyncReady())return;let r=n.yMap.get(`_data`);if(r&&r!==n._getLastSyncedValue()){n._setLastSyncedValue(r);try{t(JSON.parse(r))}catch(e){console.error(`[EV-Image] remote data parse error:`,e)}}});let r=e=>{n.pushToYjs({title:e.title,imageUrl:e.imageUrl,annotations:e.annotations,groups:e.groups})},i=()=>n.pullFromYjs();return{...n,pushToYjs:r,pullFromYjs:i}},Fe={class:`explosion-image-editor`},Ie={class:`editor-body`},Le={class:`canvas-area`},Re={class:`props-panel`},ze={class:`prop-row`},Be={class:`prop-row`},Ve={class:`prop-row`},He={class:`prop-row`},Ue={class:`prop-row`},We={class:`prop-row`},Ge={class:`prop-row`},Ke={class:`prop-row`},qe={class:`prop-row`},Je={class:`prop-row`},Ye={class:`prop-row`},Xe={class:`prop-row`},Ze={class:`font-style-btns`},Qe={class:`prop-row`},$e={class:`font-style-btns`},et={class:`prop-row`},tt={class:`prop-row`},nt={class:`prop-row`},rt={class:`prop-row`},it={key:0,class:`prop-row filter-info`},at={key:1,class:`no-selection`},ot={class:`color-dialog-body`},st=`explosion-image`,ct=_({__name:`ExplosionImageEditor`,props:{docId:{type:[Number,String],default:null},apiBase:{type:String,default:`/api`},saveApi:{type:[String,Function],default:null},loadApi:{type:[String,Function],default:null},wsUrl:{type:String,default:``},user:{type:Object,default:null},uiConfig:{type:Object,default:()=>({})},aiApi:{type:[String,Object],default:null}},setup(t){let o=t,s=(0,e.computed)(()=>({backButton:`show`,titleEditable:!0,authorEditable:!0,...o.uiConfig})),c=(0,e.computed)(()=>o.docId??l.params.id),l=(0,n.useRoute)(),u=(0,n.useRouter)(),d=(0,e.ref)(o.docId??null),f=(0,e.ref)(null),p=(0,e.ref)(!1),m=(0,e.ref)(!1),{saveVersion:h}=q(),g=B(),_=W(()=>o.aiApi),v=(0,e.reactive)({title:`图片标注`,imageUrl:``,annotations:[],groups:[]}),y=(0,e.ref)(!1),b=(0,e.ref)(!1),x=(0,e.ref)(!1),S=null,C=(0,e.ref)(`straight`),w=(0,e.ref)(null),T=(0,e.ref)(null),E=(0,e.ref)(null),D=0,O=(0,e.ref)(null),k=(0,e.ref)([]),A=(0,e.computed)(()=>O.value?v.annotations.filter(e=>e.groupId===O.value):v.annotations),j=()=>f.value?.click(),M=async e=>{let t=e.target.files?.[0];if(!t)return;let n=new FormData;n.append(`file`,t);try{let e=await a.default.post(`${o.apiBase}/files/upload/image`,n);v.imageUrl=e.data.url||e.data.file_path,X()}catch{r.ElMessage.error(`上传失败`)}},ee=()=>{if(!v.imageUrl){r.ElMessage.warning(`请先上传图片`);return}let e=v.annotations.reduce((e,t)=>Math.max(e,t.number),0);v.annotations.push({id:`ann-${++D}-${Date.now()}`,number:e+1,text:``,x:50,y:50,labelX:80,labelY:-30,color:`#e74c3c`,numberColor:``,textColor:``,labelBgColor:``,labelBgOpacity:100,lineColor:``,strokeWidth:1.5,pointStyle:`circle`,fontFamily:``,fontSize:13,fontWeight:``,fontStyle:``,textDecoration:``,groupId:``}),X()},N=e=>{w.value=e.id,T.value=e},P=(e,t)=>{T.value&&(T.value[e]===t?T.value[e]=``:T.value[e]=t)},F=()=>{T.value&&(T.value.fontFamily=``,T.value.fontSize=13,T.value.fontWeight=``,T.value.fontStyle=``,T.value.textDecoration=``)},I=()=>{v.annotations=v.annotations.filter(e=>e.id!==w.value),w.value=null,T.value=null,X()},L=e=>{e===`new`&&r.ElMessageBox.prompt(`分组名称`,`新建分组`,{inputPlaceholder:`名称`}).then(({value:e})=>{e&&(v.groups.push({id:`grp-${Date.now()}`,name:e}),X())}).catch(()=>{})},R=(e,t)=>{e===`filter`?O.value=O.value===t?null:t:e===`collapse`?G(t):e===`color`?(V.value=t,z.value=!0):e===`delete`&&r.ElMessageBox.confirm(`确定删除该分组?分组内的标注将保留,但分组关系将被移除。`,`删除分组`,{type:`warning`}).then(()=>{v.annotations.forEach(e=>{e.groupId===t&&(e.groupId=``)}),v.groups=v.groups.filter(e=>e.id!==t),O.value===t&&(O.value=null),r.ElMessage.success(`分组已删除`),X()}).catch(()=>{})},z=(0,e.ref)(!1),V=(0,e.ref)(null),H=(0,e.ref)(`#e74c3c`),U=()=>{v.annotations.forEach(e=>{e.groupId===V.value&&(e.color=H.value,e.numberColor=H.value,e.lineColor=H.value,e.textColor=H.value)}),z.value=!1,r.ElMessage.success(`颜色已更新`),X()},G=e=>{let t=k.value.indexOf(e);t===-1?k.value.push(e):k.value.splice(t,1)},K=()=>{O.value=null,k.value=[]},J=async()=>{if(y.value&&S?.collaborationClosed.value&&!x.value){r.ElMessage.warning(`协作已关闭,无法保存`);return}try{let e={title:v.title,view_type:`image`,config:JSON.stringify({imageUrl:v.imageUrl,annotations:v.annotations,groups:v.groups,lineStyle:C.value})};if(typeof o.saveApi==`function`){let t=await o.saveApi(e,d.value);t?.id&&(d.value=t.id)}else if(typeof o.saveApi==`string`)d.value?await a.default.put(o.saveApi,e):d.value=(await a.default.post(o.saveApi,e)).data.id;else{let t=o.apiBase;d.value?await a.default.put(`${t}/explosion-views/${d.value}`,e):d.value=(await a.default.post(`${t}/explosion-views/`,e)).data.id}r.ElMessage.success(`保存成功`),h({documentId:d.value,docType:`image`,content:JSON.stringify({imageUrl:v.imageUrl,annotations:v.annotations,groups:v.groups,lineStyle:C.value}),userId:String(g.currentUser.value?.id||``),userName:g.currentUser.value?.name||`未知`})}catch{r.ElMessage.error(`保存失败`)}},Y=async()=>{if(c.value)try{let e;if(typeof o.loadApi==`function`)e=await o.loadApi(c.value);else if(typeof o.loadApi==`string`)e=(await a.default.get(o.loadApi)).data;else{let t=o.apiBase;e=(await a.default.get(`${t}/explosion-views/${c.value}`)).data}if(d.value=e.id,v.title=e.title,e.config){let t=JSON.parse(e.config);v.imageUrl=t.imageUrl||``,v.annotations=t.annotations||[],v.groups=t.groups||[],C.value=t.lineStyle||`straight`}}catch(e){console.error(e)}},ne=()=>{o.docId??u.push(`/`)},re=async(e,t={})=>{let n=d.value?`${st}-${d.value}`:null;await g.sendMessage(e,{...t,roomId:n});let r=t.mentionedUser,i=r&&r.toLowerCase().includes(`ai`),a=g.collabUsers.value.filter(e=>e.name!==g.currentUser.value.name);if(!r||i||a.length===0){g.loading.value=!0;try{let t=await _.chat(e,g.messages.value);g.sendAiMessage(t,n)}catch(e){g.sendAiMessage(`AI 请求失败: `+(e.message||`未知错误`),n)}finally{g.loading.value=!1}}},ie=()=>{let e=d.value?`${st}-${d.value}`:null;g.clearMessages(e)},ae=()=>{if(!d.value){r.ElMessage.warning(`请先保存文档`);return}m.value=!0},oe=e=>{try{let t=typeof e==`string`?JSON.parse(e):e;t.imageUrl&&(v.imageUrl=t.imageUrl),t.annotations&&(v.annotations=t.annotations),t.groups&&(v.groups=t.groups),t.lineStyle&&(C.value=t.lineStyle),w.value=null,T.value=null}catch(e){console.error(`Version apply error:`,e)}},se=e=>{if(e===`png`||e===`png-filtered`){let t=document.querySelector(`.annotation-image`);if(!t)return r.ElMessage.error(`未找到图片`);let n=document.createElement(`canvas`);n.width=t.naturalWidth,n.height=t.naturalHeight;let i=n.getContext(`2d`);i.drawImage(t,0,0);let a=n.width/t.clientWidth,o=n.height/t.clientHeight,s=Math.max(a,o),c=e===`png-filtered`?A.value:v.annotations,l=[`dashed`,`dotted`,`dashdot`].includes(C.value)?`straight`:C.value,u=c.map(e=>{let t=e.x/100*n.width,r=e.y/100*n.height;return{ann:e,x:t,y:r,lx:t+(e.labelX||0)*a,ly:r+(e.labelY||0)*o}});u.forEach(({ann:e,x:t,y:n,lx:r,ly:c})=>{let u=e.color||`#e74c3c`,d=e.lineColor||u,f=(e.strokeWidth||1.5)*s;if(i.strokeStyle=d,i.lineWidth=f,i.setLineDash([]),l===`dashed`?i.setLineDash([8*a,4*o]):l===`dotted`?i.setLineDash([3*a,3*o]):l===`dashdot`&&i.setLineDash([8*a,3*o,2*a,3*o]),i.beginPath(),l===`polyline`){let o=e.x<50?t+20*a:t-20*a;i.moveTo(t,n),i.lineTo(o,n),i.lineTo(r,c)}else if(l===`right-angle`)i.moveTo(t,n),i.lineTo(t,c),i.lineTo(r,c);else if(l===`curve`){let o=e.x<50?t+30*a:t-30*a;i.moveTo(t,n),i.bezierCurveTo(o,n,r,c,r,c)}else if(l===`wave`){let e=r-t,s=c-n,l=Math.sqrt(e*e+s*s),u=Math.max(2,Math.floor(l/(20*a)));i.moveTo(t,n);for(let r=1;r<=u;r++){let a=r/u;i.lineTo(t+e*a,n+s*a+Math.sin(a*Math.PI*u/2)*8*o)}}else i.moveTo(t,n),i.lineTo(r,c);i.stroke(),i.setLineDash([]);let p=10*s,m=e.pointStyle||`circle`;if(m===`square`)i.fillStyle=u,i.fillRect(t-p,n-p,p*2,p*2);else if(m===`diamond`)i.fillStyle=u,i.beginPath(),i.moveTo(t,n-p*1.2),i.lineTo(t+p*1.2,n),i.lineTo(t,n+p*1.2),i.lineTo(t-p*1.2,n),i.closePath(),i.fill();else if(m===`arrow`){i.fillStyle=d,i.beginPath();let e=Math.atan2(c-n,r-t),a=p*1.5;i.moveTo(t+Math.cos(e)*a,n+Math.sin(e)*a),i.lineTo(t+Math.cos(e+2.5)*a*.6,n+Math.sin(e+2.5)*a*.6),i.lineTo(t+Math.cos(e-2.5)*a*.6,n+Math.sin(e-2.5)*a*.6),i.closePath(),i.fill()}else m===`flag`?(i.strokeStyle=u,i.lineWidth=2*s,i.beginPath(),i.moveTo(t,n),i.lineTo(t,n-20*o),i.stroke(),i.fillStyle=u,i.beginPath(),i.moveTo(t,n-20*o),i.lineTo(t+14*a,n-15*o),i.lineTo(t,n-10*o),i.closePath(),i.fill()):(i.fillStyle=u,i.beginPath(),i.arc(t,n,p,0,Math.PI*2),i.fill())}),10*s,u.forEach(({ann:e,lx:t,ly:n})=>{let r=e.color||`#e74c3c`,a=e.numberColor||r,o=11*s;if(i.fillStyle=a,i.beginPath(),i.arc(t,n,o,0,Math.PI*2),i.fill(),i.fillStyle=`#fff`,i.font=`bold ${o}px sans-serif`,i.textAlign=`center`,i.textBaseline=`middle`,i.fillText(String(e.number),t,n),e.text){let r=(e.fontSize||13)*s,a=e.fontWeight===`bold`||e.fontWeight===`bolder`?`bold `:``;i.font=`${e.fontStyle===`italic`||e.fontStyle===`oblique`?`italic `:``}${a}${r}px ${e.fontFamily||`sans-serif`}`;let c=i.measureText(e.text).width,l=4*s,u=t+o+l,d=u-l,f=n-r/2-l,p=c+l*2,m=r+l*2;if(e.labelBgColor){let t=(e.labelBgOpacity??100)/100,n=e.labelBgColor;i.fillStyle=`rgba(${parseInt(n.slice(1,3),16)}, ${parseInt(n.slice(3,5),16)}, ${parseInt(n.slice(5,7),16)}, ${t})`}else i.fillStyle=`rgba(255,255,255,0.9)`;i.beginPath(),i.roundRect(d,f,p,m,3*s),i.fill(),i.fillStyle=e.textColor||`#333`,i.textAlign=`left`,i.textBaseline=`middle`,i.fillText(e.text,u,n)}}),n.toBlob(e=>{let t=document.createElement(`a`);t.href=URL.createObjectURL(e),t.download=`${v.title||`图片标注`}.png`,t.click()})}else e===`json`?ce():r.ElMessage.info(`导出 ${e} 开发中`)},ce=()=>{let e={title:v.title,imageUrl:v.imageUrl,annotations:v.annotations,groups:v.groups,lineStyle:C.value,exportTime:new Date().toISOString()},t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=document.createElement(`a`);n.href=URL.createObjectURL(t),n.download=`${v.title||`爆炸图`}.json`,n.click(),r.ElMessage.success(`JSON已导出`)},le=e=>{let t=e.target.files[0];if(!t)return;let n=new FileReader;n.onload=e=>{try{let t=JSON.parse(e.target.result);if(!t.imageUrl&&(!t.annotations||!t.annotations.length)){r.ElMessage.error(`JSON格式无效:缺少图片或标注数据`);return}v.title=t.title||`图片标注`,v.imageUrl=t.imageUrl||``,v.annotations=t.annotations||[],v.groups=t.groups||[],C.value=t.lineStyle||`straight`,w.value=null,T.value=null,X(),r.ElMessage.success(`导入成功`)}catch{r.ElMessage.error(`JSON解析失败,请检查文件格式`)}},n.readAsText(t),e.target.value=``},X=()=>{y.value&&S&&S.pushToYjs(v)};(0,e.watch)(T,()=>{X()},{deep:!0});let Z=e=>{S&&=(S.destroy(),null),S=Pe(e,{onRemoteChange:e=>{e.title&&(v.title=e.title),e.imageUrl&&(v.imageUrl=e.imageUrl),e.annotations&&(v.annotations=e.annotations),e.groups&&(v.groups=e.groups)}}),S._setSyncReady(!1)},Q=async()=>{if(y.value)return;if(!d.value&&(await J(),!d.value)){r.ElMessage.error(`请先保存文档`);return}Z(String(d.value)),S.connect();let e={name:`用户${Math.floor(Math.random()*1e3)}`,color:`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`},t=()=>{if(S.provider&&S.provider.synced){S._setSyncReady(!0),S.setLocalUser(e);let t=S.pullFromYjs();t?(t.title&&(v.title=t.title),t.imageUrl&&(v.imageUrl=t.imageUrl),t.annotations&&(v.annotations=t.annotations),t.groups&&(v.groups=t.groups)):(v.annotations.length>0||v.imageUrl)&&S.pushToYjs(v),y.value=!0,x.value=!0,b.value=!1,g.setCollabContext({ydoc:S.ydoc,provider:S.provider,onlineUsers:S.onlineUsers}),g.setCurrentUser({id:S.provider.awareness.clientID,name:e.name,color:e.color}),r.ElMessage.success(`协作已开启`)}else setTimeout(t,100)};setTimeout(t,200)},de=()=>{S&&(S.closeCollaboration(),y.value=!1,x.value=!1,r.ElMessage.info(`协作已关闭`))},fe=()=>{let e=l.params.id;if(!e)return;Z(e),S.connect();let t={name:`协作人${Math.floor(Math.random()*1e3)}`,color:`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`},n=()=>{if(S.provider&&S.provider.synced){if(S.checkCollaborationClosed()){S.disconnect(),y.value=!1,r.ElMessage.warning(`该协作已关闭,无法加入`);return}S._setSyncReady(!0),S.setLocalUser(t);let e=S.pullFromYjs();e&&(e.title&&(v.title=e.title),e.imageUrl&&(v.imageUrl=e.imageUrl),e.annotations&&(v.annotations=e.annotations),e.groups&&(v.groups=e.groups)),y.value=!0,x.value=!1,g.setCollabContext({ydoc:S.ydoc,provider:S.provider,onlineUsers:S.onlineUsers}),g.setCurrentUser({id:S.provider.awareness.clientID,name:t.name,color:t.color}),r.ElMessage.success(`已加入协作`)}else setTimeout(n,100)};setTimeout(n,200)},pe=()=>{y.value?de():Q()},me=async()=>{if(y.value||await Q(),!d.value&&(await J(),!d.value)){r.ElMessage.warning(`请先保存文档后再分享`);return}let e=`${window.location.origin}/explosion-image/${d.value}?collab=1`;try{await navigator.clipboard.writeText(e),r.ElMessage.success(`协作链接已复制到剪贴板`)}catch{r.ElMessage.info(`协作链接: `+e)}};(0,e.onMounted)(async()=>{let e=o.user?.name||localStorage.getItem(`editor-user-name`)||`用户${Math.floor(Math.random()*1e3)}`;localStorage.setItem(`editor-user-name`,e),g.setCurrentUser({id:o.user?.id||Date.now(),name:e,color:o.user?.color||`#409eff`}),await Y(),c.value&&l.query.collab===`1`&&fe()});let $=e=>{e.key===`Delete`&&w.value&&I()};return(0,e.onMounted)(()=>document.addEventListener(`keydown`,$)),(0,e.onUnmounted)(()=>{document.removeEventListener(`keydown`,$),S&&=(S.destroy(),null)}),(t,n)=>{let r=(0,e.resolveComponent)(`el-input-number`),a=(0,e.resolveComponent)(`el-input`),o=(0,e.resolveComponent)(`el-color-picker`),c=(0,e.resolveComponent)(`el-option`),u=(0,e.resolveComponent)(`el-select`),h=(0,e.resolveComponent)(`el-slider`),_=(0,e.resolveComponent)(`el-button`),b=(0,e.resolveComponent)(`el-icon`),D=(0,e.resolveComponent)(`el-tag`),B=(0,e.resolveComponent)(`el-dialog`),V=(0,e.resolveComponent)(`Monitor`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,Fe,[(0,e.createVNode)(xe,{title:v.title,"onUpdate:title":n[0]||=e=>v.title=e,"line-style":C.value,groups:v.groups,"active-group-id":O.value,"collapsed-groups":k.value,"is-connected":y.value,"online-users":(0,e.unref)(S)?(0,e.unref)(S).onlineUsers.value:[],"is-join-mode":(0,e.unref)(l).query.collab===`1`,"show-back-button":s.value.backButton===`show`,"title-disabled":!s.value.titleEditable,onBack:ne,onAddAnnotation:ee,onSetLineStyle:n[1]||=e=>C.value=e,onAddGroup:L,onGroupAction:R,onClearGroupFilter:K,onExport:se,onImportJson:le,onSave:J,onToggleCollab:pe,onShareCollab:me,"show-history":!!d.value,onHistory:ae},null,8,[`title`,`line-style`,`groups`,`active-group-id`,`collapsed-groups`,`is-connected`,`online-users`,`is-join-mode`,`show-back-button`,`title-disabled`,`show-history`]),(0,e.createElementVNode)(`div`,Ie,[(0,e.createElementVNode)(`div`,Le,[(0,e.createVNode)(Me,{ref_key:`annotationCanvasRef`,ref:E,"image-url":v.imageUrl,annotations:A.value,"collapsed-groups":k.value,"selected-id":w.value,"line-style":C.value,onSelect:N,onUploadImage:j,onChange:X},null,8,[`image-url`,`annotations`,`collapsed-groups`,`selected-id`,`line-style`]),(0,e.createElementVNode)(`input`,{ref_key:`fileInputRef`,ref:f,type:`file`,accept:`image/*`,style:{display:`none`},onChange:M},null,544)]),(0,e.createElementVNode)(`div`,Re,[n[58]||=(0,e.createElementVNode)(`h4`,null,`标注属性`,-1),T.value?((0,e.openBlock)(),(0,e.createElementBlock)(e.Fragment,{key:0},[(0,e.createElementVNode)(`div`,ze,[n[31]||=(0,e.createElementVNode)(`label`,null,`编号`,-1),(0,e.createVNode)(r,{modelValue:T.value.number,"onUpdate:modelValue":n[2]||=e=>T.value.number=e,min:1,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Be,[n[32]||=(0,e.createElementVNode)(`label`,null,`文字`,-1),(0,e.createVNode)(a,{modelValue:T.value.text,"onUpdate:modelValue":n[3]||=e=>T.value.text=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ve,[n[33]||=(0,e.createElementVNode)(`label`,null,`引线颜色`,-1),(0,e.createVNode)(o,{modelValue:T.value.lineColor,"onUpdate:modelValue":n[4]||=e=>T.value.lineColor=e,size:`small`,"show-alpha":``},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,He,[n[34]||=(0,e.createElementVNode)(`label`,null,`标注点样式`,-1),(0,e.createVNode)(u,{modelValue:T.value.pointStyle,"onUpdate:modelValue":n[5]||=e=>T.value.pointStyle=e,size:`small`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,{label:`圆形`,value:`circle`}),(0,e.createVNode)(c,{label:`方形`,value:`square`}),(0,e.createVNode)(c,{label:`菱形`,value:`diamond`}),(0,e.createVNode)(c,{label:`箭头`,value:`arrow`}),(0,e.createVNode)(c,{label:`红旗`,value:`flag`})]),_:1},8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ue,[n[35]||=(0,e.createElementVNode)(`label`,null,`标注点颜色`,-1),(0,e.createVNode)(o,{modelValue:T.value.color,"onUpdate:modelValue":n[6]||=e=>T.value.color=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,We,[n[36]||=(0,e.createElementVNode)(`label`,null,`编号颜色`,-1),(0,e.createVNode)(o,{modelValue:T.value.numberColor,"onUpdate:modelValue":n[7]||=e=>T.value.numberColor=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ge,[n[37]||=(0,e.createElementVNode)(`label`,null,`文字颜色`,-1),(0,e.createVNode)(o,{modelValue:T.value.textColor,"onUpdate:modelValue":n[8]||=e=>T.value.textColor=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ke,[n[38]||=(0,e.createElementVNode)(`label`,null,`文字背景色`,-1),(0,e.createVNode)(o,{modelValue:T.value.labelBgColor,"onUpdate:modelValue":n[9]||=e=>T.value.labelBgColor=e,size:`small`,"show-alpha":``},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,qe,[n[39]||=(0,e.createElementVNode)(`label`,null,`背景透明度`,-1),(0,e.createVNode)(h,{modelValue:T.value.labelBgOpacity,"onUpdate:modelValue":n[10]||=e=>T.value.labelBgOpacity=e,min:0,max:100,step:5,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Je,[n[40]||=(0,e.createElementVNode)(`label`,null,`字体`,-1),(0,e.createVNode)(u,{modelValue:T.value.fontFamily,"onUpdate:modelValue":n[11]||=e=>T.value.fontFamily=e,size:`small`,clearable:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(c,{label:`默认`,value:``}),(0,e.createVNode)(c,{label:`宋体`,value:`SimSun`}),(0,e.createVNode)(c,{label:`黑体`,value:`SimHei`}),(0,e.createVNode)(c,{label:`微软雅黑`,value:`Microsoft YaHei`}),(0,e.createVNode)(c,{label:`楷体`,value:`KaiTi`}),(0,e.createVNode)(c,{label:`Arial`,value:`Arial`}),(0,e.createVNode)(c,{label:`Times New Roman`,value:`Times New Roman`})]),_:1},8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ye,[n[41]||=(0,e.createElementVNode)(`label`,null,`字号`,-1),(0,e.createVNode)(r,{modelValue:T.value.fontSize,"onUpdate:modelValue":n[12]||=e=>T.value.fontSize=e,min:10,max:32,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Xe,[n[46]||=(0,e.createElementVNode)(`label`,null,`字体样式`,-1),(0,e.createElementVNode)(`div`,Ze,[(0,e.createVNode)(_,{type:T.value.fontWeight===`bold`?`primary`:``,size:`small`,onClick:n[13]||=e=>P(`fontWeight`,`bold`)},{default:(0,e.withCtx)(()=>[...n[42]||=[(0,e.createElementVNode)(`b`,null,`B`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(_,{type:T.value.fontWeight===`bolder`?`primary`:``,size:`small`,onClick:n[14]||=e=>P(`fontWeight`,`bolder`)},{default:(0,e.withCtx)(()=>[...n[43]||=[(0,e.createElementVNode)(`b`,{style:{"font-size":`14px`}},`B`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(_,{type:T.value.fontStyle===`italic`?`primary`:``,size:`small`,onClick:n[15]||=e=>P(`fontStyle`,`italic`)},{default:(0,e.withCtx)(()=>[...n[44]||=[(0,e.createElementVNode)(`i`,null,`I`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(_,{type:T.value.fontStyle===`oblique`?`primary`:``,size:`small`,onClick:n[16]||=e=>P(`fontStyle`,`oblique`)},{default:(0,e.withCtx)(()=>[...n[45]||=[(0,e.createElementVNode)(`i`,{style:{"font-style":`oblique`}},`I`,-1)]]),_:1},8,[`type`])])]),(0,e.createElementVNode)(`div`,Qe,[n[51]||=(0,e.createElementVNode)(`label`,null,`装饰`,-1),(0,e.createElementVNode)(`div`,$e,[(0,e.createVNode)(_,{type:T.value.textDecoration===`underline`?`primary`:``,size:`small`,onClick:n[17]||=e=>P(`textDecoration`,`underline`)},{default:(0,e.withCtx)(()=>[...n[47]||=[(0,e.createElementVNode)(`u`,null,`U`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(_,{type:T.value.textDecoration===`line-through`?`primary`:``,size:`small`,onClick:n[18]||=e=>P(`textDecoration`,`line-through`)},{default:(0,e.withCtx)(()=>[...n[48]||=[(0,e.createElementVNode)(`s`,null,`S`,-1)]]),_:1},8,[`type`]),(0,e.createVNode)(_,{type:T.value.textDecoration===`underline line-through`?`primary`:``,size:`small`,onClick:n[19]||=e=>P(`textDecoration`,`underline line-through`)},{default:(0,e.withCtx)(()=>[...n[49]||=[(0,e.createElementVNode)(`u`,null,[(0,e.createElementVNode)(`s`,null,`U`)],-1)]]),_:1},8,[`type`]),(0,e.createVNode)(_,{size:`small`,onClick:F},{default:(0,e.withCtx)(()=>[...n[50]||=[(0,e.createTextVNode)(`清除`,-1)]]),_:1})])]),(0,e.createElementVNode)(`div`,et,[n[52]||=(0,e.createElementVNode)(`label`,null,`X% (点)`,-1),(0,e.createVNode)(h,{modelValue:T.value.x,"onUpdate:modelValue":n[20]||=e=>T.value.x=e,min:0,max:100,step:.5,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,tt,[n[53]||=(0,e.createElementVNode)(`label`,null,`Y% (点)`,-1),(0,e.createVNode)(h,{modelValue:T.value.y,"onUpdate:modelValue":n[21]||=e=>T.value.y=e,min:0,max:100,step:.5,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,nt,[n[54]||=(0,e.createElementVNode)(`label`,null,`线宽`,-1),(0,e.createVNode)(r,{modelValue:T.value.strokeWidth,"onUpdate:modelValue":n[22]||=e=>T.value.strokeWidth=e,min:1,max:5,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,rt,[n[55]||=(0,e.createElementVNode)(`label`,null,`分组`,-1),(0,e.createVNode)(u,{modelValue:T.value.groupId,"onUpdate:modelValue":n[23]||=e=>T.value.groupId=e,size:`small`,clearable:``},{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(v.groups,t=>((0,e.openBlock)(),(0,e.createBlock)(c,{key:t.id,label:t.name,value:t.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),O.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,it,[(0,e.createVNode)(D,{size:`small`,type:`info`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)(` 当前筛选: `+(0,e.toDisplayString)(v.groups.find(e=>e.id===O.value)?.name||`未知分组`)+` `,1),(0,e.createVNode)(b,{class:`el-tag__close`,onClick:K},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1})]),_:1})])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(_,{size:`small`,type:`danger`,onClick:I},{default:(0,e.withCtx)(()=>[...n[56]||=[(0,e.createTextVNode)(`删除`,-1)]]),_:1})],64)):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,at,[(0,e.createVNode)(b,{size:`48`,color:`#ccc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.InfoFilled))]),_:1}),n[57]||=(0,e.createElementVNode)(`p`,null,`点击标注进行编辑`,-1)]))])]),(0,e.createVNode)(B,{modelValue:z.value,"onUpdate:modelValue":n[26]||=e=>z.value=e,title:`批量修改颜色`,width:`320px`,"show-close":!0},{footer:(0,e.withCtx)(()=>[(0,e.createVNode)(_,{onClick:n[25]||=e=>z.value=!1},{default:(0,e.withCtx)(()=>[...n[60]||=[(0,e.createTextVNode)(`取消`,-1)]]),_:1}),(0,e.createVNode)(_,{type:`primary`,onClick:U},{default:(0,e.withCtx)(()=>[...n[61]||=[(0,e.createTextVNode)(`确定`,-1)]]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,ot,[n[59]||=(0,e.createElementVNode)(`span`,null,`选择颜色:`,-1),(0,e.createVNode)(o,{modelValue:H.value,"onUpdate:modelValue":n[24]||=e=>H.value=e,"show-alpha":``},null,8,[`modelValue`])])]),_:1},8,[`modelValue`]),(0,e.createVNode)(_,{class:`ai-chat-fab`,type:p.value?`primary`:`default`,circle:``,size:`large`,onClick:n[27]||=e=>p.value=!p.value,title:`AI助手`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(b,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(V)]),_:1})]),_:1},8,[`type`]),(0,e.createVNode)(te,{visible:p.value,messages:(0,e.unref)(g).messages.value,loading:(0,e.unref)(g).loading.value,"is-collab":(0,e.unref)(g).isCollabMode.value,"collab-users":(0,e.unref)(g).collabUsers.value,"current-user":(0,e.unref)(g).currentUser.value,"is-owner":x.value,onSend:re,onClose:n[28]||=e=>p.value=!1,"unread-mention":(0,e.unref)(g).unreadMention.value,onClearUnread:n[29]||=t=>(0,e.unref)(g).clearUnreadMention(),onClear:ie},null,8,[`visible`,`messages`,`loading`,`is-collab`,`collab-users`,`current-user`,`is-owner`,`unread-mention`]),(0,e.createVNode)(ue,{modelValue:m.value,"onUpdate:modelValue":n[30]||=e=>m.value=e,"document-id":d.value,onApply:oe},null,8,[`modelValue`,`document-id`])])}}},[[`__scopeId`,`data-v-e25c1b61`]]);return(0,e.defineComponent)({name:`YourCompanyExplosionImage`,props:{docId:{type:[Number,String],default:null},apiBase:{type:String,default:`/api`},saveApi:{type:[String,Function],default:null},loadApi:{type:[String,Function],default:null},wsUrl:{type:String,default:``},user:{type:Object,default:()=>({id:``,name:``,color:``})},roomId:{type:String,default:``},uiConfig:{type:Object,default:()=>({})},aiApi:{type:[String,Object],default:null}},setup(n,{slots:r}){return()=>(0,e.h)(`div`,{class:`yourcompany-explosion-image-wrapper`,style:`position:relative`},[(0,e.h)(ct,{...n}),(0,e.h)(t.BrandWatermark)])}})});