56.11 Combining and timing requests
Run requests together, in order, or with staggered starts.
Inside succession, animation-group, or lagged-start, the same values are intrinsic timing units. The direct child contributes (+ start duration) units to its parent schedule; the parent then scales that span proportionally into its assigned interval. The scaled start portion is a delay during which the wrapped content has no effect.
When easing is #f, the timed request inherits its enclosing timing context. A supplied procedure overrides that inherited easing. For a leaf it applies only to that leaf; for a timed composition it becomes the inherited easing of all descendant leaves unless a nested timed child supplies another easing. Easing changes interpolation, not schedule allocation.
Before the concrete local start, the wrapped content has no effect. During its active interval it is sampled using local normalized progress; after its active endpoint, its exact semantic endpoint is held. Timed wrappers are permitted inside Visual/scalar and camera compositions, and a composition itself may be wrapped. Another timed wrapper is not a valid request value. A timed camera-follow samples its target only while its own interval is active, then holds the resulting endpoint view.
procedure
(timed-animation-request? value) → boolean?
value : any/c
procedure
(succession request ...) → succession-animation-request?
request :
(or/c timed-animation-request? succession-animation-request? animation-group-animation-request? lagged-start-animation-request? style-to-animation-request? value-to-request? move-to-request? move-along-path-request? orient-along-path-request? rotate-to-request? rotate-by-request? scale-to-request? scale-by-request? stroke-width-to-request? fill-color-to-request? stroke-color-to-request? fade-to-request? fade-in-request? fade-out-request? enter-request? leave-request? morph-to-request? morph-to-normalized-request? morph-to-aligned-request? morph-to-open-aligned-request? morph-to-open-compound-aligned-request? morph-to-mixed-compound-aligned-request? morph-to-topology-changing-request? morph-to-compound-aligned-request? transform-formula-parts-request? create-request? uncreate-request? camera-pan-to-request? camera-pan-by-request? camera-zoom-to-request? camera-zoom-by-request? camera-follow-request? camera-fit-request?)
An unwrapped direct child contributes one intrinsic timing unit. A direct timed child contributes (+ start duration) units. The direct child spans are placed consecutively in argument order and their total is scaled to the succession’s concrete assigned duration. Thus unwrapped children receive equal shares, while explicit timed durations act as proportional sequence weights. A timed child’s start portion is a scaled hold delay before its active content.
A bare nested composition counts as one direct child in its parent’s allocation. Wrap that nested composition with timed when it should reserve a non-unit or delayed parent-level span. Once assigned an interval, the nested composition recursively applies its own timing rule.
Every leaf is compiled against the exact semantic state at its own start boundary. Relative requests therefore chain from prior endpoints. The scheduler supports structural introduction, removal, same-ID reintroduction, overlap checks, and direct arbitrary-time sampling. Easing is inherited independently by each leaf; a nested timed child may override it.
At least one child is required. A single list of valid children is accepted in place of separate arguments. Ordinary Visual and camera requests, unified style transitions, timed Visual/camera composition wrappers, and nested successions, animation groups, or lagged starts are valid children. Camera center and world-width overlap rules apply after expansion.
procedure
(succession-animation-request? value) → boolean?
value : any/c
procedure
(animation-group request ...)
→ animation-group-animation-request?
request :
(or/c timed-animation-request? succession-animation-request? animation-group-animation-request? lagged-start-animation-request? style-to-animation-request? value-to-request? move-to-request? move-along-path-request? orient-along-path-request? rotate-to-request? rotate-by-request? scale-to-request? scale-by-request? stroke-width-to-request? fill-color-to-request? stroke-color-to-request? fade-to-request? fade-in-request? fade-out-request? enter-request? leave-request? morph-to-request? morph-to-normalized-request? morph-to-aligned-request? morph-to-open-aligned-request? morph-to-open-compound-aligned-request? morph-to-mixed-compound-aligned-request? morph-to-topology-changing-request? morph-to-compound-aligned-request? transform-formula-parts-request? create-request? uncreate-request? camera-pan-to-request? camera-pan-by-request? camera-zoom-to-request? camera-zoom-by-request? camera-follow-request? camera-fit-request?)
Every unwrapped direct child has one intrinsic timing unit. A direct timed child has span (+ start duration). All children share the group start; their spans are scaled against the longest direct span so the longest child reaches the group endpoint. Shorter children finish earlier and hold their exact endpoints. If no direct child is timed, every span is one and each child occupies the full interval.
A timed child’s scaled start portion is a delay. A bare nested succession, group, or lagged start still contributes one parent-level unit and recursively expands inside the concrete interval it receives; wrap that nested composition with timed to give it an explicit non-unit span.
Existing component rules still apply after complete expansion: compatible components such as translation and rotation may share one target, while two positive-overlap updates to the same target/component are rejected. The final leaves use the scheduled-leaf engine, preserving exact-boundary compilation, structural semantics, easing inheritance, camera-follow behavior, and direct arbitrary-time sampling.
At least one child is required. A single list of valid children is accepted in place of separate arguments. Unified style transitions, camera requests, timed Visual/camera composition wrappers, and nested compositions are valid group children. Camera center and world-width overlap rules apply after expansion.
procedure
(animation-group-animation-request? value) → boolean?
value : any/c
procedure
(lagged-start request ... [ #:lag-ratio lag-ratio]) → lagged-start-animation-request?
request :
(or/c timed-animation-request? succession-animation-request? animation-group-animation-request? lagged-start-animation-request? style-to-animation-request? value-to-request? move-to-request? move-along-path-request? orient-along-path-request? rotate-to-request? rotate-by-request? scale-to-request? scale-by-request? stroke-width-to-request? fill-color-to-request? stroke-color-to-request? fade-to-request? fade-in-request? fade-out-request? enter-request? leave-request? morph-to-request? morph-to-normalized-request? morph-to-aligned-request? morph-to-open-aligned-request? morph-to-open-compound-aligned-request? morph-to-mixed-compound-aligned-request? morph-to-topology-changing-request? morph-to-compound-aligned-request? transform-formula-parts-request? create-request? uncreate-request? camera-pan-to-request? camera-pan-by-request? camera-zoom-to-request? camera-zoom-by-request? camera-follow-request? camera-fit-request?) lag-ratio : (and/c finite-real? (>=/c 0)) = 1/4
When every direct span is one, this gives the formula (/ D (+ 1 (* (sub1 n) r))). More generally, #:lag-ratio 0 has duration-scaled animation-group timing and #:lag-ratio 1 has duration-scaled succession timing even when child spans differ. Intermediate ratios overlap according to the previous child’s span; ratios greater than one may leave hold gaps.
A timed child’s start portion becomes scaled delay before its active content. A bare nested composition contributes one parent-level unit and recursively applies its own rule in the interval it receives; wrap it with timed for an explicit parent-level duration or delay. All expanded leaves use the scheduled-leaf engine, with exact boundary compilation, conflict validation, structural ordering, easing inheritance, and arbitrary-time sampling.
At least one child is required. A single list of valid children is accepted in place of separate arguments. Unified style transitions, camera requests, timed Visual/camera composition wrappers, and nested compositions are valid lagged children. Camera center and world-width overlap rules apply after expansion.
procedure
(lagged-start-animation-request? value) → boolean?
value : any/c
procedure
(stagger-map targets template [ #:lag-ratio lag-ratio #:order order #:delay delay]) → any/c targets : target-sequence? template : (or/c request-template? procedure?) lag-ratio : (and/c finite-real? (>=/c 0)) = 1/4 order : (or/c 'forward 'reverse animation-order?) = 'forward delay : (or/c #f delay-plan?) = #f
#:order changes scheduled order only. It never changes a reference’s source index. An empty resolved sequence is a contract error. Procedure-backed templates are supported for in-process authoring but are explicitly nonserializable; request-template? communicates that distinction.
With no #:delay, stagger-map uses (index-delay lag-ratio) and lowers through the ordinary lagged-start timing rule. A custom delay plan is independent of #:order and lowers to explicit timed children in a parallel envelope. Position-driven plans use frozen world positions from the map’s local start and raise a capability error when a target has no 2D position.
value
procedure
(repeat-animation request count) → succession-animation-request?
request : any/c count : exact-positive-integer?
procedure
(ping-pong forward backward [#:count count])
→ succession-animation-request? forward : any/c backward : any/c count : exact-positive-integer? = 1