feat(core): add interpolate option to viewport transforming functions (#1851)

* chore(core): add d3-interpolate to deps

Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>

* feat(core): add interpolate option to viewport transforming functions

Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>

* chore(changeset): add

* feat(core): add interpolate option to viewport transforming functions

Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>

---------

Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
Braks
2025-05-19 17:35:54 +02:00
parent 00bc28bf1b
commit 505fbfef74
5 changed files with 25 additions and 10 deletions
@@ -1,3 +1,4 @@
import { interpolate, interpolateZoom } from 'd3-interpolate'
import { zoomIdentity } from 'd3-zoom'
import { computed } from 'vue'
import type { D3Selection, GraphNode, Project, State, TransitionOptions, ViewportFunctions } from '../types'
@@ -48,7 +49,7 @@ export function useViewportHelper(state: State) {
function zoom(scale: number, transitionOptions?: TransitionOptions) {
return new Promise<boolean>((resolve) => {
if (state.d3Selection && state.d3Zoom) {
state.d3Zoom.scaleBy(
state.d3Zoom.interpolate(transitionOptions?.interpolate === 'linear' ? interpolate : interpolateZoom).scaleBy(
getD3Transition(state.d3Selection, transitionOptions?.duration, transitionOptions?.ease, () => {
resolve(true)
}),
@@ -68,7 +69,7 @@ export function useViewportHelper(state: State) {
const nextTransform = zoomIdentity.translate(-clampedX, -clampedY).scale(zoom)
if (state.d3Selection && state.d3Zoom) {
state.d3Zoom.transform(
state.d3Zoom?.interpolate(transitionOptions?.interpolate === 'linear' ? interpolate : interpolateZoom).transform(
getD3Transition(state.d3Selection, transitionOptions?.duration, transitionOptions?.ease, () => {
resolve(true)
}),
@@ -99,7 +100,7 @@ export function useViewportHelper(state: State) {
zoomTo: (zoomLevel, options) => {
return new Promise<boolean>((resolve) => {
if (state.d3Selection && state.d3Zoom) {
state.d3Zoom.scaleTo(
state.d3Zoom.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).scaleTo(
getD3Transition(state.d3Selection, options?.duration, options?.ease, () => {
resolve(true)
}),
+1
View File
@@ -19,6 +19,7 @@ export enum PanOnScrollMode {
export interface TransitionOptions {
duration?: number
ease?: (t: number) => number
interpolate?: 'smooth' | 'linear'
}
export type FitViewParams = {