@kitlangton/solid-motion 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +48 -0
- package/README.md +54 -0
- package/dist/animation/animate/index.d.ts +23 -0
- package/dist/animation/animate/resolve-subjects.d.ts +3 -0
- package/dist/animation/animate/sequence.d.ts +3 -0
- package/dist/animation/animate/subject.d.ts +7 -0
- package/dist/animation/sequence/create.d.ts +6 -0
- package/dist/animation/sequence/types.d.ts +51 -0
- package/dist/animation/sequence/utils/calc-repeat-duration.d.ts +1 -0
- package/dist/animation/sequence/utils/calc-time.d.ts +2 -0
- package/dist/animation/sequence/utils/edit.d.ts +5 -0
- package/dist/animation/sequence/utils/normalize-times.d.ts +1 -0
- package/dist/animation/sequence/utils/sort.d.ts +2 -0
- package/dist/animation/utils/create-visual-element.d.ts +2 -0
- package/dist/animation/utils/is-dom-keyframes.d.ts +2 -0
- package/dist/components/AnimatePresence.d.ts +27 -0
- package/dist/components/AnimatePresenceContext.d.ts +23 -0
- package/dist/components/AnimatePresenceTypes.d.ts +57 -0
- package/dist/components/MotionConfig.d.ts +16 -0
- package/dist/context/MotionContext/create.d.ts +3 -0
- package/dist/context/MotionContext/utils.d.ts +3 -0
- package/dist/context/MotionContext.d.ts +7 -0
- package/dist/context/PresenceContext.d.ts +13 -0
- package/dist/events/add-pointer-event.d.ts +2 -0
- package/dist/events/event-info.d.ts +4 -0
- package/dist/gestures/drag/VisualElementDragControls.d.ts +86 -0
- package/dist/gestures/drag/index.d.ts +11 -0
- package/dist/gestures/drag/utils/constraints.d.ts +77 -0
- package/dist/gestures/focus.d.ts +8 -0
- package/dist/gestures/hover.d.ts +5 -0
- package/dist/gestures/pan/PanSession.d.ts +102 -0
- package/dist/gestures/pan/index.d.ts +15 -0
- package/dist/gestures/press.d.ts +5 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +2466 -0
- package/dist/index.js.map +1 -0
- package/dist/motion/features/animation/exit.d.ts +7 -0
- package/dist/motion/features/animation/index.d.ts +9 -0
- package/dist/motion/features/animations.d.ts +10 -0
- package/dist/motion/features/definitions.d.ts +3 -0
- package/dist/motion/features/feature-bundle.d.ts +34 -0
- package/dist/motion/features/gestures.d.ts +26 -0
- package/dist/motion/features/load-features.d.ts +1 -0
- package/dist/motion/index.d.ts +22 -0
- package/dist/motion/types.d.ts +27 -0
- package/dist/motion/utils/drag-projection.d.ts +3 -0
- package/dist/motion/utils/use-visual-state.d.ts +14 -0
- package/dist/motion/utils/valid-prop.d.ts +1 -0
- package/dist/render/dom/create-visual-element.d.ts +2 -0
- package/dist/render/dom/filter-props.d.ts +2 -0
- package/dist/render/dom/is-svg-component.d.ts +1 -0
- package/dist/render/dom/style.d.ts +1 -0
- package/dist/render/html/use-props.d.ts +7 -0
- package/dist/render/html/utils/create-render-state.d.ts +2 -0
- package/dist/render/svg/lowercase-elements.d.ts +1 -0
- package/dist/render/svg/use-props.d.ts +3 -0
- package/dist/render/svg/utils/create-render-state.d.ts +2 -0
- package/dist/render/types.d.ts +3 -0
- package/dist/server.js +2407 -0
- package/dist/server.js.map +1 -0
- package/dist/source/animation/animate/index.js +39 -0
- package/dist/source/animation/animate/resolve-subjects.js +19 -0
- package/dist/source/animation/animate/sequence.js +11 -0
- package/dist/source/animation/animate/subject.js +37 -0
- package/dist/source/animation/sequence/create.js +171 -0
- package/dist/source/animation/sequence/types.js +1 -0
- package/dist/source/animation/sequence/utils/calc-repeat-duration.js +3 -0
- package/dist/source/animation/sequence/utils/calc-time.js +17 -0
- package/dist/source/animation/sequence/utils/edit.js +21 -0
- package/dist/source/animation/sequence/utils/normalize-times.js +5 -0
- package/dist/source/animation/sequence/utils/sort.js +12 -0
- package/dist/source/animation/utils/create-visual-element.js +37 -0
- package/dist/source/animation/utils/is-dom-keyframes.js +3 -0
- package/dist/source/components/AnimatePresence.jsx +444 -0
- package/dist/source/components/AnimatePresenceContext.jsx +20 -0
- package/dist/source/components/AnimatePresenceTypes.js +1 -0
- package/dist/source/components/MotionConfig.jsx +13 -0
- package/dist/source/context/MotionContext/create.js +19 -0
- package/dist/source/context/MotionContext/utils.js +11 -0
- package/dist/source/context/MotionContext.js +2 -0
- package/dist/source/context/PresenceContext.js +2 -0
- package/dist/source/events/add-pointer-event.js +5 -0
- package/dist/source/events/event-info.js +16 -0
- package/dist/source/gestures/drag/VisualElementDragControls.js +531 -0
- package/dist/source/gestures/drag/index.js +47 -0
- package/dist/source/gestures/drag/utils/constraints.js +160 -0
- package/dist/source/gestures/focus.js +37 -0
- package/dist/source/gestures/hover.js +25 -0
- package/dist/source/gestures/pan/PanSession.js +273 -0
- package/dist/source/gestures/pan/index.js +46 -0
- package/dist/source/gestures/press.js +28 -0
- package/dist/source/index.js +11 -0
- package/dist/source/motion/features/animation/exit.js +33 -0
- package/dist/source/motion/features/animation/index.js +27 -0
- package/dist/source/motion/features/animations.js +10 -0
- package/dist/source/motion/features/definitions.js +29 -0
- package/dist/source/motion/features/feature-bundle.js +6 -0
- package/dist/source/motion/features/gestures.js +20 -0
- package/dist/source/motion/features/load-features.js +12 -0
- package/dist/source/motion/index.jsx +176 -0
- package/dist/source/motion/types.js +1 -0
- package/dist/source/motion/utils/drag-projection.js +16 -0
- package/dist/source/motion/utils/use-visual-state.js +53 -0
- package/dist/source/motion/utils/valid-prop.js +40 -0
- package/dist/source/render/dom/create-visual-element.js +10 -0
- package/dist/source/render/dom/filter-props.js +15 -0
- package/dist/source/render/dom/is-svg-component.js +10 -0
- package/dist/source/render/dom/style.js +12 -0
- package/dist/source/render/html/use-props.js +39 -0
- package/dist/source/render/html/utils/create-render-state.js +6 -0
- package/dist/source/render/svg/lowercase-elements.js +27 -0
- package/dist/source/render/svg/use-props.js +28 -0
- package/dist/source/render/svg/utils/create-render-state.js +5 -0
- package/dist/source/render/types.js +1 -0
- package/dist/source/utils/distance.js +7 -0
- package/dist/source/utils/get-context-window.js +4 -0
- package/dist/source/utils/is-ref-object.js +5 -0
- package/dist/source/utils/safe-react-types.js +1 -0
- package/dist/source/utils/use-reduced-motion.js +15 -0
- package/dist/source/value/use-motion-value-event.js +5 -0
- package/dist/source/value/use-motion-value.js +16 -0
- package/dist/source/value/use-spring.js +59 -0
- package/dist/source/value/use-transform.js +25 -0
- package/dist/source/value/use-velocity.js +17 -0
- package/dist/utils/distance.d.ts +3 -0
- package/dist/utils/get-context-window.d.ts +2 -0
- package/dist/utils/is-ref-object.d.ts +2 -0
- package/dist/utils/safe-react-types.d.ts +3 -0
- package/dist/utils/use-reduced-motion.d.ts +6 -0
- package/dist/value/use-motion-value-event.d.ts +3 -0
- package/dist/value/use-motion-value.d.ts +5 -0
- package/dist/value/use-spring.d.ts +5 -0
- package/dist/value/use-transform.d.ts +9 -0
- package/dist/value/use-velocity.d.ts +3 -0
- package/package.json +61 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createGeneratorEasing, defaultOffset, fillOffset, isGenerator, isMotionValue, } from "motion-dom";
|
|
2
|
+
import { getEasingForSegment, invariant, progress, secondsToMilliseconds } from "motion-utils";
|
|
3
|
+
import { resolveSubjects } from "../animate/resolve-subjects";
|
|
4
|
+
import { calculateRepeatDuration } from "./utils/calc-repeat-duration";
|
|
5
|
+
import { calcNextTime } from "./utils/calc-time";
|
|
6
|
+
import { addKeyframes } from "./utils/edit";
|
|
7
|
+
import { normalizeTimes } from "./utils/normalize-times";
|
|
8
|
+
import { compareByTime } from "./utils/sort";
|
|
9
|
+
const defaultSegmentEasing = "easeInOut";
|
|
10
|
+
const MAX_REPEAT = 20;
|
|
11
|
+
export function createAnimationsFromSequence(sequence, { defaultTransition = {}, ...sequenceTransition } = {}, scope, generators) {
|
|
12
|
+
const defaultDuration = defaultTransition.duration || 0.3;
|
|
13
|
+
const animationDefinitions = new Map();
|
|
14
|
+
const sequences = new Map();
|
|
15
|
+
const elementCache = {};
|
|
16
|
+
const timeLabels = new Map();
|
|
17
|
+
let prevTime = 0;
|
|
18
|
+
let currentTime = 0;
|
|
19
|
+
let totalDuration = 0;
|
|
20
|
+
for (let i = 0; i < sequence.length; i++) {
|
|
21
|
+
const segment = sequence[i];
|
|
22
|
+
if (typeof segment === "string") {
|
|
23
|
+
timeLabels.set(segment, currentTime);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
else if (!Array.isArray(segment)) {
|
|
27
|
+
timeLabels.set(segment.name, calcNextTime(currentTime, segment.at, prevTime, timeLabels));
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
let [subject, keyframes, transition = {}] = segment;
|
|
31
|
+
if (transition.at !== undefined) {
|
|
32
|
+
currentTime = calcNextTime(currentTime, transition.at, prevTime, timeLabels);
|
|
33
|
+
}
|
|
34
|
+
let maxDuration = 0;
|
|
35
|
+
const resolveValueSequence = (valueKeyframes, valueTransition, valueSequence, elementIndex = 0, numSubjects = 0) => {
|
|
36
|
+
const valueKeyframesAsList = keyframesAsList(valueKeyframes);
|
|
37
|
+
const { delay = 0, times = defaultOffset(valueKeyframesAsList), type = defaultTransition.type || "keyframes", repeat, repeatType, repeatDelay = 0, ...remainingTransition } = valueTransition;
|
|
38
|
+
let { ease = defaultTransition.ease || "easeOut", duration } = valueTransition;
|
|
39
|
+
const calculatedDelay = typeof delay === "function" ? delay(elementIndex, numSubjects) : delay;
|
|
40
|
+
const numKeyframes = valueKeyframesAsList.length;
|
|
41
|
+
const createGenerator = isGenerator(type) ? type : generators?.[type || "keyframes"];
|
|
42
|
+
if (numKeyframes <= 2 && createGenerator) {
|
|
43
|
+
let absoluteDelta = 100;
|
|
44
|
+
if (numKeyframes === 2 && isNumberKeyframesArray(valueKeyframesAsList)) {
|
|
45
|
+
const delta = valueKeyframesAsList[1] - valueKeyframesAsList[0];
|
|
46
|
+
absoluteDelta = Math.abs(delta);
|
|
47
|
+
}
|
|
48
|
+
const springTransition = {
|
|
49
|
+
...defaultTransition,
|
|
50
|
+
...remainingTransition,
|
|
51
|
+
};
|
|
52
|
+
if (duration !== undefined) {
|
|
53
|
+
springTransition.duration = secondsToMilliseconds(duration);
|
|
54
|
+
}
|
|
55
|
+
const springEasing = createGeneratorEasing(springTransition, absoluteDelta, createGenerator);
|
|
56
|
+
ease = springEasing.ease;
|
|
57
|
+
duration = springEasing.duration;
|
|
58
|
+
}
|
|
59
|
+
duration = duration ?? defaultDuration;
|
|
60
|
+
const startTime = currentTime + calculatedDelay;
|
|
61
|
+
if (times.length === 1 && times[0] === 0) {
|
|
62
|
+
times[1] = 1;
|
|
63
|
+
}
|
|
64
|
+
const remainder = times.length - valueKeyframesAsList.length;
|
|
65
|
+
remainder > 0 && fillOffset(times, remainder);
|
|
66
|
+
valueKeyframesAsList.length === 1 && valueKeyframesAsList.unshift(null);
|
|
67
|
+
if (repeat) {
|
|
68
|
+
invariant(repeat < MAX_REPEAT, "Repeat count too high, must be less than 20", "repeat-count-high");
|
|
69
|
+
duration = calculateRepeatDuration(duration ?? defaultDuration, repeat, repeatDelay);
|
|
70
|
+
const originalKeyframes = [...valueKeyframesAsList];
|
|
71
|
+
const originalTimes = [...times];
|
|
72
|
+
ease = Array.isArray(ease) ? [...ease] : [ease];
|
|
73
|
+
const originalEase = [...ease];
|
|
74
|
+
for (let repeatIndex = 0; repeatIndex < repeat; repeatIndex++) {
|
|
75
|
+
valueKeyframesAsList.push(...originalKeyframes);
|
|
76
|
+
for (let keyframeIndex = 0; keyframeIndex < originalKeyframes.length; keyframeIndex++) {
|
|
77
|
+
times.push(originalTimes[keyframeIndex] + (repeatIndex + 1));
|
|
78
|
+
ease.push(keyframeIndex === 0 ? "linear" : getEasingForSegment(originalEase, keyframeIndex - 1));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
normalizeTimes(times, repeat);
|
|
82
|
+
}
|
|
83
|
+
const targetTime = startTime + (duration ?? defaultDuration);
|
|
84
|
+
addKeyframes(valueSequence, valueKeyframesAsList, ease, times, startTime, targetTime);
|
|
85
|
+
maxDuration = Math.max(calculatedDelay + duration, maxDuration);
|
|
86
|
+
totalDuration = Math.max(targetTime, totalDuration);
|
|
87
|
+
};
|
|
88
|
+
if (isMotionValue(subject)) {
|
|
89
|
+
const subjectSequence = getSubjectSequence(subject, sequences);
|
|
90
|
+
resolveValueSequence(keyframes, transition, getValueSequence("default", subjectSequence));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const subjects = resolveSubjects(subject, keyframes, scope, elementCache);
|
|
94
|
+
const numSubjects = subjects.length;
|
|
95
|
+
for (let subjectIndex = 0; subjectIndex < numSubjects; subjectIndex++) {
|
|
96
|
+
keyframes = keyframes;
|
|
97
|
+
transition = transition;
|
|
98
|
+
const thisSubject = subjects[subjectIndex];
|
|
99
|
+
const subjectSequence = getSubjectSequence(thisSubject, sequences);
|
|
100
|
+
for (const key in keyframes) {
|
|
101
|
+
resolveValueSequence(keyframes[key], getValueTransition(transition, key), getValueSequence(key, subjectSequence), subjectIndex, numSubjects);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
prevTime = currentTime;
|
|
106
|
+
currentTime += maxDuration;
|
|
107
|
+
}
|
|
108
|
+
sequences.forEach((valueSequences, element) => {
|
|
109
|
+
for (const key in valueSequences) {
|
|
110
|
+
const valueSequence = valueSequences[key];
|
|
111
|
+
valueSequence.sort(compareByTime);
|
|
112
|
+
const keyframes = [];
|
|
113
|
+
const valueOffset = [];
|
|
114
|
+
const valueEasing = [];
|
|
115
|
+
for (let i = 0; i < valueSequence.length; i++) {
|
|
116
|
+
const { at, value, easing } = valueSequence[i];
|
|
117
|
+
keyframes.push(value);
|
|
118
|
+
valueOffset.push(progress(0, totalDuration, at));
|
|
119
|
+
valueEasing.push(easing || "easeOut");
|
|
120
|
+
}
|
|
121
|
+
if (valueOffset[0] !== 0) {
|
|
122
|
+
valueOffset.unshift(0);
|
|
123
|
+
keyframes.unshift(keyframes[0]);
|
|
124
|
+
valueEasing.unshift(defaultSegmentEasing);
|
|
125
|
+
}
|
|
126
|
+
if (valueOffset[valueOffset.length - 1] !== 1) {
|
|
127
|
+
valueOffset.push(1);
|
|
128
|
+
keyframes.push(null);
|
|
129
|
+
}
|
|
130
|
+
if (!animationDefinitions.has(element)) {
|
|
131
|
+
animationDefinitions.set(element, {
|
|
132
|
+
keyframes: {},
|
|
133
|
+
transition: {},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const definition = animationDefinitions.get(element);
|
|
137
|
+
definition.keyframes[key] = keyframes;
|
|
138
|
+
const { type: _type, ...remainingDefaultTransition } = defaultTransition;
|
|
139
|
+
definition.transition[key] = {
|
|
140
|
+
...remainingDefaultTransition,
|
|
141
|
+
duration: totalDuration,
|
|
142
|
+
ease: valueEasing,
|
|
143
|
+
times: valueOffset,
|
|
144
|
+
...sequenceTransition,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
return animationDefinitions;
|
|
149
|
+
}
|
|
150
|
+
function getSubjectSequence(subject, sequences) {
|
|
151
|
+
!sequences.has(subject) && sequences.set(subject, {});
|
|
152
|
+
return sequences.get(subject);
|
|
153
|
+
}
|
|
154
|
+
function getValueSequence(name, sequences) {
|
|
155
|
+
if (!sequences[name])
|
|
156
|
+
sequences[name] = [];
|
|
157
|
+
return sequences[name];
|
|
158
|
+
}
|
|
159
|
+
function keyframesAsList(keyframes) {
|
|
160
|
+
return Array.isArray(keyframes) ? keyframes : [keyframes];
|
|
161
|
+
}
|
|
162
|
+
export function getValueTransition(transition, key) {
|
|
163
|
+
return transition && transition[key]
|
|
164
|
+
? {
|
|
165
|
+
...transition,
|
|
166
|
+
...transition[key],
|
|
167
|
+
}
|
|
168
|
+
: { ...transition };
|
|
169
|
+
}
|
|
170
|
+
const isNumber = (keyframe) => typeof keyframe === "number";
|
|
171
|
+
const isNumberKeyframesArray = (keyframes) => keyframes.every(isNumber);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function calcNextTime(current, next, prev, labels) {
|
|
2
|
+
if (typeof next === "number") {
|
|
3
|
+
return next;
|
|
4
|
+
}
|
|
5
|
+
else if (next.startsWith("-") || next.startsWith("+")) {
|
|
6
|
+
return Math.max(0, current + parseFloat(next));
|
|
7
|
+
}
|
|
8
|
+
else if (next === "<") {
|
|
9
|
+
return prev;
|
|
10
|
+
}
|
|
11
|
+
else if (next.startsWith("<")) {
|
|
12
|
+
return Math.max(0, prev + parseFloat(next.slice(1)));
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return labels.get(next) ?? current;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { mixNumber } from "motion-dom";
|
|
2
|
+
import { getEasingForSegment, removeItem } from "motion-utils";
|
|
3
|
+
export function eraseKeyframes(sequence, startTime, endTime) {
|
|
4
|
+
for (let i = 0; i < sequence.length; i++) {
|
|
5
|
+
const keyframe = sequence[i];
|
|
6
|
+
if (keyframe.at > startTime && keyframe.at < endTime) {
|
|
7
|
+
removeItem(sequence, keyframe);
|
|
8
|
+
i--;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function addKeyframes(sequence, keyframes, easing, offset, startTime, endTime) {
|
|
13
|
+
eraseKeyframes(sequence, startTime, endTime);
|
|
14
|
+
for (let i = 0; i < keyframes.length; i++) {
|
|
15
|
+
sequence.push({
|
|
16
|
+
value: keyframes[i],
|
|
17
|
+
at: mixNumber(startTime, endTime, offset[i]),
|
|
18
|
+
easing: getEasingForSegment(easing, i),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { HTMLVisualElement, isSVGElement, isSVGSVGElement, ObjectVisualElement, SVGVisualElement, visualElementStore, } from "motion-dom";
|
|
2
|
+
export function createDOMVisualElement(element) {
|
|
3
|
+
const options = {
|
|
4
|
+
presenceContext: null,
|
|
5
|
+
props: {},
|
|
6
|
+
visualState: {
|
|
7
|
+
renderState: {
|
|
8
|
+
transform: {},
|
|
9
|
+
transformOrigin: {},
|
|
10
|
+
style: {},
|
|
11
|
+
vars: {},
|
|
12
|
+
attrs: {},
|
|
13
|
+
},
|
|
14
|
+
latestValues: {},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
const node = isSVGElement(element) && !isSVGSVGElement(element)
|
|
18
|
+
? new SVGVisualElement(options)
|
|
19
|
+
: new HTMLVisualElement(options);
|
|
20
|
+
node.mount(element);
|
|
21
|
+
visualElementStore.set(element, node);
|
|
22
|
+
}
|
|
23
|
+
export function createObjectVisualElement(subject) {
|
|
24
|
+
const options = {
|
|
25
|
+
presenceContext: null,
|
|
26
|
+
props: {},
|
|
27
|
+
visualState: {
|
|
28
|
+
renderState: {
|
|
29
|
+
output: {},
|
|
30
|
+
},
|
|
31
|
+
latestValues: {},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
const node = new ObjectVisualElement(options);
|
|
35
|
+
node.mount(subject);
|
|
36
|
+
visualElementStore.set(subject, node);
|
|
37
|
+
}
|