@mx-sose-front/mx-sose-graph 1.1.0 → 1.1.2

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.
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.context-menu[data-v-3f0901d5]{background-color:#fff;border:1px solid #ebeef5;border-radius:6px;box-shadow:0 2px 12px #0000001a;padding:6px 0;overflow-y:auto;box-sizing:border-box;transition:opacity .2s ease,transform .2s ease;transform-origin:top left}.context-menu[style*="display: block"][data-v-3f0901d5]{animation:fadeIn-3f0901d5 .2s ease forwards}@keyframes fadeIn-3f0901d5{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.context-menu[data-v-3f0901d5]::-webkit-scrollbar{width:6px}.context-menu[data-v-3f0901d5]::-webkit-scrollbar-thumb{background-color:#ddd;border-radius:3px}.context-menu[data-v-3f0901d5]::-webkit-scrollbar-track{background-color:#f5f5f5}.menu-item[data-v-3f0901d5]{padding:0 15px;cursor:pointer;font-size:14px;color:#606266;border-radius:4px;height:36px;line-height:36px;box-sizing:border-box}.menu-item[data-v-3f0901d5]:hover{background-color:#f5f7fa;color:#303133}.menu-disabled[data-v-3f0901d5]{color:#c0c4cc!important;cursor:not-allowed!important;pointer-events:none}.menu-disabled[data-v-3f0901d5]:hover{background-color:transparent!important}.menu-disabled img[data-v-3f0901d5]{opacity:.5}.context-menu[style*="--edge-hint: left"][data-v-3f0901d5]{border-top-left-radius:0}.context-menu[style*="--edge-hint: right"][data-v-3f0901d5]{border-top-right-radius:0}.context-menu[style*="--edge-hint: top"][data-v-3f0901d5]{border-top-left-radius:0;border-top-right-radius:0}.context-menu[style*="--edge-hint: bottom"][data-v-3f0901d5]{border-bottom-left-radius:0;border-bottom-right-radius:0}.connection-line[data-v-c4c3e8c0]{position:absolute;pointer-events:none;z-index:10}.interaction-layer[data-v-cf54d360]{position:absolute;top:0;left:0;width:100%;height:100%;transform-origin:0 0;transform:scale(var(--26f2f4ea));pointer-events:all;z-index:999}.selection-box[data-v-cf54d360]{pointer-events:none;background:transparent}.resize-handles[data-v-cf54d360]{position:relative;width:100%;height:100%}.hover-container-outline[data-v-cf54d360]{position:absolute;pointer-events:none;padding:6px;top:6px}.hover-container-outline.is-valid[data-v-cf54d360]{border:2px solid #0000ff}.hover-container-outline.is-invalid[data-v-cf54d360]{border:2px solid #f1eded;background:rgba(240,237,237,.842)}.resize-handle[data-v-cf54d360]{position:absolute;width:10px;height:10px;background-color:#007bff;border:2px solid #fff;border-radius:50%;pointer-events:all;transition:all .2s ease;box-shadow:0 2px 4px #0000004d;z-index:999}.resize-handle.is-disabled[data-v-cf54d360]{cursor:default!important}.resize-handle[data-v-cf54d360]:hover{background-color:#0056b3;transform:scale(1.2)}.action-buttons[data-v-cf54d360]{display:flex;flex-direction:column;gap:4px;pointer-events:all;background:rgba(255,255,255,.95);padding:6px;border-radius:4px;box-shadow:0 2px 8px #00000026;border:1px solid #e0e0e0;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.action-btn[data-v-cf54d360]{width:28px;height:28px;border:1px solid #d0d0d0;border-radius:3px;background:linear-gradient(to bottom,#f8f9fa,#e9ecef);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;font-family:Arial,sans-serif;color:#495057;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.action-btn[data-v-cf54d360]:hover{background:linear-gradient(to bottom,#e3f2fd,#bbdefb);border-color:#90caf9;transform:translateY(-1px);box-shadow:0 2px 4px #2196f34d;color:#1976d2}.edit-btn[data-v-cf54d360]:hover{background:#e3f2fd}.delete-btn[data-v-cf54d360]:hover{background:#ffebee;border-color:#f44336}.name-editor-container[data-v-cf54d360]{pointer-events:all}.name-input[data-v-cf54d360]{width:calc(100% - 20px);padding:2px 4px;border:2px solid #007bff;border-radius:6px;font-size:12px;font-weight:600;background:#fff;box-shadow:0 4px 12px #00000026;outline:none;text-align:center}.name-input[data-v-cf54d360]:focus{border-color:#0056b3;box-shadow:0 0 0 3px #007bff40}.name-text-box-container[data-v-cf54d360]{pointer-events:all}.name-text-box[data-v-cf54d360]{border:1px dashed #007bff;background:rgba(255,255,255,.2);cursor:pointer;pointer-events:all;transition:all .2s ease;border-radius:4px;box-shadow:0 0 0 1px #007bff1a;height:100%;display:flex;align-items:center;justify-content:center}.name-text-box[data-v-cf54d360]:hover{border-color:#0056b3;background:rgba(0,123,255,.05);box-shadow:0 0 0 2px #007bff33;transform:scale(1.02)}.resize-ghost[data-v-cf54d360]{position:absolute;border:2px solid #8a6d3b;background:transparent;box-shadow:0 0 0 2px #8a6d3b26 inset;pointer-events:none;z-index:9999}.connect-layer[data-v-cf54d360]{position:absolute;pointer-events:none;z-index:1000}.connect-dot-direct[data-v-cf54d360],.connect-dot-target[data-v-cf54d360]{width:8px;height:8px;background-color:#000;border-radius:50%;border:1px solid #fff;box-shadow:0 0 4px #0000004d}.connection-line[data-v-cf54d360]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}.border-btn[data-v-cf54d360]{padding-bottom:4px;border-bottom:1px solid #e0e0e0}.diagram-shape[data-v-1f4cb409]{background:#e5ecf0;border-radius:10px;box-shadow:0 2px 8px #0000001a;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box;margin:0;padding:0;border:var(--bw) var(--bs) var(--bc)}.hit-edge[data-v-1f4cb409]{position:absolute;background:transparent;z-index:999;pointer-events:auto}.hit-top[data-v-1f4cb409]{left:0;right:0;top:0;height:var(--bw)}.hit-right[data-v-1f4cb409]{top:0;right:0;bottom:0;width:var(--bw)}.hit-bottom[data-v-1f4cb409]{left:0;right:0;bottom:0;height:var(--bw)}.hit-left[data-v-1f4cb409]{top:0;left:0;bottom:0;width:var(--bw)}.diagram-header[data-v-1f4cb409]{background:rgba(255,255,255,.5);padding:3px 16px 3px 5px;display:inline-flex;align-items:center;position:relative;white-space:nowrap;align-self:flex-start}.diagram-header[data-v-1f4cb409]:after{content:"";position:absolute;bottom:-12px;right:-12px;width:20px;height:20px;background-color:var(--5113555a);transform:rotate(45deg);z-index:0}.diagram-title[data-v-1f4cb409]{font-family:var(--name-ff);font-size:var(--name-fs);font-weight:400;line-height:normal;letter-spacing:0em;font-variation-settings:"opsz" auto;font-feature-settings:"kern" on;color:var(--name-color);position:relative;z-index:2}.diagram-shape[data-v-05edf0d1]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;pointer-events:auto;touch-action:none;-webkit-touch-action:none;-ms-touch-action:none;zoom:1;transform:none!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important}.diagram-svg[data-v-05edf0d1]{width:100%;height:100%;transform:none!important;-webkit-transform:none!important}.capability-shape[data-v-66d2551a]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-66d2551a]{display:block}.capability-shape[data-v-8e8054b6]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-8e8054b6]{display:block}.capability-shape[data-v-27d34586]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-27d34586]{display:block}.capability-shape[data-v-5f0b14f5]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-5f0b14f5]{display:block}.capability-shape[data-v-4f0bb734]{display:inline-block;position:relative;overflow:visible;box-sizing:content-box}[data-v-4f0bb734] .name-text-svg{text-align:left}[data-v-4f0bb734] .shape-name-svg{text-align:center}[data-v-4f0bb734] .content-text-svg{font-size:13px;line-height:1.4;color:#000;font-family:Arial,sans-serif;min-height:20px;overflow:visible;width:100%;box-sizing:border-box}[data-v-4f0bb734] .content-item{margin-bottom:4px;word-break:break-word;white-space:normal;overflow:visible;width:100%;box-sizing:border-box}[data-v-4f0bb734] .content-item:last-child{margin-bottom:0}.edge-component[data-v-aa953435]{position:absolute;pointer-events:all;cursor:pointer}.edge-svg[data-v-aa953435]{width:100%;height:100%;overflow:visible}.edge-svg polyline[data-v-aa953435]{pointer-events:all;stroke-linecap:round;stroke-linejoin:round}.edge-svg circle[data-v-aa953435]{pointer-events:none}.diagram-shape[data-v-daf180ad]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.diagram-svg[data-v-daf180ad]{width:100%;height:100%}.capability-shape[data-v-ec8f07ea]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-ec8f07ea]{display:block}.output-pin-shape[data-v-2081b7c7]{display:flex;align-items:center;justify-content:center;overflow:visible}.output-pin-svg[data-v-2081b7c7]{display:block;overflow:visible}.port-shape[data-v-4aa98dd6]{display:flex;align-items:center;justify-content:center;overflow:visible}.port-svg[data-v-4aa98dd6]{display:block;overflow:visible}.graph-view[data-v-436bf5ea]{width:100%;height:100%;background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none}.diagram-content[data-v-436bf5ea]{position:absolute;top:10px;left:10px;right:0;bottom:30px;overflow:auto;touch-action:none}.shapes-container[data-v-436bf5ea]{position:relative;width:100%;height:100%;min-height:600px;transform-origin:0 0;transform:scale(var(--401af0dd))}.shapes-container[data-v-436bf5ea]>*{position:absolute}.zoom-bar[data-v-436bf5ea]{position:absolute;bottom:0;right:0;left:0;width:100%;height:24px;display:flex;align-items:center;justify-content:flex-end;background:white;border-top:1px solid #e0e0e0;box-shadow:0 -2px 8px #0000000d;z-index:1000;gap:6px;padding:0 10px}.zoom-level[data-v-436bf5ea]{font-size:10px;font-weight:500;min-width:35px;text-align:center;color:#333}.zoom-slider[data-v-436bf5ea]{width:150px;height:100%;display:flex;align-items:center;justify-content:center}.zoom-slider input[type=range][data-v-436bf5ea]{width:100%;height:2px;border-radius:1px;background:#e0e0e0;outline:none;-webkit-appearance:none;margin:0}.zoom-slider input[type=range][data-v-436bf5ea]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:10px;height:10px;border-radius:50%;background:#1890ff;cursor:pointer;-webkit-transition:all .2s;transition:all .2s}.zoom-slider input[type=range][data-v-436bf5ea]::-webkit-slider-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-slider input[type=range][data-v-436bf5ea]::-moz-range-thumb{width:10px;height:10px;border-radius:50%;background:#1890ff;cursor:pointer;border:none;-moz-transition:all .2s;transition:all .2s}.zoom-slider input[type=range][data-v-436bf5ea]::-moz-range-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-button[data-v-436bf5ea]{width:18px;height:18px;display:flex;align-items:center;justify-content:center;border:1px solid #e0e0e0;border-radius:2px;background:white;cursor:pointer;font-size:10px;font-weight:600;color:#333;transition:all .2s}.zoom-button[data-v-436bf5ea]:hover{background:#f5f5f5;border-color:#1890ff;color:#1890ff}.zoom-button[data-v-436bf5ea]:active{background:#e6f7ff}
1
+ @charset "UTF-8";.context-menu[data-v-7371f77c]{background-color:#fff;border:1px solid #ebeef5;border-radius:6px;box-shadow:0 2px 12px #0000001a;padding:6px 0;overflow-y:auto;box-sizing:border-box;transition:opacity .2s ease,transform .2s ease;transform-origin:top left}.context-menu[style*="display: block"][data-v-7371f77c]{animation:fadeIn-7371f77c .2s ease forwards}@keyframes fadeIn-7371f77c{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.context-menu[data-v-7371f77c]::-webkit-scrollbar{width:6px}.context-menu[data-v-7371f77c]::-webkit-scrollbar-thumb{background-color:#ddd;border-radius:3px}.context-menu[data-v-7371f77c]::-webkit-scrollbar-track{background-color:#f5f5f5}.menu-item[data-v-7371f77c]{padding:0 15px;cursor:pointer;font-size:14px;color:#606266;border-radius:4px;height:36px;line-height:36px;box-sizing:border-box}.menu-item[data-v-7371f77c]:hover{background-color:#f5f7fa;color:#303133}.menu-disabled[data-v-7371f77c]{color:#c0c4cc!important;cursor:not-allowed!important;pointer-events:none}.menu-disabled[data-v-7371f77c]:hover{background-color:transparent!important}.menu-disabled img[data-v-7371f77c]{opacity:.5}.context-menu[style*="--edge-hint: left"][data-v-7371f77c]{border-top-left-radius:0}.context-menu[style*="--edge-hint: right"][data-v-7371f77c]{border-top-right-radius:0}.context-menu[style*="--edge-hint: top"][data-v-7371f77c]{border-top-left-radius:0;border-top-right-radius:0}.context-menu[style*="--edge-hint: bottom"][data-v-7371f77c]{border-bottom-left-radius:0;border-bottom-right-radius:0}.display-tooltip[data-v-7371f77c]{background-color:#fff;border:1px solid #ebeef5;border-radius:6px;box-shadow:0 2px 12px #0000001a;padding:6px 0;min-width:120px;animation:tooltipFadeIn-7371f77c .2s ease forwards}.tooltip-content[data-v-7371f77c]{overflow:hidden}.tooltip-item[data-v-7371f77c]{padding:8px 16px;cursor:pointer;font-size:14px;color:#606266;border-radius:4px;transition:background-color .2s ease;display:flex;align-items:center}.tooltip-item[data-v-7371f77c]:hover{background-color:#f5f7fa;color:#303133}.tooltip-item span[data-v-7371f77c]{display:block}@keyframes tooltipFadeIn-7371f77c{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.connection-line[data-v-c4c3e8c0]{position:absolute;pointer-events:none;z-index:10}.interaction-layer[data-v-cdfa3994]{position:absolute;top:0;left:0;width:100%;height:100%;transform-origin:0 0;transform:scale(var(--913dd20e));pointer-events:all;z-index:999}.selection-box[data-v-cdfa3994]{pointer-events:none;background:transparent}.resize-handles[data-v-cdfa3994]{position:relative;width:100%;height:100%}.hover-container-outline[data-v-cdfa3994]{position:absolute;pointer-events:none;padding:6px;top:6px}.hover-container-outline.is-valid[data-v-cdfa3994]{border:2px solid #0000ff}.hover-container-outline.is-invalid[data-v-cdfa3994]{border:2px solid #f1eded;background:rgba(240,237,237,.842)}.resize-handle[data-v-cdfa3994]{position:absolute;width:10px;height:10px;background-color:#007bff;border:2px solid #fff;border-radius:50%;pointer-events:all;transition:all .2s ease;box-shadow:0 2px 4px #0000004d;z-index:999}.resize-handle.is-disabled[data-v-cdfa3994]{cursor:default!important}.resize-handle[data-v-cdfa3994]:hover{background-color:#0056b3;transform:scale(1.2)}.action-buttons[data-v-cdfa3994]{display:flex;flex-direction:column;gap:4px;pointer-events:all;background:rgba(255,255,255,.95);padding:6px;border-radius:4px;box-shadow:0 2px 8px #00000026;border:1px solid #e0e0e0;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.action-btn[data-v-cdfa3994]{width:28px;height:28px;border:1px solid #d0d0d0;border-radius:3px;background:linear-gradient(to bottom,#f8f9fa,#e9ecef);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;font-family:Arial,sans-serif;color:#495057;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.action-btn[data-v-cdfa3994]:hover{background:linear-gradient(to bottom,#e3f2fd,#bbdefb);border-color:#90caf9;transform:translateY(-1px);box-shadow:0 2px 4px #2196f34d;color:#1976d2}.edit-btn[data-v-cdfa3994]:hover{background:#e3f2fd}.delete-btn[data-v-cdfa3994]:hover{background:#ffebee;border-color:#f44336}.name-editor-container[data-v-cdfa3994]{pointer-events:all}.name-input[data-v-cdfa3994]{width:calc(100% - 20px);padding:2px 4px;border:2px solid #007bff;border-radius:6px;font-size:12px;font-weight:600;background:#fff;box-shadow:0 4px 12px #00000026;outline:none;text-align:center}.name-input[data-v-cdfa3994]:focus{border-color:#0056b3;box-shadow:0 0 0 3px #007bff40}.name-text-box-container[data-v-cdfa3994]{pointer-events:all}.name-text-box[data-v-cdfa3994]{border:1px dashed #007bff;background:rgba(255,255,255,.2);cursor:pointer;pointer-events:all;transition:all .2s ease;border-radius:4px;box-shadow:0 0 0 1px #007bff1a;height:100%;display:flex;align-items:center;justify-content:center}.name-text-box[data-v-cdfa3994]:hover{border-color:#0056b3;background:rgba(0,123,255,.05);box-shadow:0 0 0 2px #007bff33;transform:scale(1.02)}.resize-ghost[data-v-cdfa3994]{position:absolute;border:2px solid #8a6d3b;background:transparent;box-shadow:0 0 0 2px #8a6d3b26 inset;pointer-events:none;z-index:9999}.connect-layer[data-v-cdfa3994]{position:absolute;pointer-events:none;z-index:1000}.connect-dot-direct[data-v-cdfa3994],.connect-dot-target[data-v-cdfa3994]{width:8px;height:8px;background-color:#000;border-radius:50%;border:1px solid #fff;box-shadow:0 0 4px #0000004d}.connection-line[data-v-cdfa3994]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}.border-btn[data-v-cdfa3994]{padding-bottom:4px;border-bottom:1px solid #e0e0e0}.diagram-shape[data-v-1f4cb409]{background:#e5ecf0;border-radius:10px;box-shadow:0 2px 8px #0000001a;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box;margin:0;padding:0;border:var(--bw) var(--bs) var(--bc)}.hit-edge[data-v-1f4cb409]{position:absolute;background:transparent;z-index:999;pointer-events:auto}.hit-top[data-v-1f4cb409]{left:0;right:0;top:0;height:var(--bw)}.hit-right[data-v-1f4cb409]{top:0;right:0;bottom:0;width:var(--bw)}.hit-bottom[data-v-1f4cb409]{left:0;right:0;bottom:0;height:var(--bw)}.hit-left[data-v-1f4cb409]{top:0;left:0;bottom:0;width:var(--bw)}.diagram-header[data-v-1f4cb409]{background:rgba(255,255,255,.5);padding:3px 16px 3px 5px;display:inline-flex;align-items:center;position:relative;white-space:nowrap;align-self:flex-start}.diagram-header[data-v-1f4cb409]:after{content:"";position:absolute;bottom:-12px;right:-12px;width:20px;height:20px;background-color:var(--5113555a);transform:rotate(45deg);z-index:0}.diagram-title[data-v-1f4cb409]{font-family:var(--name-ff);font-size:var(--name-fs);font-weight:400;line-height:normal;letter-spacing:0em;font-variation-settings:"opsz" auto;font-feature-settings:"kern" on;color:var(--name-color);position:relative;z-index:2}.diagram-shape[data-v-05edf0d1]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;pointer-events:auto;touch-action:none;-webkit-touch-action:none;-ms-touch-action:none;zoom:1;transform:none!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important}.diagram-svg[data-v-05edf0d1]{width:100%;height:100%;transform:none!important;-webkit-transform:none!important}.capability-shape[data-v-b7f57d56]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-b7f57d56]{display:block}.capability-shape[data-v-8e8054b6]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-8e8054b6]{display:block}.capability-shape[data-v-27d34586]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-27d34586]{display:block}.capability-shape[data-v-5f0b14f5]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-5f0b14f5]{display:block}.capability-shape[data-v-4f0bb734]{display:inline-block;position:relative;overflow:visible;box-sizing:content-box}[data-v-4f0bb734] .name-text-svg{text-align:left}[data-v-4f0bb734] .shape-name-svg{text-align:center}[data-v-4f0bb734] .content-text-svg{font-size:13px;line-height:1.4;color:#000;font-family:Arial,sans-serif;min-height:20px;overflow:visible;width:100%;box-sizing:border-box}[data-v-4f0bb734] .content-item{margin-bottom:4px;word-break:break-word;white-space:normal;overflow:visible;width:100%;box-sizing:border-box}[data-v-4f0bb734] .content-item:last-child{margin-bottom:0}.edge-component[data-v-8ed11c37]{position:absolute;pointer-events:all;cursor:pointer}.edge-svg[data-v-8ed11c37]{width:100%;height:100%;overflow:visible}.edge-svg polyline[data-v-8ed11c37]{pointer-events:all;stroke-linecap:round;stroke-linejoin:round}.edge-svg circle[data-v-8ed11c37]{pointer-events:none}.diagram-shape[data-v-daf180ad]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.diagram-svg[data-v-daf180ad]{width:100%;height:100%}.capability-shape[data-v-ec8f07ea]{display:flex;align-items:center;justify-content:center;overflow:hidden}.capability-svg[data-v-ec8f07ea]{display:block}.output-pin-shape[data-v-2081b7c7]{display:flex;align-items:center;justify-content:center;overflow:visible}.output-pin-svg[data-v-2081b7c7]{display:block;overflow:visible}.port-shape[data-v-4aa98dd6]{display:flex;align-items:center;justify-content:center;overflow:visible}.port-svg[data-v-4aa98dd6]{display:block;overflow:visible}.diagram-list-tooltip[data-v-1ad3bdf8]{position:fixed;background:#ffffff;border:1px solid #e5e7eb;border-radius:6px;padding:10px 6px;box-shadow:0 4px 12px #00000026;z-index:9999;width:180px;max-width:300px}.tooltip-title[data-v-1ad3bdf8]{padding:0 12px}.diagram-item[data-v-1ad3bdf8]{display:flex;align-items:center;padding:0 12px;cursor:pointer;border-radius:4px;height:36px;line-height:36px;transition:background-color .2s}.diagram-item .diagram-name[data-v-1ad3bdf8]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.diagram-item[data-v-1ad3bdf8]:hover{background-color:#f0f3f6}.diagram-icon[data-v-1ad3bdf8]{width:24px;height:24px;margin-right:6px}.zoom-bar[data-v-80612714]{position:absolute;bottom:0;left:0;width:100%;height:24px;display:flex;align-items:center;justify-content:flex-end;background:white;border-top:1px solid #e0e0e0;box-shadow:0 -2px 8px #0000000d;z-index:100;gap:6px;padding:0 10px}.zoom-level[data-v-80612714]{font-size:10px;font-weight:500;min-width:35px;text-align:center;color:#333}.zoom-button[data-v-80612714]{width:18px;height:18px;display:flex;align-items:center;justify-content:center;border:1px solid #e0e0e0;border-radius:2px;background:white;cursor:pointer;font-size:10px;font-weight:600;color:#333;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.zoom-button[data-v-80612714]:hover{background:#f5f5f5;border-color:#2a7fd9;color:#2a7fd9}.zoom-button[data-v-80612714]:active{transform:scale(.95)}.zoom-slider[data-v-80612714]{width:150px;height:100%;display:flex;align-items:center;justify-content:center;position:relative}.slider-wrapper[data-v-80612714]{width:100%;height:2px;background:#e0e0e0;border-radius:1px;position:relative}.slider-wrapper[data-v-80612714]:before{content:"";position:absolute;top:50%;left:0;width:var(--progress, 0%);height:2px;background:#2a7fd9;border-radius:1px;z-index:1;pointer-events:none;transform:translateY(-50%)}.slider-wrapper input[type=range][data-v-80612714]{width:100%;height:12px;background:transparent;outline:none;-webkit-appearance:none;margin:0;position:relative;z-index:2;cursor:pointer}.slider-wrapper input[type=range][data-v-80612714]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:white;border:2px solid #2a7fd9;cursor:pointer;-webkit-transition:all .2s;transition:all .2s;transform:translateY(-6px);box-shadow:0 1px 3px #0000001a}.slider-wrapper input[type=range][data-v-80612714]::-webkit-slider-thumb:hover{background:white;border-color:#2a7fd9;transform:translateY(-6px) scale(1.1)}.slider-wrapper input[type=range][data-v-80612714]::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:white;border:2px solid #2a7fd9;cursor:pointer;-moz-transition:all .2s;transition:all .2s;transform:translateY(-6px)}.slider-wrapper input[type=range][data-v-80612714]::-moz-range-thumb:hover{background:white;border-color:#2a7fd9;transform:translateY(-6px) scale(1.1)}.slider-wrapper input[type=range][data-v-80612714]::-moz-range-track{background:transparent;height:2px;border:none}.slider-wrapper input[type=range][data-v-80612714]:focus{outline:none}.graph-view[data-v-1fa719fa]{width:100%;height:100%;background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none}.diagram-content[data-v-1fa719fa]{position:absolute;top:10px;left:10px;right:0;bottom:30px;overflow:auto;touch-action:none}.shapes-container[data-v-1fa719fa]{position:relative;width:100%;height:100%;min-height:600px;transform-origin:0 0;transform:scale(var(--df8fc896))}.shapes-container[data-v-1fa719fa]>*{position:absolute}.zoom-level[data-v-1fa719fa]{position:absolute;bottom:30px;right:15px;font-size:10px;font-weight:500;min-width:35px;text-align:center;color:#333;background:rgba(255,255,255,.9);padding:2px 6px;border-radius:3px;box-shadow:0 1px 3px #0000001a}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-sose-front/mx-sose-graph",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "A Vue3 graph visualization plugin library",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -1,93 +1,73 @@
1
1
  <template>
2
2
  <teleport to="body">
3
- <div
4
- v-if="visible"
5
- class="context-menu px-[6px]!"
6
- :style="dynamicMenuStyle"
7
- @contextmenu.prevent
8
- @click.stop
9
- ref="menuRef"
10
- >
3
+ <div v-if="visible" class="context-menu px-[6px]!" :style="dynamicMenuStyle" @contextmenu.prevent @click.stop
4
+ ref="menuRef">
11
5
  <!-- 属性配置菜单项 -->
12
6
  <div class="menu-item" @click="handleShowPropertyPanel">
13
- <div
14
- class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]"
15
- >
16
- <img
17
- :src="getIcon('createMenu', 'config')"
18
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
19
- alt="属性配置"
20
- />
7
+ <div class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]">
8
+ <img :src="getIcon('createMenu', 'config')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="属性配置" />
21
9
  <span>属性配置</span>
