|
609 | 609 | return { zoomOutButton, zoomInButton, zoomLabel }; |
610 | 610 | }; |
611 | 611 |
|
| 612 | + ctx.syncPackageViewportResizeHandle = function syncPackageViewportResizeHandle() { |
| 613 | + const packageUi = ctx.packageUi || null; |
| 614 | + if (!packageUi || !packageUi.resizeHandle) { |
| 615 | + return; |
| 616 | + } |
| 617 | + |
| 618 | + const bounds = ctx.packageViewportHeightBounds(); |
| 619 | + const height = Math.round(packageUi.viewportHeight || bounds.min); |
| 620 | + packageUi.resizeHandle.setAttribute("aria-valuemin", String(bounds.min)); |
| 621 | + packageUi.resizeHandle.setAttribute("aria-valuemax", String(bounds.max)); |
| 622 | + packageUi.resizeHandle.setAttribute("aria-valuenow", String(height)); |
| 623 | + packageUi.resizeHandle.setAttribute("aria-valuetext", `Package viewport height ${height} pixels`); |
| 624 | + }; |
| 625 | + |
| 626 | + ctx.refitPackageToViewport = function refitPackageToViewport() { |
| 627 | + const packageUi = ctx.packageUi || null; |
| 628 | + if (!packageUi || !packageUi.svg) { |
| 629 | + return; |
| 630 | + } |
| 631 | + |
| 632 | + const fallbackWidth = packageUi.defaultBaseWidth || packageUi.baseWidth; |
| 633 | + packageUi.baseWidth = ctx.fitPackageBaseWidthToViewport(fallbackWidth); |
| 634 | + ctx.applyPackageZoom(); |
| 635 | + }; |
| 636 | + |
612 | 637 | ctx.packageViewportHeightBounds = function packageViewportHeightBounds() { |
613 | 638 | return { |
614 | 639 | min: 360, |
|
626 | 651 | const height = clamp(nextHeight, bounds.min, bounds.max); |
627 | 652 | packageUi.viewportHeight = height; |
628 | 653 | packageUi.mountNode.style.height = `${Math.round(height)}px`; |
| 654 | + ctx.refitPackageToViewport(); |
| 655 | + ctx.syncPackageViewportResizeHandle(); |
| 656 | + }; |
| 657 | + |
| 658 | + ctx.finishPackageViewportResize = function finishPackageViewportResize(pointerId = null) { |
| 659 | + const packageUi = ctx.packageUi || null; |
| 660 | + if (!packageUi || !packageUi.resizeHandle || !packageUi.mouseDrag) { |
| 661 | + return; |
| 662 | + } |
| 663 | + |
| 664 | + if (pointerId != null && packageUi.mouseDrag.pointerId !== pointerId) { |
| 665 | + return; |
| 666 | + } |
| 667 | + |
| 668 | + if ( |
| 669 | + packageUi.mouseDrag.pointerId != null && |
| 670 | + typeof packageUi.resizeHandle.hasPointerCapture === "function" && |
| 671 | + packageUi.resizeHandle.hasPointerCapture(packageUi.mouseDrag.pointerId) |
| 672 | + ) { |
| 673 | + packageUi.resizeHandle.releasePointerCapture(packageUi.mouseDrag.pointerId); |
| 674 | + } |
| 675 | + |
| 676 | + packageUi.mouseDrag = null; |
| 677 | + packageUi.resizeHandle.classList.remove("package-diagram-resizer-active"); |
| 678 | + document.body.classList.remove("package-resize-active"); |
| 679 | + }; |
| 680 | + |
| 681 | + ctx.bindPackageViewportResizeHandle = function bindPackageViewportResizeHandle() { |
| 682 | + const resizeHandle = document.getElementById("package-diagram-resizer"); |
| 683 | + if (!resizeHandle || resizeHandle.dataset.bound === "true") { |
| 684 | + return; |
| 685 | + } |
| 686 | + |
| 687 | + const resizeBy = (delta) => { |
| 688 | + const packageUi = ctx.packageUi || null; |
| 689 | + if (!packageUi) { |
| 690 | + return; |
| 691 | + } |
| 692 | + ctx.setPackageViewportHeight((packageUi.viewportHeight || 0) + delta); |
| 693 | + }; |
| 694 | + |
| 695 | + resizeHandle.addEventListener("pointerdown", (event) => { |
| 696 | + if (event.button !== 0 && event.pointerType !== "touch" && event.pointerType !== "pen") { |
| 697 | + return; |
| 698 | + } |
| 699 | + |
| 700 | + const packageUi = ctx.packageUi || null; |
| 701 | + if (!packageUi || !packageUi.mountNode || packageUi.resizeHandle !== resizeHandle) { |
| 702 | + return; |
| 703 | + } |
| 704 | + |
| 705 | + event.preventDefault(); |
| 706 | + ctx.hidePackageTooltip(); |
| 707 | + ctx.closePackageFunctionPicker(); |
| 708 | + packageUi.mouseDrag = { |
| 709 | + pointerId: event.pointerId, |
| 710 | + startY: event.clientY, |
| 711 | + startHeight: packageUi.viewportHeight || packageUi.mountNode.getBoundingClientRect().height || 0, |
| 712 | + }; |
| 713 | + packageUi.resizeHandle.classList.add("package-diagram-resizer-active"); |
| 714 | + document.body.classList.add("package-resize-active"); |
| 715 | + |
| 716 | + if (typeof resizeHandle.setPointerCapture === "function") { |
| 717 | + resizeHandle.setPointerCapture(event.pointerId); |
| 718 | + } |
| 719 | + }); |
| 720 | + |
| 721 | + resizeHandle.addEventListener("pointermove", (event) => { |
| 722 | + const packageUi = ctx.packageUi || null; |
| 723 | + if (!packageUi || !packageUi.mouseDrag || packageUi.mouseDrag.pointerId !== event.pointerId) { |
| 724 | + return; |
| 725 | + } |
| 726 | + |
| 727 | + event.preventDefault(); |
| 728 | + const nextHeight = packageUi.mouseDrag.startHeight + (event.clientY - packageUi.mouseDrag.startY); |
| 729 | + ctx.setPackageViewportHeight(nextHeight); |
| 730 | + }); |
| 731 | + |
| 732 | + const stopResize = (event) => { |
| 733 | + if (!event) { |
| 734 | + ctx.finishPackageViewportResize(); |
| 735 | + return; |
| 736 | + } |
| 737 | + ctx.finishPackageViewportResize(event.pointerId); |
| 738 | + }; |
| 739 | + |
| 740 | + resizeHandle.addEventListener("pointerup", stopResize); |
| 741 | + resizeHandle.addEventListener("pointercancel", stopResize); |
| 742 | + resizeHandle.addEventListener("lostpointercapture", stopResize); |
| 743 | + |
| 744 | + resizeHandle.addEventListener("keydown", (event) => { |
| 745 | + switch (event.key) { |
| 746 | + case "ArrowDown": |
| 747 | + event.preventDefault(); |
| 748 | + resizeBy(24); |
| 749 | + break; |
| 750 | + case "ArrowUp": |
| 751 | + event.preventDefault(); |
| 752 | + resizeBy(-24); |
| 753 | + break; |
| 754 | + case "PageDown": |
| 755 | + event.preventDefault(); |
| 756 | + resizeBy(96); |
| 757 | + break; |
| 758 | + case "PageUp": |
| 759 | + event.preventDefault(); |
| 760 | + resizeBy(-96); |
| 761 | + break; |
| 762 | + case "Home": { |
| 763 | + const bounds = ctx.packageViewportHeightBounds(); |
| 764 | + event.preventDefault(); |
| 765 | + ctx.setPackageViewportHeight(bounds.min); |
| 766 | + break; |
| 767 | + } |
| 768 | + case "End": { |
| 769 | + const bounds = ctx.packageViewportHeightBounds(); |
| 770 | + event.preventDefault(); |
| 771 | + ctx.setPackageViewportHeight(bounds.max); |
| 772 | + break; |
| 773 | + } |
| 774 | + default: |
| 775 | + break; |
| 776 | + } |
| 777 | + }); |
| 778 | + |
| 779 | + resizeHandle.dataset.bound = "true"; |
629 | 780 | }; |
630 | 781 |
|
631 | 782 | ctx.bindPackageZoomControls = function bindPackageZoomControls() { |
|
730 | 881 | } |
731 | 882 | }); |
732 | 883 |
|
| 884 | + window.addEventListener("resize", () => { |
| 885 | + const packageUi = ctx.packageUi || null; |
| 886 | + if (!packageUi) { |
| 887 | + return; |
| 888 | + } |
| 889 | + |
| 890 | + ctx.setPackageViewportHeight(packageUi.viewportHeight); |
| 891 | + }); |
| 892 | + |
733 | 893 | ctx.packageGlobalHandlersBound = true; |
734 | 894 | }; |
735 | 895 |
|
|
1523 | 1683 | const mountNode = document.getElementById("package-diagram"); |
1524 | 1684 | const controlsNode = document.getElementById("package-view-controls"); |
1525 | 1685 | const subtitleNode = document.getElementById("package-subtitle"); |
| 1686 | + const resizeHandle = document.getElementById("package-diagram-resizer"); |
1526 | 1687 | if (!mountNode) { |
1527 | 1688 | return; |
1528 | 1689 | } |
|
1581 | 1742 | highlightedRowIds: new Set(), |
1582 | 1743 | highlightedField: null, |
1583 | 1744 | baseWidth: ctx.packageRendererDefaultWidth(packageModel), |
| 1745 | + defaultBaseWidth: ctx.packageRendererDefaultWidth(packageModel), |
1584 | 1746 | zoom: 1, |
1585 | 1747 | zoomConfig: ctx.packageRendererZoomConfig(packageModel), |
1586 | 1748 | zoomOutButton: zoomControls ? zoomControls.zoomOutButton : null, |
1587 | 1749 | zoomInButton: zoomControls ? zoomControls.zoomInButton : null, |
1588 | 1750 | zoomLabel: zoomControls ? zoomControls.zoomLabel : null, |
| 1751 | + resizeHandle, |
1589 | 1752 | viewportHeight: mountNode.getBoundingClientRect().height || 640, |
1590 | 1753 | mouseDrag: null, |
1591 | 1754 | touchGesture: null, |
|
1598 | 1761 | stage.append(svg, tooltip, picker); |
1599 | 1762 | mountNode.append(stage); |
1600 | 1763 | ctx.setPackageViewportHeight(ctx.packageUi.viewportHeight); |
1601 | | - ctx.packageUi.baseWidth = ctx.fitPackageBaseWidthToViewport(ctx.packageUi.baseWidth); |
| 1764 | + ctx.bindPackageViewportResizeHandle(); |
1602 | 1765 | ctx.bindPackageZoomControls(); |
1603 | | - ctx.applyPackageZoom(); |
1604 | 1766 | ctx.resetPackageDetail(); |
1605 | 1767 | }; |
1606 | 1768 | }; |
|
0 commit comments