()
| 392 | } |
| 393 | |
| 394 | function renderGuides() { |
| 395 | // remove old |
| 396 | document.querySelectorAll(".guide-line").forEach((n) => n.remove()); |
| 397 | const scale = parseFloat(preview.dataset.scale || "1"); |
| 398 | guides.forEach((g) => { |
| 399 | const div = document.createElement("div"); |
| 400 | div.className = "guide-line " + g.orient; |
| 401 | div.dataset.id = g.id; |
| 402 | if (g.orient === "v") div.style.left = (g.pos * scale) + "px"; |
| 403 | else div.style.top = (g.pos * scale) + "px"; |
| 404 | preview.appendChild(div); |
| 405 | |
| 406 | let dragging = false; |
| 407 | let start = 0; |
| 408 | div.addEventListener("mousedown", (e) => { |
| 409 | e.preventDefault(); |
| 410 | dragging = true; |
| 411 | start = g.orient === "v" ? e.clientX : e.clientY; |
| 412 | }); |
| 413 | document.addEventListener("mousemove", (e) => { |
| 414 | if (!dragging) return; |
| 415 | const cur = g.orient === "v" ? e.clientX : e.clientY; |
| 416 | const deltaPx = cur - start; |
| 417 | const deltaUnits = deltaPx / scale; |
| 418 | g.pos = Math.max(0, Math.round(g.pos + deltaUnits)); |
| 419 | start = cur; |
| 420 | renderGuides(); |
| 421 | }); |
| 422 | document.addEventListener("mouseup", () => { |
| 423 | if (!dragging) return; |
| 424 | dragging = false; |
| 425 | pushHistory(); |
| 426 | }); |
| 427 | div.addEventListener("dblclick", (e) => { |
| 428 | e.preventDefault(); |
| 429 | guides = guides.filter((x) => x.id !== g.id); |
| 430 | renderGuides(); |
| 431 | pushHistory(); |
| 432 | }); |
| 433 | }); |
| 434 | } |
| 435 | |
| 436 | function snapMoveToElements(elementId, x, y, opts) { |
| 437 | const suppressSnap = !!(opts && opts.suppressSnap); |
no test coverage detected