@mx-sose-front/mx-sose-graph 1.0.9 → 1.1.1

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-914902a3]{position:absolute;top:0;left:0;width:100%;height:100%;transform-origin:0 0;transform:scale(var(--672c44c5));pointer-events:all;z-index:999}.selection-box[data-v-914902a3]{pointer-events:none;background:transparent}.resize-handles[data-v-914902a3]{position:relative;width:100%;height:100%}.hover-container-outline[data-v-914902a3]{position:absolute;pointer-events:none;padding:6px;top:6px}.hover-container-outline.is-valid[data-v-914902a3]{border:2px solid #0000ff}.hover-container-outline.is-invalid[data-v-914902a3]{border:2px solid #f1eded;background:rgba(240,237,237,.842)}.resize-handle[data-v-914902a3]{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-914902a3]{cursor:default!important}.resize-handle[data-v-914902a3]:hover{background-color:#0056b3;transform:scale(1.2)}.action-buttons[data-v-914902a3]{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-914902a3]{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-914902a3]: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-914902a3]:hover{background:#e3f2fd}.delete-btn[data-v-914902a3]:hover{background:#ffebee;border-color:#f44336}.name-editor-container[data-v-914902a3]{pointer-events:all}.name-input[data-v-914902a3]{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-914902a3]:focus{border-color:#0056b3;box-shadow:0 0 0 3px #007bff40}.name-text-box-container[data-v-914902a3]{pointer-events:all}.name-text-box[data-v-914902a3]{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-914902a3]: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-914902a3]{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-914902a3]{position:absolute;pointer-events:none;z-index:1000}.connect-dot-direct[data-v-914902a3],.connect-dot-target[data-v-914902a3]{width:8px;height:8px;background-color:#000;border-radius:50%;border:1px solid #fff;box-shadow:0 0 4px #0000004d}.connection-line[data-v-914902a3]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}.border-btn[data-v-914902a3]{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-38aa7b74]{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-38aa7b74]{position:absolute;top:10px;left:10px;right:0;bottom:30px;overflow:auto;touch-action:none}.shapes-container[data-v-38aa7b74]{position:relative;width:100%;height:100%;min-height:600px}.shapes-container[data-v-38aa7b74]>*{position:absolute}.zoom-bar[data-v-38aa7b74]{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-38aa7b74]{font-size:10px;font-weight:500;min-width:35px;text-align:center;color:#333}.zoom-slider[data-v-38aa7b74]{width:150px;height:100%;display:flex;align-items:center;justify-content:center}.zoom-slider input[type=range][data-v-38aa7b74]{width:100%;height:2px;border-radius:1px;background:#e0e0e0;outline:none;-webkit-appearance:none;margin:0}.zoom-slider input[type=range][data-v-38aa7b74]::-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-38aa7b74]::-webkit-slider-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-slider input[type=range][data-v-38aa7b74]::-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-38aa7b74]::-moz-range-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-button[data-v-38aa7b74]{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-38aa7b74]:hover{background:#f5f5f5;border-color:#1890ff;color:#1890ff}.zoom-button[data-v-38aa7b74]:active{background:#e6f7ff}
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-6c90b4da]{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-6c90b4da]{position:absolute;top:10px;left:10px;right:0;bottom:30px;overflow:auto;touch-action:none}.shapes-container[data-v-6c90b4da]{position:relative;width:100%;height:100%;min-height:600px;transform-origin:0 0;transform:scale(var(--69d8909a))}.shapes-container[data-v-6c90b4da]>*{position:absolute}.zoom-bar[data-v-6c90b4da]{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-6c90b4da]{font-size:10px;font-weight:500;min-width:35px;text-align:center;color:#333}.zoom-slider[data-v-6c90b4da]{width:150px;height:100%;display:flex;align-items:center;justify-content:center}.zoom-slider input[type=range][data-v-6c90b4da]{width:100%;height:2px;border-radius:1px;background:#e0e0e0;outline:none;-webkit-appearance:none;margin:0}.zoom-slider input[type=range][data-v-6c90b4da]::-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-6c90b4da]::-webkit-slider-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-slider input[type=range][data-v-6c90b4da]::-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-6c90b4da]::-moz-range-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-button[data-v-6c90b4da]{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-6c90b4da]:hover{background:#f5f5f5;border-color:#1890ff;color:#1890ff}.zoom-button[data-v-6c90b4da]:active{background:#e6f7ff}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-sose-front/mx-sose-graph",
3
- "version": "1.0.9",
3
+ "version": "1.1.1",
4
4
  "description": "A Vue3 graph visualization plugin library",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -467,7 +467,7 @@ const onLayerClick = (evt: MouseEvent) => {
467
467
  handleConnectLayerClick(evt);
468
468
  return;
469
469
  }
470
- recordClickPoint.value = { x: evt.clientX, y: evt.clientY };
470
+ recordClickPoint.value = toLocalPoint(evt, layerRef.value);
471
471
  // 获取 sourceShape(先获取,确保存在)
472
472
  const foundSourceShape = graphStore.shapes.find(
473
473
  (shape) => shape.id === props.connectShapeData?.sourceId
@@ -481,9 +481,9 @@ const onLayerClick = (evt: MouseEvent) => {
481
481
  // 确保连接点已初始化
482
482
  initializeConnectPoint();
483
483
 
484
- const canvasRect = canvas.getBoundingClientRect();
485
- const clickX = evt.clientX - canvasRect.left - (props.diagramBounds?.x || 0);
486
- const clickY = evt.clientY - canvasRect.top - (props.diagramBounds?.y || 0);
484
+ const localPoint = toLocalPoint(evt, layerRef.value);
485
+ const clickX = localPoint.x;
486
+ const clickY = localPoint.y;
487
487
 
488
488
  // 判断点击位置是否有图形
489
489
  const hasShapeAtPoint = EdgeUtils.isEndPointInShape(graphStore.shapes, { x: clickX, y: clickY });
@@ -1159,19 +1159,21 @@ const onKeyDownDelete = (e: KeyboardEvent) => {
1159
1159
  eventBus.emit('shapes-remove', items);
1160
1160
  };
1161
1161
 
1162
+ // 鼠标移动事件处理
1162
1163
  // 鼠标移动事件处理
1163
1164
  const handleMouseMove = (event: MouseEvent) => {
1164
1165
  const { clientX, clientY } = event;
1166
+ const localPoint = toLocalPoint(event, layerRef.value);
1165
1167
 
1166
1168
  // 使用工具类检查是否在画布内
1167
1169
  if (EdgeUtils.isWithinCanvas(clientX, clientY)) {
1168
- mousePosition.value = { x: clientX, y: clientY };
1170
+ mousePosition.value = { x: localPoint.x, y: localPoint.y };
1169
1171
 
1170
1172
  // 只有在连接状态下才显示线条
1171
1173
  if (isConnecting.value) {
1172
1174
  showLine.value = true;
1173
- updateConnectPointToNearest(clientX, clientY);
1174
- checkHoverTarget(clientX, clientY);
1175
+ updateConnectPointToNearest(localPoint.x, localPoint.y);
1176
+ checkHoverTarget(localPoint.x, localPoint.y);
1175
1177
  }
1176
1178
  } else {
1177
1179
  if (isConnecting.value) {
@@ -1184,13 +1186,13 @@ const handleMouseMove = (event: MouseEvent) => {
1184
1186
  // 用于跟踪上一次的hoverShape,避免重复发射事件
1185
1187
  let lastHoverShapeId: string | null = null;
1186
1188
 
1187
- const checkHoverTarget = (clientX: number, clientY: number) => {
1189
+ const checkHoverTarget = (x: number, y: number) => {
1188
1190
  if (!props.diagramBounds) return;
1189
1191
 
1190
1192
  // 使用工具类检查悬停目标
1191
1193
  const hoverShape = EdgeUtils.checkHoverTarget(
1192
- clientX,
1193
- clientY,
1194
+ x,
1195
+ y,
1194
1196
  graphStore.shapes,
1195
1197
  props.diagramBounds,
1196
1198
  props.connectShapeData?.sourceId
@@ -1290,16 +1292,9 @@ watch(
1290
1292
 
1291
1293
  // 处理连接层点击事件
1292
1294
  const handleConnectLayerClick = (event: MouseEvent) => {
1293
- const { clientX, clientY } = event;
1294
-
1295
- const canvas = document.querySelector(".diagram-content");
1296
- if (!canvas || !props.diagramBounds) return;
1295
+ const localPoint = toLocalPoint(event, layerRef.value);
1297
1296
 
1298
- const canvasRect = canvas.getBoundingClientRect();
1299
- const clickX = clientX - canvasRect.left - (props.diagramBounds?.x || 0);
1300
- const clickY = clientY - canvasRect.top - (props.diagramBounds?.y || 0);
1301
-
1302
- const hit = pickTarget(graphStore.shapes, { x: clickX, y: clickY });
1297
+ const hit = pickTarget(graphStore.shapes, localPoint);
1303
1298
 
1304
1299
  if (
1305
1300
  hit.kind === "shape" &&
@@ -1308,7 +1303,7 @@ const handleConnectLayerClick = (event: MouseEvent) => {
1308
1303
  hit.shape.id !== props.connectShapeData.sourceId
1309
1304
  ) {
1310
1305
  event.stopPropagation();
1311
- completeConnection(hit.shape, { x: clickX, y: clickY });
1306
+ completeConnection(hit.shape, localPoint);
1312
1307
  }
1313
1308
  };
1314
1309
 
@@ -1470,17 +1465,13 @@ const linePoints = computed(() => {
1470
1465
  return ""; // 返回空字符串,SVG 不会渲染任何线条
1471
1466
  }
1472
1467
 
1473
- const canvas = document.querySelector(".diagram-content");
1474
- if (!canvas) return "";
1475
-
1476
- const canvasRect = canvas.getBoundingClientRect();
1477
1468
  const { x: startX, y: startY } = currentConnectPoint.value;
1478
1469
 
1479
1470
  let endX, endY;
1480
1471
  // 仅在连线状态下计算终点(避免无效值)
1481
1472
  if (isConnecting.value) {
1482
- endX = mousePosition.value.x - canvasRect.left - props.diagramBounds.x;
1483
- endY = mousePosition.value.y - canvasRect.top - props.diagramBounds.y;
1473
+ endX = mousePosition.value.x;
1474
+ endY = mousePosition.value.y;
1484
1475
  } else if (targetConnectPoint.value) {
1485
1476
  endX = targetConnectPoint.value.x;
1486
1477
  endY = targetConnectPoint.value.y;
package/src/index.ts CHANGED
@@ -22,14 +22,14 @@ export interface MxSoseGraphOptions {
22
22
  // 注意:这里给 Plugin 加了一个 [MxSoseGraphOptions?] 的泛型,方便 TS 类型推断
23
23
  export const MxSoseGraphPlugin: Plugin<[MxSoseGraphOptions?]> = {
24
24
  install(app: App, options?: MxSoseGraphOptions) {
25
- // 1️⃣ 尝试获取外部应用里的 pinia 实例
25
+ // 1尝试获取外部应用里的 pinia 实例
26
26
  const externalPinia =
27
27
  options?.pinia || // 优先使用显式传入的
28
28
  (app._context.provides.pinia as Pinia | undefined) || // Vue3 内部提供的
29
29
  (app.config.globalProperties.$pinia as Pinia | undefined) // 部分写法下可用
30
30
 
31
31
  if (externalPinia) {
32
- // 2️⃣ 用「库这份 pinia 模块」设置 activePinia
32
+ // 2 用「库这份 pinia 模块」设置 activePinia
33
33
  setActivePinia(externalPinia)
34
34
  } else {
35
35
  if (import.meta.env.DEV) {
@@ -40,10 +40,10 @@ export const MxSoseGraphPlugin: Plugin<[MxSoseGraphOptions?]> = {
40
40
  }
41
41
  }
42
42
 
43
- // 3️⃣ 注册组件
43
+ // 注册组件
44
44
  app.component('GraphView', GraphView)
45
45
 
46
- // 4️⃣ 安装 ElementPlus(如果你希望由宿主项目自己安装,也可以删掉这行)
46
+ // 安装 ElementPlus(如果你希望由宿主项目自己安装,也可以删掉这行)
47
47
  app.use(ElementPlus)
48
48
  },
49
49
  }
@@ -214,12 +214,8 @@ export class EdgeUtils {
214
214
  ) {
215
215
  if (!shape?.bounds || !diagramBounds) return null;
216
216
 
217
- const canvas = document.querySelector(".diagram-content");
218
- if (!canvas) return null;
219
-
220
- const canvasRect = canvas.getBoundingClientRect();
221
- const mouseX = mousePos.x - canvasRect.left - diagramBounds.x;
222
- const mouseY = mousePos.y - canvasRect.top - diagramBounds.y;
217
+ const mouseX = mousePos.x;
218
+ const mouseY = mousePos.y;
223
219
 
224
220
  const { x = 0, y = 0, width = 0, height = 0 } = shape.bounds;
225
221
 
@@ -568,14 +564,7 @@ export class EdgeUtils {
568
564
  diagramBounds: any,
569
565
  sourceId?: string
570
566
  ) {
571
- const canvas = document.querySelector(".diagram-content");
572
- if (!canvas) return null;
573
-
574
- const canvasRect = canvas.getBoundingClientRect();
575
- const clickX = x - canvasRect.left - (diagramBounds?.x || 0);
576
- const clickY = y - canvasRect.top - (diagramBounds?.y || 0);
577
-
578
- const hit = pickTarget(shapes, { x: clickX, y: clickY });
567
+ const hit = pickTarget(shapes, { x, y });
579
568
 
580
569
  if (["shape","pin"].includes(hit.kind) && hit.shape?.id && sourceId && hit.shape.id !== sourceId) {
581
570
  return hit.shape;
@@ -19,7 +19,7 @@
19
19
  left: `${diagramBounds.x}px`,
20
20
  top: `${diagramBounds.y}px`
21
21
  }" :resShape="resShape" :edgeCheck="edgeCheck" @property-panel="handlePropertyPanel"
22
- :actionButtonShapeId="actionButtonShapeId" @edit-name="handleEditName"
22
+ :actionButtonShapeDataId="actionButtonShapeId" @edit-name="handleEditName"
23
23
  @update-shape="handleUpdateConnectShape" @diagramDoubleClick="handleDiagramDoubleClick"
24
24
  @connect-end="handleConnectEnd" @action-button-click="handleActionButtonClick"
25
25
  @model-type-property-id-button-click="handleModelTypePropertyIdButtonClick" :lines="props.lines"
@@ -28,14 +28,14 @@
28
28
  </div>
29
29
 
30
30
  <!-- 缩放条 -->
31
- <!-- <div class="zoom-bar">
31
+ <div class="zoom-bar">
32
32
  <button @click="handleZoomOut" class="zoom-button zoom-out">-</button>
33
33
  <div class="zoom-slider">
34
34
  <input type="range" min="0.1" max="3" step="0.1" v-model="zoomValue" @input="handleZoomChange" />
35
35
  </div>
36
36
  <button @click="handleZoomIn" class="zoom-button zoom-in">+</button>
37
37
  <div class="zoom-level">{{ Math.round(currentScale * 100) }}%</div>
38
- </div> -->
38
+ </div>
39
39
  </div>
40
40
  </template>
41
41
 
@@ -106,8 +106,6 @@ const emit = defineEmits<{
106
106
  }>()
107
107
 
108
108
  const graphStore = useGraphStore()
109
- const diagramContentRef = ref<HTMLElement | null>(null)
110
- const shapeComponents = ref<any[]>([]) // 用于获取子组件实例
111
109
  const resShape = ref<Shape>({} as Shape) // 用于存储通过 ref 获取的 shape 数据
112
110
 
113
111
  // 计算属性:获取当前画布的缩放比例
@@ -446,8 +444,8 @@ defineExpose({
446
444
  height: 100%;
447
445
  min-height: 600px;
448
446
  /* 应用缩放变换 */
449
- /*transform-origin: 0 0;
450
- transform: scale(v-bind('currentScale'));*/
447
+ transform-origin: 0 0;
448
+ transform: scale(v-bind('currentScale'));
451
449
  }
452
450
 
453
451
  /* 所有 shape 组件都使用绝对定位 */