22
10
  </div>
23
11
  </div>
24
12
 
25
13
  <div class="menu-item" @click="handleHighlight">
26
14
  <div class="flex items-center">
27
- <img
28
- :src="getIcon('createMenu', 'delete')"
29
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
30
- alt="树上高亮"
31
- />
15
+ <img :src="getIcon('createMenu', 'delete')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="树上高亮" />
32
16
  <span>树上高亮</span>
33
17
  </div>
34
18
  </div>
35
19
 
36
- <div class="menu-item" @click="handleLocateChart" :class="{ 'menu-disabled': true }">
37
- <div
38
- class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]"
39
- >
40
- <img
41
- :src="getIcon('createMenu', 'locateChart')"
42
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
43
- alt="所在图表"
44
- />
45
- <span>所在图表</span>
20
+ <div ref="chartMenuItemRef" class="menu-item" @click="handleLocateChart" :class="{ 'menu-disabled': false }">
21
+ <div class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]">
22
+ <img :src="getIcon('createMenu', 'locateChart')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="所在图表" />
23
+ <div class="flex-[1] flex justify-between items-center">
24
+ <span>所在图表</span>
25
+ </div>
46
26
  </div>
47
27
  </div>
48
28
 
49
29
  <div class="menu-item" :class="{ 'menu-disabled': true }">
