From 70f00540d14275c13dd8a02e286bf1e30c5eae2e Mon Sep 17 00:00:00 2001 From: 4eb0da <4eb0da@yandex-team.com> Date: Thu, 12 Sep 2024 10:36:55 +0300 Subject: [PATCH] Visibility gone animation fix 7b694769d0be07c89cbdfaa3e9636e4c8bee1265 --- .../divkit/src/components/state/State.svelte | 20 +++++++++++-------- .../src/components/utilities/Outer.svelte | 8 +++++++- client/web/divkit/src/context/state.ts | 3 ++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/client/web/divkit/src/components/state/State.svelte b/client/web/divkit/src/components/state/State.svelte index b185c95b7..29dd2f3d7 100644 --- a/client/web/divkit/src/components/state/State.svelte +++ b/client/web/divkit/src/components/state/State.svelte @@ -146,6 +146,7 @@ parentComponentContext: ComponentContext; transitions: AppearanceTransition; node: HTMLElement; + bbox?: DOMRect; resolvePromise?: (val?: void) => void; } interface ChildWithTransitionChange { @@ -172,7 +173,7 @@ transitions = componentContext.getJsonWithVars(transitions) as AppearanceTransition; const transitionsList: AnyTransition[] = flattenTransition(transitions); - const bbox = node.getBoundingClientRect(); + const startBbox = child.bbox || node.getBoundingClientRect(); const jsonCopy = { ...json, margins: undefined, @@ -184,14 +185,14 @@ componentContextCopy: parentComponentContext.produceChildContext(jsonCopy, { fake: true }), - elementBbox: bbox, + elementBbox: startBbox, rootBbox, transitions: transitionsList, alpha: json.alpha, - width: bbox.width, - height: bbox.height, - offsetTop: bbox.top - rootBbox.top, - offsetLeft: bbox.left - rootBbox.left, + width: startBbox.width, + height: startBbox.height, + offsetTop: startBbox.top - rootBbox.top, + offsetLeft: startBbox.left - rootBbox.left, direction, resolvePromise: child.resolvePromise, node: child.node @@ -378,12 +379,14 @@ unregisterInstance(id: string) { childStateMap?.delete(id); }, + // eslint-disable-next-line max-params runVisibilityTransition( json: DivBaseData, parentComponentContext: ComponentContext, transitions: AppearanceTransition, node: HTMLElement, - direction: 'in' | 'out' + direction: 'in' | 'out', + bbox: DOMRect | undefined ) { if (!animationRoot) { return Promise.resolve(); @@ -396,7 +399,8 @@ json, parentComponentContext, transitions, - node + node, + bbox }, direction ); diff --git a/client/web/divkit/src/components/utilities/Outer.svelte b/client/web/divkit/src/components/utilities/Outer.svelte index 23cfcef42..22e9cac9c 100644 --- a/client/web/divkit/src/components/utilities/Outer.svelte +++ b/client/web/divkit/src/components/utilities/Outer.svelte @@ -715,6 +715,11 @@ hasVisibilityChangeTrigger && transition ) { + let bbox: DOMRect | undefined; + if (nextVisibility === 'gone') { + bbox = currentNode.getBoundingClientRect(); + } + await tick(); if (direction === 'in') { @@ -728,7 +733,8 @@ componentContext, transition, currentNode, - direction + direction, + bbox ).then(() => { if (direction === 'in') { visibilityChangingInProgress = false; diff --git a/client/web/divkit/src/context/state.ts b/client/web/divkit/src/context/state.ts index cbc76fa4e..7d1de2e19 100644 --- a/client/web/divkit/src/context/state.ts +++ b/client/web/divkit/src/context/state.ts @@ -43,7 +43,8 @@ export interface StateCtxValue { componentContext: ComponentContext, transitions: MaybeMissing, node: HTMLElement, - direction: 'in' | 'out' + direction: 'in' | 'out', + bbox?: DOMRect | undefined ): Promise; registerChild(id: string): void;