@mx-sose-front/mx-sose-graph 1.0.8 → 1.1.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.
- package/dist/index.esm.js +161 -136
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/InteractionLayer.vue +17 -26
- package/src/index.ts +4 -4
- package/src/utils/edgeUtils.ts +3 -14
- package/src/view/graph.vue +6 -6
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{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{position:absolute;top:10px;left:10px;right:0;bottom:30px;overflow:auto;touch-action:none}.shapes-container{position:relative;width:100%;height:100%;min-height:600px}.shapes-container>*{position:absolute}.zoom-bar{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{font-size:10px;font-weight:500;min-width:35px;text-align:center;color:#333}.zoom-slider{width:150px;height:100%;display:flex;align-items:center;justify-content:center}.zoom-slider input[type=range]{width:100%;height:2px;border-radius:1px;background:#e0e0e0;outline:none;-webkit-appearance:none;margin:0}.zoom-slider input[type=range]::-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]::-webkit-slider-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-slider input[type=range]::-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]::-moz-range-thumb:hover{background:#40a9ff;transform:scale(1.1)}.zoom-button{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:hover{background:#f5f5f5;border-color:#1890ff;color:#1890ff}.zoom-button: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-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}
|
package/package.json
CHANGED
|
@@ -467,7 +467,7 @@ const onLayerClick = (evt: MouseEvent) => {
|
|
|
467
467
|
handleConnectLayerClick(evt);
|
|
468
468
|
return;
|
|
469
469
|
}
|
|
470
|
-
recordClickPoint.value =
|
|
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
|
|
485
|
-
const clickX =
|
|
486
|
-
const clickY =
|
|
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:
|
|
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(
|
|
1174
|
-
checkHoverTarget(
|
|
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 = (
|
|
1189
|
+
const checkHoverTarget = (x: number, y: number) => {
|
|
1188
1190
|
if (!props.diagramBounds) return;
|
|
1189
1191
|
|
|
1190
1192
|
// 使用工具类检查悬停目标
|
|
1191
1193
|
const hoverShape = EdgeUtils.checkHoverTarget(
|
|
1192
|
-
|
|
1193
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
1483
|
-
endY = mousePosition.value.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
|
|
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
|
|
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
|
-
//
|
|
43
|
+
// 注册组件
|
|
44
44
|
app.component('GraphView', GraphView)
|
|
45
45
|
|
|
46
|
-
//
|
|
46
|
+
// 安装 ElementPlus(如果你希望由宿主项目自己安装,也可以删掉这行)
|
|
47
47
|
app.use(ElementPlus)
|
|
48
48
|
},
|
|
49
49
|
}
|
package/src/utils/edgeUtils.ts
CHANGED
|
@@ -214,12 +214,8 @@ export class EdgeUtils {
|
|
|
214
214
|
) {
|
|
215
215
|
if (!shape?.bounds || !diagramBounds) return null;
|
|
216
216
|
|
|
217
|
-
const
|
|
218
|
-
|
|
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
|
|
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;
|
package/src/view/graph.vue
CHANGED
|
@@ -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
|
-
:
|
|
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
|
-
|
|
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
|
|
|
@@ -418,7 +418,7 @@ defineExpose({
|
|
|
418
418
|
})
|
|
419
419
|
</script>
|
|
420
420
|
|
|
421
|
-
<style>
|
|
421
|
+
<style scoped>
|
|
422
422
|
.graph-view {
|
|
423
423
|
width: 100%;
|
|
424
424
|
height: 100%;
|
|
@@ -446,8 +446,8 @@ defineExpose({
|
|
|
446
446
|
height: 100%;
|
|
447
447
|
min-height: 600px;
|
|
448
448
|
/* 应用缩放变换 */
|
|
449
|
-
|
|
450
|
-
transform: scale(v-bind('currentScale'))
|
|
449
|
+
transform-origin: 0 0;
|
|
450
|
+
transform: scale(v-bind('currentScale'));
|
|
451
451
|
}
|
|
452
452
|
|
|
453
453
|
/* 所有 shape 组件都使用绝对定位 */
|