50
- <div
51
- class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]"
52
- >
53
- <img
54
- :src="getIcon('createMenu', 'diagram')"
55
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
56
- alt="新建图表"
57
- />
30
+ <div class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]">
31
+ <img :src="getIcon('createMenu', 'diagram')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="新建图表" />
58
32
  <span>新建图表</span>
59
33
  </div>
60
34
  </div>
61
35
 
36
+ <div
37
+ class="menu-item"
38
+ :class="{ 'menu-disabled': false }"
39
+ @mouseenter="handleDisplayMouseEnter"
40
+ @mouseleave="handleDisplayMouseLeave"
41
+ ref="displayMenuItemRef"
42
+ >
43
+ <div class="flex items-center box-border border-b-[1px] border-solid border-[#DCDFE6]">
44
+ <img :src="getIcon('createMenu', 'diagram')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="展示" />
45
+ <div class="flex-1 flex justify-between items-center">
46
+ <span>展示</span>
47
+ <el-icon :size="12">
48
+ <ArrowRight />
49
+ </el-icon>
50
+ </div>
51
+ </div>
52
+ </div>
53
+
62
54
  <div class="menu-item" @click="handleCopy" :class="{ 'menu-disabled': true }">
63
55
  <div class="flex items-center">
64
- <img
65
- :src="getIcon('createMenu', 'copy')"
66
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
67
- alt="复制"
68
- />
56
+ <img :src="getIcon('createMenu', 'copy')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="复制" />
69
57
  <span>复制</span>
