Config options
init
init?: Pose
A pose config to default to if no initialPose
is defined.
initialPose
initialPose?: string | string[] = 'init'
The name of the initial pose (or poses if provided as an array).
draggable
draggable?: true | 'x' | 'y'
If true
, will make the element draggable on both axis. Setting to either 'x'
or 'y'
will restrict movement to that axis.
If defined, allows use of the special drag
pose for styling the element while dragging is active.
A dragEnd
pose can be optionally set for animating on drag end.
const config = {
draggable: 'x',
init: { scale: 1 },
drag: { scale: 1.2 }
}
The drag
and dragEnd
poses will travel through any posed children.
dragBounds
dragBounds?: { [key: string]: number }
An object that defines top
, right
, bottom
and/or left
drag boundaries in pixels.
Currently, these boundaries are enforced by a hard clamp.
onDragStart/onDragEnd
onDragStart/onDragEnd: (e: MouseEvent | TouchEvent) => any
Lifecycle callbacks for drag events.
hoverable
hoverable?: boolean
If true
, this element will receive hover
poses when a pointer hovers over it.
There’s also an optional hoverEnd
pose, for providing a different pose when hovering ends.
const config = {
hoverable: true,
init: { scale: 1 },
hover: { scale: 1.2 }
}
The hover
and hoverEnd
poses will travel through any posed children.
focusable
focusable?: boolean
If true
, this element will receive focus
poses when the element receives focus, and blur
poses when it loses focus.
const config = {
focusable: true,
init: { scale: 1 },
focus: { scale: 1.2 },
blur: {
scale: 1,
transition: {
type: 'spring',
stiffness: 800
}
}
}
pressable
pressable?: boolean
If true
, this element will receive press
poses when the element is pressed, and optionally pressEnd
when pressing stops.
const config = {
pressable: true,
init: { scale: 1 },
press: { scale: 0.8 }
};
onPressStart/onPressEnd
onPressStart/onPressEnd: (e: MouseEvent | TouchEvent) => any
Lifecycle callbacks for press events.
passive
passive: { [key: string]: PassiveValue }
type PassiveValue = [
subscribedKey: string,
transform: (subscribedValue: any) => any,
fromParent?: true | string
]
Map of values that are passively changed when other values, either on this Poser or an ancestor, change.
fromParent
can be set either as true
or as a string
:
true
: Link to value from immediate parent.string
: Link to the nearest ancestor with thislabel
prop.
Example
The transform
function here is composed with Popmotion transformers:
const config = {
draggable: 'x',
passive: {
backgroundColor: ['x', pipe(
clamp(0, 300),
interpolate([0, 300], [0, 1]),
blendColor('#f00', '#0f0')
)]
}
}
label
label: string
Set a label on this poser. Currently, this allows a passive
value on a child poser to refer to this ancestor value.
props
props: { [key: string]: any }
Properties to provide to entered pose transition
methods and dynamic pose props. These can be updated with the setProps
method or, in React Pose, by providing props to the posed component.
onChange
onChange?: { [key: string]: (v: any) => any }
Map of callbacks, one for each animated value, that will fire whenever that value changes.
Note: For React Pose, instead use the onValueChange
property on the posed component.
Example
const config = {
draggable: 'x',
onChange: {
x: (x) => // you do you
}
}
…poses
...poses: { [key: string]: Pose }
Any other config props will be treated as poses (see Pose config).
Pose config
You can call a pose anything, and animate to it by calling poser.set('poseName')
or setting <PosedComponent pose="poseName" />
.
A pose is defined by style attributes like x
or backgroundColor
, and the following optional props:
delay
delay?: number | (props: Props) => number
A duration, in milliseconds, to delay this transition. Does not affect children.
delayChildren
delayChildren?: number | (props: Props) => number
A duration, in milliseconds, to delay the transition of direct children.
flip
flip?: boolean = false
If true
, will convert this animation to a FLIP animation.
staggerChildren
staggerChildren?: number | (props: Props) => number
A duration, in milliseconds, between transitioning each children.
staggerDirection
staggerDirection?: 1 | -1 | (props: Props) => 1 | -1
If 1
, staggers from the first child to the last. If -1
, from last to first.
beforeChildren
beforeChildren?: boolean | (props: Props) => boolean
If true
, will ensure this animation completes before firing any child animations.
afterChildren
afterChildren?: boolean | (props: Props) => boolean
If true
, will ensure this animation only fires after all child animations have completed.
applyAtStart/applyAtEnd
applyAtStart/applyAtEnd?: { [string]: any | (props: Props) => any }
applyAtStart
and applyAtEnd
accept style properties to apply either at the start or end of an animation.
For instance, you might have an element that you want to flip between display: block
before it fades in, and display: none
after it fades out:
const config = {
visible: {
applyAtStart: { display: 'block' },
opacity: 1
},
hidden: {
applyAtEnd: { display: 'none' },
opacity: 0
}
};
transition
transition?
The transition
prop can be used to create custom transitions.
It can be set as a transition definition:
transition: { type: 'spring' }
A function that returns a transition definition or a Popmotion animation:
transition: (props) => spring({...props})
transition: (props) => ({ type: 'spring' })
Or finally, a named map where each prop is either a transition definition, or a function returning a transition definition/Popmotion animation:
visible: {
x: 0,
opacity: 1,
transition: {
x: { type: 'spring' },
default: (props) => tween(props)
}
}
Transition definitions
A transition definition describes the type of animation Pose should use to move to the value defined in the Pose.
There are many types, and each has its own specific configuration props available.
Tween (default)
Transitions between one value and another over a set duration of time.
duration?: number = 300
: Total duration of animation, in milliseconds.elapsed?: number = 0
: Duration of animation already elapsed, in milliseconds.ease?: string | number[] | Function
: The name of an easing function, a cubic bezier definition, or an easing function. The following easings are included with Pose:- ‘linear’
- ‘easeIn’, ‘easeOut’, ‘easeInOut’
- ‘circIn’, ‘circOut’, ‘circInOut’
- ‘backIn’, ‘backOut’, ‘backInOut’
- ‘anticipate’
loop?: number = 0
: Number of times to loop animation.flip?: number = 0
: Number of times to flip animation.yoyo?: number = 0
: Number of times to reverse tween.
Spring
A spring animation based on stiffness
, damping
and mass
.
type: 'spring'
: Set transition to spring.stiffness?: number = 100
: Spring stiffness.damping?: number = 10
: Strength of opposing force.mass?: number = 1.0
: Mass of the moving object.restDelta?: number = 0.01
: End animation if distance toto
is below this value andrestSpeed
istrue
.restSpeed?: number = 0.01
: End animation if speed drops below this value andrestDelta
istrue
.
Physics
Integrated simulation of velocity, acceleration, friction and springs.
type: 'physics'
: Set transition to physics.acceleration?: number = 0
: Increasevelocity
by this amount every second.restSpeed?: number = 0.001
: When absolute speed drops below this value,complete
is fired.friction?: number = 0
: Amount of friction to apply per frame, from0
to1
.springStrength?: number = 0
: If set withto
, will spring towards target with this strength.
Keyframes
Keyframes accepts an array of values
and will animate between each in sequence.
Timing is defined with a combination of duration
, easings
and times
properties (see Methods)
type: 'keyframes'
: Set transition to keyframes.values: number[]
: An array of numbers to animate between. To use the value defined in the Pose as the final destination value, settransition
as a function:transition: ({ to }) => { type: 'keyframes', values: [0, to] }
duration?: number = 300
: Total duration of animation, in milliseconds.easings?: Easing | Easing[]
: An array of easing functions for each generated tween, or a single easing function applied to all tweens. This array should bevalues.length - 1
. Defaults toeaseOut
. (This doesn’t yet support named easings)times?: number[]
: An array of numbers between0
and1
, representing0
toduration
, that represent at which point each number should be hit. Defaults to an array of evenly-spread durations will be calculated.elapsed?: number = 0
: Duration of animation already elapsed, in milliseconds.ease?: Easing = easeOut
: A function, given a progress between0
and1
, that returns a new progress value. Used to affect the rate of playback across the duration of the animation. (This doesn’t yet support named easings)loop?: number = 0
: Number of times to loop animation.flip?: number = 0
: Number of times to flip animation.yoyo?: number = 0
: Number of times to reverse tween.
Decay
decay
exponentially decelerates a number and velocity to an automatically generated target value. This target can be modified by the user.
This animation is particularly useful for implementing momentum scrolling.
type: 'decay'
: Set transition to decay.power?: number = 0.8
: A constant with which to calculate a target value. Higher power = further target.0.8
should be okay.timeConstant?: number = 350
: Adjusting the time constant will change the duration of the deceleration, thereby affecting its feel.restDelta?: number = 0.5
: Automatically completes the action when the calculated value is this far away from the target.modifyTarget?: (v: number) => number
: A function that receives the calculated target and returns a new one. Useful for snapping the target to a grid, for example.
General transition props
The following props can be set on any transition:
from?: number | Color
: Start value of animation (overrides Pose-generated value).to?: number | Color
: End value of animation (overrides Pose-generated value).velocity?: number
: Initial velocity of animation (overrides Pose-generated value).delay?: number
: Delay the execution of the transition by this amount of time (in milliseconds).min?: number
: Restrict output to numbers larger than this.max?: number
: Restrict output to numbers smaller than this.round?: boolean
: Iftrue
, output numbers will be rounded.
Transition props
If set as a function, transition
received the same user-defined props as other dynamic pose properties, with some generated by Pose:
type TransitionsProps = {
from: any,
to: any,
velocity: number,
key: string,
prevPoseKey: string
}
from
: The current state of the valuevelocity
: The current velocity of the value, if it’s a numberto
: The state we’re animating to, as defined in the current pose. Note: You’re under no obligation to actually animate to this value (for instance for non-deterministic animations)key
: The name of the valueprevPoseKey
: The name of the pose this value was previously in.
…values
...values: any | (props: Props) => any
Any remaining properties are treated as stylistic values and will be animated.