Skip to content

Commit

Permalink
Merge pull request #2623 from framer/fix/restore-transform
Browse files Browse the repository at this point in the history
Ensuring removed transforms are restored
  • Loading branch information
mergetron[bot] committed Apr 16, 2024
2 parents 1d6ee53 + c81b56e commit 3ffc074
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 7 deletions.
45 changes: 45 additions & 0 deletions dev/tests/unit-conversion-rotate.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { animate } from "framer-motion"
import { useEffect, useRef } from "react"

/**
* An example of animating between different value types
*/

export const App = () => {
const ref = useRef<HTMLDivElement>(null)
useEffect(() => {
animate(
ref.current,
{ width: [0, 100], rotate: [0, 45] },
{ duration: 0.1, ease: "linear" }
).then(() => {
animate(
ref.current,
{ width: "50%" },
{
duration: 0.2,
ease: "linear",
onUpdate: (width) => {
if (width > 200) {
ref.current!.textContent = "Fail"
}
},
}
)
})
}, [])

return (
<div
ref={ref}
style={{
width: 100,
height: 100,
background: "#ffaa00",
}}
id="box"
>
Success
</div>
)
}
12 changes: 12 additions & 0 deletions packages/framer-motion/cypress/integration/unit-conversion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,16 @@ describe("Unit conversion", () => {
expect(height).to.equal(150)
})
})

it("Restores unapplied transforms", () => {
cy.viewport(400, 400)
.visit("?test=unit-conversion-rotate")
.wait(300)
.get("#box")
.should(([$box]: any) => {
const { transform } = $box.style
expect(transform).to.equal("rotate(45deg) translateZ(0px)")
expect($box.textContent).to.equal("Success")
})
})
})
4 changes: 1 addition & 3 deletions packages/framer-motion/src/render/VisualElement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -889,9 +889,7 @@ export abstract class VisualElement<
* Find the base target for a value thats been removed from all animation
* props.
*/
getBaseTarget(
key: string
): ResolvedValues[string] | undefined | null {
getBaseTarget(key: string): ResolvedValues[string] | undefined | null {
const { initial } = this.props

let valueFromInitial: ResolvedValues[string] | undefined | null
Expand Down
12 changes: 8 additions & 4 deletions packages/framer-motion/src/render/utils/KeyframesResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,7 @@ function measureAllKeyframes() {

if (!removedTransforms.length) return

transformsToRestore.set(
element,
removeNonTranslationalTransform(element)
)
transformsToRestore.set(element, removedTransforms)

element.render()
})
Expand All @@ -47,6 +44,13 @@ function measureAllKeyframes() {
// Write
elementsToMeasure.forEach((element: VisualElement<HTMLElement>) => {
element.render()

const restore = transformsToRestore.get(element)
if (restore) {
restore.forEach(([key, value]) => {
element.getValue(key)?.set(value)
})
}
})

// Read
Expand Down

0 comments on commit 3ffc074

Please sign in to comment.