70
58
  </div>
71
59
  </div>
72
60
 
73
61
  <div class="menu-item" @click="handlePaste" :class="{ 'menu-disabled': true }">
74
62
  <div class="flex items-center">
75
- <img
76
- :src="getIcon('createMenu', 'paste')"
77
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
78
- alt="粘贴"
79
- />
63
+ <img :src="getIcon('createMenu', 'paste')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="粘贴" />
80
64
  <span>粘贴</span>
81
65
  </div>
82
66
  </div>
83
67
 
84
68
  <div class="menu-item" @click="handleCut" :class="{ 'menu-disabled': true }">
85
69
  <div class="flex items-center">
86
- <img
87
- :src="getIcon('createMenu', 'scissors')"
88
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
89
- alt="剪切"
90
- />
70
+ <img :src="getIcon('createMenu', 'scissors')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="剪切" />
91
71
  <span>剪切</span>
92
72
  </div>
93
73
  </div>
@@ -95,17 +75,35 @@
95
75
  <!-- 删除菜单项 -->
96
76
  <div class="menu-item" @click="handleDelete">
97
77
  <div class="flex items-center">
98
- <img
99
- :src="getIcon('createMenu', 'delete')"
100
- class="w-[18px] h-[18px] mr-[10px] ml-[2px]"
101
- alt="删除"
102
- />
78
+ <img :src="getIcon('createMenu', 'delete')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="删除" />
103
79
  <span>删除</span>
104
80
  </div>
105
81
  </div>
106
82
  </div>
107
83
  </teleport>
108
84
 
85
+ <!-- 展示子菜单弹框 -->
86
+ <teleport to="body">
87
+ <div
88
+ v-if="displayTooltipVisible"
89
+ class="display-tooltip"
90
+ :style="displayTooltipStyle"
91
+ @mouseenter="handleTooltipMouseEnter"
92
+ @mouseleave="handleTooltipMouseLeave"
93
+ >
94
+ <div class="tooltip-content">
95
+ <div class="tooltip-item" @click="handleDisplayPortAttr">
96
+ <img :src="getIcon('createMenu', 'diagram')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="展示" />
97
+ <span>展示端口/属性</span>
98
+ </div>
99
+ <div class="tooltip-item" @click="handleDisplayLink">
100
+ <img :src="getIcon('createMenu', 'diagram')" class="w-[18px] h-[18px] mr-[10px] ml-[2px]" alt="展示" />
101
+ <span>展示连线</span>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ </teleport>
106
+
109
107
  <!-- 新建图表菜单 -->
110
108
  <!-- <Diagram
111
109
  :menu-visible="showAddChartDialog"
@@ -118,17 +116,15 @@
118
116
 
119
117
  <script setup lang="ts">
120
118
  import {
121
- computed,
122
119
  onMounted,
123
120
  onUnmounted,
124
121
  ref,
125
122
  watch,
126
123
  type CSSProperties,
127
124
  } from "vue";
128
- import { getIcon } from "../utils/iconLoader";
129
- import { eventBus } from "../store";
130
- // import Diagram from "@/components/common/diagram/diagram.vue";
131
- // import { getModelDataApi } from "@/services/modelTree";
125
+ import { getIcon } from "../../utils/iconLoader";
126
+ import { eventBus } from "../../store";
127
+ import { ArrowRight } from "@element-plus/icons-vue";
132
128
 
133
129
  // 定义组件props
134
130
  const props = defineProps({
@@ -161,14 +157,19 @@ const emit = defineEmits([
161
157
  "copy",
162
158
  "paste",
163
159
  "cut",
160
+ "apply-links",
164
161
  ]);
165
162
 
166
- // 新建图表弹窗状态
167
- const showAddChartDialog = ref(false);
168
- // 图表数据
169
- const chartData = ref([]);
163
+ // GraphLink组件显示状态
164
+ const graphLinkVisible = ref(false);
165
+
166
+ // 悬浮弹窗相关
167
+ const tooltipVisible = ref(false)
168
+ const displayTooltipVisible = ref(false)
169
+ const displayTooltipStyle = ref<CSSProperties>({})
170
170
 
171
171
  const menuRef = ref<HTMLElement | null>(null);
172
+ const displayMenuItemRef = ref<HTMLElement | null>(null);
172
173
 
173
174
  // 菜单尺寸常量
174
175
  const MENU_WIDTH = 180; // 与CSS中的min-width一致
@@ -287,9 +288,14 @@ const handleHighlight = () => {
287
288
 
288
289
  // 处理所在图表菜单项点击
289
290
  const handleLocateChart = () => {
290
- logSelectedShape();
291
- emit("locate-chart", props.selectedShape);
291
+ // 关闭右键菜单
292
292
  closeMenu();
293
+
294
+ // 发送事件给父组件
295
+ eventBus.emit("locate-chart", props.selectedShape);
296
+
297
+ //发送位置信息给所在图表
298
+ eventBus.emit("locate-chart-position", props.position);
293
299
  };
294
300
 
295
301
  // 处理新建图表菜单项点击
@@ -344,6 +350,107 @@ const handleSelectChart = (payload: { value: any; isChart: boolean }) => {
344
350
  });
345
351
  };
346
352
 
353
+ // 用于存储延迟关闭的定时器
354
+ let tooltipCloseTimer: NodeJS.Timeout | null = null
355
+ let displayTooltipCloseTimer: NodeJS.Timeout | null = null
356
+
357
+ // 更新展示弹框位置
358
+ const updateDisplayTooltipPosition = () => {
359
+ if (!displayMenuItemRef.value) return;
360
+
361
+ const menuItemRect = displayMenuItemRef.value.getBoundingClientRect();
362
+ const tooltipWidth = 120; // 弹框宽度
363
+
364
+ // 计算弹框位置 - 在右边显示
365
+ let left = menuItemRect.right + 8; // 菜单项右边 + 8px 间距
366
+ let top = menuItemRect.top;
367
+
368
+ // 检查是否超出右边界
369
+ const viewportWidth = window.innerWidth;
370
+ if (left + tooltipWidth > viewportWidth) {
371
+ left = menuItemRect.left - tooltipWidth - 8; // 在左边显示
372
+ }
373
+
374
+ // 确保不超出顶部和底部边界
375
+ const viewportHeight = window.innerHeight;
376
+ if (top + 120 > viewportHeight) { // 假设弹框高度为120px
377
+ top = viewportHeight - 120 - 10;
378
+ }
379
+ top = Math.max(10, top);
380
+
381
+ displayTooltipStyle.value = {
382
+ left: `${left}px`,
383
+ top: `${top}px`,
384
+ position: "fixed",
385
+ "z-index": "10000",
386
+ };
387
+ };
388
+
389
+ // 处理展示菜单项鼠标进入
390
+ const handleDisplayMouseEnter = () => {
391
+ if (displayTooltipCloseTimer) {
392
+ clearTimeout(displayTooltipCloseTimer);
393
+ displayTooltipCloseTimer = null;
394
+ }
395
+
396
+ displayTooltipVisible.value = true;
397
+ updateDisplayTooltipPosition();
398
+ };
399
+
400
+ // 处理展示菜单项鼠标离开
401
+ const handleDisplayMouseLeave = () => {
402
+ displayTooltipCloseTimer = setTimeout(() => {
403
+ displayTooltipVisible.value = false;
404
+ }, 200); // 200ms延迟,容错时间
405
+ };
406
+
407
+ // 处理弹框鼠标进入
408
+ const handleTooltipMouseEnter = () => {
409
+ if (displayTooltipCloseTimer) {
410
+ clearTimeout(displayTooltipCloseTimer);
411
+ displayTooltipCloseTimer = null;
412
+ }
413
+ };
414
+
415
+ // 处理弹框鼠标离开
416
+ const handleTooltipMouseLeave = () => {
417
+ displayTooltipVisible.value = false;
418
+ };
419
+
420
+ // 处理展示子菜单项点击
421
+ const handleDisplayView = () => {
422
+ logSelectedShape();
423
+ eventBus.emit("display-view", props.selectedShape);
424
+ displayTooltipVisible.value = false;
425
+ closeMenu();
426
+ };
427
+
428
+ const handleDisplayLink = () => {
429
+ logSelectedShape();
430
+ eventBus.emit("display-link", props.selectedShape);
431
+ displayTooltipVisible.value = false;
432
+ closeMenu();
433
+ };
434
+
435
+ const handleDisplayPortAttr = () => {
436
+ logSelectedShape();
437
+ eventBus.emit("display-port-attr", props.selectedShape);
438
+ displayTooltipVisible.value = false;
439
+ closeMenu();
440
+ };
441
+
442
+ // 处理点击外部关闭弹窗(包括右键点击)
443
+ const handleTooltipClickOutside = (event: MouseEvent) => {
444
+ // 检查点击目标是否在弹窗内
445
+ const tooltipElement = document.querySelector('.diagram-list-tooltip');
446
+ if (tooltipElement && !tooltipElement.contains(event.target as Node)) {
447
+ tooltipVisible.value = false;
448
+ // 移除所有相关事件监听器
449
+ document.removeEventListener('click', handleTooltipClickOutside, true);
450
+ document.removeEventListener('contextmenu', handleTooltipClickOutside, true);
451
+ }
452
+ };
453
+
347
454
  // 处理复制菜单项点击
348
455
  const handleCopy = () => {
349
456
  logSelectedShape();
@@ -370,6 +477,9 @@ const handleWindowResize = () => {
370
477
  if (props.visible) {
371
478
  updateMenuPosition();
372
479
  }
480
+ if (displayTooltipVisible.value) {
481
+ updateDisplayTooltipPosition();
482
+ }
373
483
  };
374
484
 
375
485
  // 组件挂载时添加事件监听
@@ -383,6 +493,17 @@ onMounted(() => {
383
493
  onUnmounted(() => {
384
494
  document.removeEventListener("click", handleClickOutside);
385
495
  window.removeEventListener("resize", handleWindowResize);
496
+ // 移除所在图表弹窗的点击事件监听器
497
+ document.removeEventListener('click', handleTooltipClickOutside, true);
498
+ document.removeEventListener('contextmenu', handleTooltipClickOutside, true);
499
+
500
+ // 清理定时器
501
+ if (tooltipCloseTimer) {
502
+ clearTimeout(tooltipCloseTimer);
503
+ }
504
+ if (displayTooltipCloseTimer) {
505
+ clearTimeout(displayTooltipCloseTimer);
506
+ }
386
507
  });
387
508
  </script>
388
509
 
@@ -408,6 +529,7 @@ onUnmounted(() => {
408
529
  opacity: 0;
409
530
  transform: scale(0.95);
410
531
  }
532
+
411
533
  to {
412
534
  opacity: 1;
413
535
  transform: scale(1);
@@ -418,10 +540,12 @@ onUnmounted(() => {
418
540
  .context-menu::-webkit-scrollbar {
419
541
  width: 6px;
420
542
  }
543
+
421
544
  .context-menu::-webkit-scrollbar-thumb {
422
545
  background-color: #ddd;
423
546
  border-radius: 3px;
424
547
  }
548
+
425
549
  .context-menu::-webkit-scrollbar-track {
426
550
  background-color: #f5f5f5;
427
551
  }
@@ -461,15 +585,64 @@ onUnmounted(() => {
461
585
  .context-menu[style*="--edge-hint: left"] {
462
586
  border-top-left-radius: 0;
463
587
  }
588
+
464
589
  .context-menu[style*="--edge-hint: right"] {
465
590
  border-top-right-radius: 0;
466
591
  }
592
+
467
593
  .context-menu[style*="--edge-hint: top"] {
468
594
  border-top-left-radius: 0;
469
595
  border-top-right-radius: 0;
470
596
  }
597
+
471
598
  .context-menu[style*="--edge-hint: bottom"] {
472
599
  border-bottom-left-radius: 0;
473
600
  border-bottom-right-radius: 0;
474
601
  }
602
+
603
+ /* 展示子菜单弹框样式 */
604
+ .display-tooltip {
605
+ background-color: #fff;
606
+ border: 1px solid #ebeef5;
607
+ border-radius: 6px;
608
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
609
+ padding: 6px 0;
610
+ min-width: 120px;
611
+ animation: tooltipFadeIn 0.2s ease forwards;
612
+ }
613
+
614
+ .tooltip-content {
615
+ overflow: hidden;
616
+ }
617
+
618
+ .tooltip-item {
619
+ padding: 8px 16px;
620
+ cursor: pointer;
621
+ font-size: 14px;
622
+ color: #606266;
623
+ border-radius: 4px;
624
+ transition: background-color 0.2s ease;
625
+ display: flex;
626
+ align-items: center;
627
+
628
+ &:hover {
629
+ background-color: #f5f7fa;
630
+ color: #303133;
631
+ }
632
+
633
+ span {
634
+ display: block;
635
+ }
636
+ }
637
+
638
+ @keyframes tooltipFadeIn {
639
+ from {
640
+ opacity: 0;
641
+ transform: scale(0.95);
642
+ }
643
+ to {
644
+ opacity: 1;
645
+ transform: scale(1);
646
+ }
647
+ }
475
648
  </style>
@@ -0,0 +1,138 @@
1
+ <template>
2
+ <div
3
+ v-if="visible"
4
+ ref="tooltipRef"
5
+ class="diagram-list-tooltip"
6
+ :style="{ left: x + 'px', top: y + 'px' }"
7
+ @click.stop
8
+ >
9
+ <div class="tooltip-title text-[#909399] text-[14px] h-[22px]">所在图表</div>
10
+ <div class="tooltip-content">
11
+ <div v-for="diagram in (diagramLocationData || [])" :key="diagram.treeId" class="diagram-item" @click="onLocationChartClick(diagram)">
12
+ <div class="diagram-icon">
13
+ <img src="@/statics/icons/childIcons/安全概念图@3x.png" alt="图标" />
14
+ </div>
15
+ <div :title="diagram.modelName" class="diagram-name text-[14px] text-[#606266]">{{ diagram.modelName }}</div>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import { defineProps, defineEmits, ref, onMounted, onUnmounted, watch } from 'vue'
23
+ import { eventBus } from "../../store";
24
+
25
+ // 定义图表数据类型
26
+ interface Diagram {
27
+ modelCode: string
28
+ treeId: string
29
+ modelName: string
30
+ }
31
+
32
+ // Props
33
+ const props = defineProps<{
34
+ visible: boolean
35
+ x: number
36
+ y: number
37
+ currentDiagramId: string
38
+ diagramLocationData?: Diagram[] | null
39
+ }>()
40
+
41
+ // Emits
42
+ const emit = defineEmits<{
43
+ locationChartClick: [diagram: Diagram],
44
+ close: []
45
+ }>()
46
+
47
+ // 引用弹窗元素
48
+ const tooltipRef = ref<HTMLElement>()
49
+
50
+ // 处理点击外部区域关闭弹窗
51
+ const handleClickOutside = (event: MouseEvent) => {
52
+ if (tooltipRef.value && !tooltipRef.value.contains(event.target as Node)) {
53
+ emit('close')
54
+ }
55
+ }
56
+
57
+ // 处理右键菜单事件关闭弹窗
58
+ const handleContextMenu = (event: MouseEvent) => {
59
+ event.preventDefault()
60
+ emit('close')
61
+ }
62
+
63
+ // 图表点击事件处理
64
+ const onLocationChartClick = (diagram: Diagram) => {
65
+ eventBus.emit('locationChartClick', diagram)
66
+ emit('close')
67
+ }
68
+
69
+ // 监听可见性变化,动态添加/移除事件监听器
70
+ watch(() => props.visible, (newVisible) => {
71
+ if (newVisible) {
72
+ document.addEventListener('click', handleClickOutside)
73
+ document.addEventListener('contextmenu', handleContextMenu)
74
+ } else {
75
+ document.removeEventListener('click', handleClickOutside)
76
+ document.removeEventListener('contextmenu', handleContextMenu)
77
+ }
78
+ })
79
+
80
+ // 组件挂载时添加事件监听器
81
+ onMounted(() => {
82
+ if (props.visible) {
83
+ document.addEventListener('click', handleClickOutside)
84
+ document.addEventListener('contextmenu', handleContextMenu)
85
+ }
86
+ })
87
+
88
+ // 组件卸载时移除事件监听器
89
+ onUnmounted(() => {
90
+ document.removeEventListener('click', handleClickOutside)
91
+ document.removeEventListener('contextmenu', handleContextMenu)
92
+ })
93
+ </script>
94
+
95
+ <style scoped>
96
+ .diagram-list-tooltip {
97
+ position: fixed;
98
+ background: #ffffff;
99
+ border: 1px solid #e5e7eb;
100
+ border-radius: 6px;
101
+ padding: 10px 6px;
102
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
103
+ z-index: 9999;
104
+ width: 180px;
105
+ max-width: 300px;
106
+ }
107
+ .tooltip-title{
108
+ padding: 0 12px;
109
+ }
110
+ .tooltip-content {}
111
+
112
+ .diagram-item {
113
+ display: flex;
114
+ align-items: center;
115
+ padding: 0 12px;
116
+ cursor: pointer;
117
+ border-radius: 4px;
118
+ height: 36px;
119
+ line-height: 36px;
120
+ transition: background-color 0.2s;
121
+ .diagram-name {
122
+ overflow: hidden;
123
+ text-overflow: ellipsis;
124
+ white-space: nowrap;
125
+ flex: 1;
126
+ }
127
+ }
128
+
129
+ .diagram-item:hover {
130
+ background-color: #F0F3F6;
131
+ }
132
+
133
+ .diagram-icon {
134
+ width: 24px;
135
+ height: 24px;
136
+ margin-right: 6px;
137
+ }
138
+ </style>