react-ui-animate 3.0.0-rc.0 → 3.0.0-rc.2

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.
Files changed (161) hide show
  1. package/dist/animation/core/helpers/isDefined.d.ts +1 -1
  2. package/dist/animation/core/helpers/isFluidValue.d.ts +8 -4
  3. package/dist/animation/lib/interpolation.d.ts +20 -15
  4. package/dist/gestures/helpers/math.d.ts +1 -1
  5. package/dist/index.js +1 -2897
  6. package/dist/index.js.map +1 -1
  7. package/package.json +2 -1
  8. package/.vscode/settings.json +0 -3
  9. package/dist/animation/animationType.d.ts +0 -15
  10. package/dist/animation/core/animation/Animation.d.ts +0 -16
  11. package/dist/animation/core/animation/FluidValue.d.ts +0 -21
  12. package/dist/animation/core/animation/RequestAnimationFrame.d.ts +0 -8
  13. package/dist/animation/core/animation/SpringAnimation.d.ts +0 -41
  14. package/dist/animation/core/animation/TimingAnimation.d.ts +0 -35
  15. package/dist/animation/core/animation/TransitionValue.d.ts +0 -21
  16. package/dist/animation/core/helpers/camelToDash.d.ts +0 -7
  17. package/dist/animation/core/helpers/canInterpolate.d.ts +0 -11
  18. package/dist/animation/core/helpers/getAnimatableObject.d.ts +0 -22
  19. package/dist/animation/core/helpers/getNonAnimatableStyle.d.ts +0 -6
  20. package/dist/animation/core/react/Tags.d.ts +0 -3
  21. package/dist/animation/core/react/TransformStyles.d.ts +0 -8
  22. package/dist/animation/core/react/animated.d.ts +0 -29
  23. package/dist/animation/core/react/combineRefs.d.ts +0 -2
  24. package/dist/animation/core/react/functions/camelToDash.d.ts +0 -7
  25. package/dist/animation/core/react/functions/getAnimatableObject.d.ts +0 -22
  26. package/dist/animation/core/react/functions/getCleanProps.d.ts +0 -4
  27. package/dist/animation/core/react/functions/getCssValue.d.ts +0 -8
  28. package/dist/animation/core/react/functions/getNonAnimatableStyle.d.ts +0 -6
  29. package/dist/animation/core/react/functions/index.d.ts +0 -7
  30. package/dist/animation/core/react/functions/isDefined.d.ts +0 -6
  31. package/dist/animation/core/react/functions/isTransitionValue.d.ts +0 -6
  32. package/dist/animation/core/react/helpers/camelToDash.d.ts +0 -7
  33. package/dist/animation/core/react/helpers/canInterpolate.d.ts +0 -7
  34. package/dist/animation/core/react/helpers/getAnimatableObject.d.ts +0 -22
  35. package/dist/animation/core/react/helpers/getCleanProps.d.ts +0 -4
  36. package/dist/animation/core/react/helpers/getCssValue.d.ts +0 -8
  37. package/dist/animation/core/react/helpers/getNonAnimatableStyle.d.ts +0 -6
  38. package/dist/animation/core/react/helpers/index.d.ts +0 -7
  39. package/dist/animation/core/react/helpers/isDefined.d.ts +0 -6
  40. package/dist/animation/core/react/helpers/isFluidValue.d.ts +0 -6
  41. package/dist/animation/core/react/helpers/isTransitionValue.d.ts +0 -6
  42. package/dist/animation/core/react/useMounts.d.ts +0 -26
  43. package/dist/animation/core/react/useTransition.d.ts +0 -9
  44. package/dist/animation/core/react/useTransitions.d.ts +0 -11
  45. package/dist/animation/core/types/animation.d.ts +0 -54
  46. package/dist/animation/core/types/common.d.ts +0 -4
  47. package/dist/animation/core/types/fluid.d.ts +0 -19
  48. package/dist/animation/core/types/index.d.ts +0 -2
  49. package/dist/animation/getInitialConfig.d.ts +0 -3
  50. package/dist/animation/index.d.ts +0 -6
  51. package/dist/animation/interpolation.d.ts +0 -21
  52. package/dist/animation/modules/AnimatedBlock.d.ts +0 -8
  53. package/dist/animation/modules/AnimatedImage.d.ts +0 -8
  54. package/dist/animation/modules/AnimatedInline.d.ts +0 -8
  55. package/dist/animation/modules/MountedBlock.d.ts +0 -29
  56. package/dist/animation/modules/ScrollableBlock.d.ts +0 -21
  57. package/dist/animation/modules/TransitionBlock.d.ts +0 -17
  58. package/dist/animation/modules/index.d.ts +0 -6
  59. package/dist/animation/useAnimatedValue.d.ts +0 -22
  60. package/dist/animation/useMountedValue.d.ts +0 -15
  61. package/dist/gestures/eventAttacher.d.ts +0 -11
  62. package/dist/gestures/index.d.ts +0 -2
  63. package/dist/gestures/math.d.ts +0 -34
  64. package/dist/gestures/types.d.ts +0 -51
  65. package/dist/gestures/withDefault.d.ts +0 -4
  66. package/dist/utils/isDefined.d.ts +0 -1
  67. package/ecosystem.config.js +0 -12
  68. package/example/README.md +0 -46
  69. package/example/package-lock.json +0 -19597
  70. package/example/package.json +0 -45
  71. package/example/public/favicon.ico +0 -0
  72. package/example/public/index.html +0 -20
  73. package/example/public/logo192.png +0 -0
  74. package/example/public/logo512.png +0 -0
  75. package/example/public/manifest.json +0 -25
  76. package/example/public/robots.txt +0 -3
  77. package/example/src/App.tsx +0 -41
  78. package/example/src/components/Draggable.tsx +0 -46
  79. package/example/src/components/Gestures.tsx +0 -151
  80. package/example/src/components/Interpolation.tsx +0 -21
  81. package/example/src/components/Loop.tsx +0 -48
  82. package/example/src/components/MountedBlock.tsx +0 -25
  83. package/example/src/components/MouseMove.tsx +0 -59
  84. package/example/src/components/MultistageTransition.tsx +0 -34
  85. package/example/src/components/Scroll.tsx +0 -39
  86. package/example/src/components/ScrollableBlock.tsx +0 -27
  87. package/example/src/components/SnapTo.tsx +0 -55
  88. package/example/src/components/TransitionBlock.tsx +0 -37
  89. package/example/src/components/Wheel.tsx +0 -39
  90. package/example/src/components/index.ts +0 -18
  91. package/example/src/components/svgLine.tsx +0 -48
  92. package/example/src/components/useAnimatedValue.tsx +0 -57
  93. package/example/src/components/useMountedValue.tsx +0 -62
  94. package/example/src/index.css +0 -8
  95. package/example/src/index.tsx +0 -16
  96. package/example/tsconfig.json +0 -26
  97. package/rollup.config.mjs +0 -18
  98. package/src/animation/core/controllers/Animation.ts +0 -27
  99. package/src/animation/core/controllers/FluidValue.ts +0 -97
  100. package/src/animation/core/controllers/RequestAnimationFrame.ts +0 -13
  101. package/src/animation/core/controllers/SpringAnimation.ts +0 -218
  102. package/src/animation/core/controllers/TimingAnimation.ts +0 -152
  103. package/src/animation/core/easing/Bezier.ts +0 -146
  104. package/src/animation/core/easing/Easing.ts +0 -132
  105. package/src/animation/core/helpers/camelCaseToKebabCase.ts +0 -10
  106. package/src/animation/core/helpers/getCleanProps.ts +0 -16
  107. package/src/animation/core/helpers/getCssValue.ts +0 -60
  108. package/src/animation/core/helpers/index.ts +0 -5
  109. package/src/animation/core/helpers/isDefined.ts +0 -14
  110. package/src/animation/core/helpers/isFluidValue.ts +0 -11
  111. package/src/animation/core/index.ts +0 -16
  112. package/src/animation/core/interpolation/Colors.ts +0 -232
  113. package/src/animation/core/interpolation/Interpolation.ts +0 -395
  114. package/src/animation/core/interpolation/__tests__/Colors.test.tsx +0 -35
  115. package/src/animation/core/react/fluid.ts +0 -197
  116. package/src/animation/core/react/makeFluid.ts +0 -294
  117. package/src/animation/core/react/transforms.ts +0 -90
  118. package/src/animation/core/react/useFluidValue.ts +0 -43
  119. package/src/animation/core/react/useMount.ts +0 -58
  120. package/src/animation/core/types/animation.d.ts +0 -56
  121. package/src/animation/core/types/common.d.ts +0 -4
  122. package/src/animation/core/types/fluid.d.ts +0 -38
  123. package/src/animation/lib/animationType.ts +0 -17
  124. package/src/animation/lib/getInitialConfig.ts +0 -61
  125. package/src/animation/lib/index.ts +0 -12
  126. package/src/animation/lib/interpolation.ts +0 -47
  127. package/src/animation/lib/modules/AnimatedBlock.ts +0 -8
  128. package/src/animation/lib/modules/AnimatedImage.ts +0 -8
  129. package/src/animation/lib/modules/AnimatedInline.ts +0 -8
  130. package/src/animation/lib/modules/MountedBlock.tsx +0 -51
  131. package/src/animation/lib/modules/ScrollableBlock.tsx +0 -68
  132. package/src/animation/lib/modules/TransitionBlock.tsx +0 -28
  133. package/src/animation/lib/modules/index.ts +0 -6
  134. package/src/animation/lib/useAnimatedValue.ts +0 -60
  135. package/src/animation/lib/useMountedValue.ts +0 -18
  136. package/src/gestures/controllers/DragGesture.ts +0 -178
  137. package/src/gestures/controllers/Gesture.ts +0 -54
  138. package/src/gestures/controllers/MouseMoveGesture.ts +0 -111
  139. package/src/gestures/controllers/ScrollGesture.ts +0 -107
  140. package/src/gestures/controllers/WheelGesture.ts +0 -123
  141. package/src/gestures/controllers/index.ts +0 -4
  142. package/src/gestures/helpers/eventAttacher.ts +0 -67
  143. package/src/gestures/helpers/index.ts +0 -1
  144. package/src/gestures/helpers/math.ts +0 -120
  145. package/src/gestures/helpers/withDefault.ts +0 -3
  146. package/src/gestures/hooks/index.ts +0 -5
  147. package/src/gestures/hooks/useDrag.ts +0 -14
  148. package/src/gestures/hooks/useGesture.ts +0 -38
  149. package/src/gestures/hooks/useMouseMove.ts +0 -11
  150. package/src/gestures/hooks/useRecognizer.ts +0 -59
  151. package/src/gestures/hooks/useScroll.ts +0 -11
  152. package/src/gestures/hooks/useWheel.ts +0 -11
  153. package/src/gestures/types/index.d.ts +0 -49
  154. package/src/hooks/index.ts +0 -3
  155. package/src/hooks/useMeasure.ts +0 -132
  156. package/src/hooks/useOutsideClick.ts +0 -36
  157. package/src/hooks/useWindowDimension.ts +0 -58
  158. package/src/index.ts +0 -42
  159. package/src/utils/delay.ts +0 -9
  160. package/src/utils/index.ts +0 -1
  161. package/tsconfig.json +0 -24
@@ -1,197 +0,0 @@
1
- import { makeFluid } from './makeFluid';
2
-
3
- import type { FluidProps } from '../types/fluid';
4
-
5
- type HTMLTags = keyof JSX.IntrinsicElements;
6
-
7
- const tags: HTMLTags[] = [
8
- 'a',
9
- 'abbr',
10
- 'address',
11
- 'area',
12
- 'article',
13
- 'aside',
14
- 'audio',
15
- 'b',
16
- 'base',
17
- 'bdi',
18
- 'bdo',
19
- 'big',
20
- 'blockquote',
21
- 'body',
22
- 'br',
23
- 'button',
24
- 'canvas',
25
- 'caption',
26
- 'center',
27
- 'cite',
28
- 'code',
29
- 'col',
30
- 'colgroup',
31
- 'data',
32
- 'datalist',
33
- 'dd',
34
- 'del',
35
- 'details',
36
- 'dfn',
37
- 'dialog',
38
- 'div',
39
- 'dl',
40
- 'dt',
41
- 'em',
42
- 'embed',
43
- 'fieldset',
44
- 'figcaption',
45
- 'figure',
46
- 'footer',
47
- 'form',
48
- 'h1',
49
- 'h2',
50
- 'h3',
51
- 'h4',
52
- 'h5',
53
- 'h6',
54
- 'head',
55
- 'header',
56
- 'hgroup',
57
- 'hr',
58
- 'html',
59
- 'i',
60
- 'iframe',
61
- 'img',
62
- 'input',
63
- 'ins',
64
- 'kbd',
65
- 'keygen',
66
- 'label',
67
- 'legend',
68
- 'li',
69
- 'link',
70
- 'main',
71
- 'map',
72
- 'mark',
73
- 'menu',
74
- 'menuitem',
75
- 'meta',
76
- 'meter',
77
- 'nav',
78
- 'noindex',
79
- 'noscript',
80
- 'object',
81
- 'ol',
82
- 'optgroup',
83
- 'option',
84
- 'output',
85
- 'p',
86
- 'param',
87
- 'picture',
88
- 'pre',
89
- 'progress',
90
- 'q',
91
- 'rp',
92
- 'rt',
93
- 'ruby',
94
- 's',
95
- 'samp',
96
- 'search',
97
- 'section',
98
- 'select',
99
- 'small',
100
- 'source',
101
- 'span',
102
- 'strong',
103
- 'style',
104
- 'sub',
105
- 'summary',
106
- 'sup',
107
- 'table',
108
- 'template',
109
- 'tbody',
110
- 'td',
111
- 'textarea',
112
- 'tfoot',
113
- 'th',
114
- 'thead',
115
- 'time',
116
- 'title',
117
- 'tr',
118
- 'track',
119
- 'u',
120
- 'ul',
121
- 'var',
122
- 'video',
123
- 'wbr',
124
-
125
- // SVG Tags
126
- 'svg',
127
- 'animate',
128
- 'animateMotion',
129
- 'animateTransform',
130
- 'circle',
131
- 'clipPath',
132
- 'defs',
133
- 'desc',
134
- 'ellipse',
135
- 'feBlend',
136
- 'feColorMatrix',
137
- 'feComponentTransfer',
138
- 'feComposite',
139
- 'feConvolveMatrix',
140
- 'feDiffuseLighting',
141
- 'feDisplacementMap',
142
- 'feDistantLight',
143
- 'feDropShadow',
144
- 'feFlood',
145
- 'feFuncA',
146
- 'feFuncB',
147
- 'feFuncG',
148
- 'feFuncR',
149
- 'feGaussianBlur',
150
- 'feImage',
151
- 'feMerge',
152
- 'feMergeNode',
153
- 'feMorphology',
154
- 'feOffset',
155
- 'fePointLight',
156
- 'feSpecularLighting',
157
- 'feSpotLight',
158
- 'feTile',
159
- 'feTurbulence',
160
- 'filter',
161
- 'foreignObject',
162
- 'g',
163
- 'image',
164
- 'line',
165
- 'linearGradient',
166
- 'marker',
167
- 'mask',
168
- 'metadata',
169
- 'mpath',
170
- 'path',
171
- 'pattern',
172
- 'polygon',
173
- 'polyline',
174
- 'radialGradient',
175
- 'rect',
176
- 'set',
177
- 'stop',
178
- 'switch',
179
- 'symbol',
180
- 'text',
181
- 'textPath',
182
- 'tspan',
183
- 'use',
184
- 'view',
185
- ];
186
-
187
- type WithFluid = {
188
- [k in keyof JSX.IntrinsicElements]: React.ComponentType<
189
- FluidProps<HTMLElement>
190
- >;
191
- };
192
-
193
- export const fluid: WithFluid = {} as WithFluid;
194
-
195
- tags.forEach((tag) => {
196
- (fluid as any)[tag] = makeFluid(tag);
197
- });
@@ -1,294 +0,0 @@
1
- import {
2
- useRef,
3
- useMemo,
4
- useLayoutEffect,
5
- createElement,
6
- forwardRef,
7
- RefObject,
8
- } from 'react';
9
-
10
- import { SpringAnimation } from '../controllers/SpringAnimation';
11
- import { TimingAnimation } from '../controllers/TimingAnimation';
12
- import {
13
- ExtrapolateConfig,
14
- canInterpolate,
15
- interpolateNumbers,
16
- } from '../interpolation/Interpolation';
17
- import { getTransform, isTransformKey } from './transforms';
18
- import {
19
- isDefined,
20
- getCleanProps,
21
- getCssValue,
22
- camelCaseToKebabCase,
23
- isFluidValue,
24
- } from '../helpers';
25
- import { FluidValue } from '../controllers/FluidValue';
26
-
27
- import type { ResultType, FluidValueConfig, Length } from '../types/animation';
28
- import type { FluidProps, WrappedComponentOrTag } from '../types/fluid';
29
-
30
- /**
31
- * Higher-order component to make any component animatable.
32
- *
33
- * This function takes a React component or an HTML tag and returns a new component
34
- * that can smoothly transition between states using fluid animations. It enhances
35
- * the user experience by adding dynamic and engaging animations to the wrapped component.
36
- *
37
- * @param WrapperComponent - The React component or HTML tag to be wrapped with animation functionality.
38
- * @returns - A new component with added animation capabilities.
39
- *
40
- * The returned component uses fluid animations to smoothly transition between different
41
- * states. It supports both style and prop animations, handling transforms and other
42
- * properties seamlessly. The component ensures that animations are efficiently applied
43
- * and updated based on the current state and configuration of fluid values.
44
- *
45
- * @example
46
- * const AnimatedDiv = makeFluid('div');
47
- *
48
- * const MyComponent = () => {
49
- * const opacity = useAnimatedValue(1)
50
- * return (
51
- * <AnimatedDiv style={{ opacity: opacity.value }}>
52
- * Hello, world!
53
- * </AnimatedDiv>
54
- * )};
55
- */
56
- export function makeFluid<C extends WrappedComponentOrTag>(
57
- WrapperComponent: C
58
- ) {
59
- return forwardRef((givenProps: FluidProps<C>, givenRef: any) => {
60
- const instanceRef = useRef<any>(null);
61
-
62
- const transformStyleRef = useRef<Record<string, Length>>({});
63
-
64
- const { fluids, nonFluids } = useMemo(() => {
65
- const { style, ...props } = givenProps;
66
- const fluidStyle = getFluids('style', style);
67
- const fluidProps = getFluids('props', props);
68
-
69
- return {
70
- fluids: [...fluidStyle.fluids, ...fluidProps.fluids],
71
- nonFluids: [...fluidStyle.nonFluids, ...fluidProps.nonFluids],
72
- };
73
- }, [givenProps]);
74
-
75
- const applyAnimationValues = ({
76
- isTransform,
77
- propertyType,
78
- property,
79
- value,
80
- }: {
81
- isTransform: boolean;
82
- propertyType: 'style' | 'props';
83
- property: string;
84
- value: Length;
85
- }) => {
86
- if (!instanceRef.current) return;
87
-
88
- if (propertyType === 'style') {
89
- if (isTransform) {
90
- transformStyleRef.current[property] = value;
91
- instanceRef.current.style.transform = getTransform(
92
- transformStyleRef.current
93
- );
94
- } else {
95
- instanceRef.current.style[property] = getCssValue(property, value);
96
- }
97
- } else if (propertyType === 'props') {
98
- instanceRef.current.setAttribute(camelCaseToKebabCase(property), value);
99
- }
100
- };
101
-
102
- useLayoutEffect(() => {
103
- nonFluids.forEach(({ isTransform, property, propertyType, value }) =>
104
- applyAnimationValues({
105
- isTransform,
106
- property,
107
- propertyType,
108
- value: value as number,
109
- })
110
- );
111
- }, [nonFluids]);
112
-
113
- useLayoutEffect(() => {
114
- const subscribers: any = [];
115
-
116
- fluids.forEach((f) => {
117
- const { value: fluidValue, propertyType, property, isTransform } = f;
118
- const { _subscribe, _value, _currentValue, _config } = fluidValue;
119
-
120
- const interpolationOutputRange: string[] = [];
121
- const generateAnimation = animationObjectGenerator(_config);
122
- let animation: any = null;
123
-
124
- const onFrame = (value: number) => {
125
- _currentValue.current = value;
126
-
127
- const updatedValue: number = fluidValue.isInterpolation
128
- ? interpolateNumbers(
129
- value,
130
- fluidValue.interpolationConfig.inputRange,
131
- fluidValue.interpolationConfig.outputRange,
132
- fluidValue.interpolationConfig.extrapolateConfig
133
- )
134
- : value;
135
-
136
- applyAnimationValues({
137
- isTransform,
138
- propertyType,
139
- property,
140
- value: updatedValue,
141
- });
142
- };
143
-
144
- const onUpdate = (
145
- value: Length,
146
- config?: FluidValueConfig,
147
- callback?: (value: ResultType) => void
148
- ) => {
149
- if (canInterpolate(_value, value)) {
150
- const previousAnimation = animation;
151
-
152
- if (previousAnimation._value !== value) {
153
- animation.stop();
154
-
155
- animation = generateAnimation(
156
- previousAnimation._position,
157
- config
158
- );
159
- config?.onStart && config.onStart(previousAnimation._position);
160
-
161
- if (typeof value === 'string') {
162
- if (!interpolationOutputRange.includes(_value as string)) {
163
- interpolationOutputRange.push(_value as string);
164
- }
165
-
166
- if (!interpolationOutputRange.includes(value)) {
167
- interpolationOutputRange.push(value);
168
- }
169
-
170
- fluidValue.isInterpolation = true;
171
- fluidValue.interpolationConfig = {
172
- inputRange: interpolationOutputRange.map((_, i) => i),
173
- outputRange: interpolationOutputRange,
174
- };
175
- }
176
-
177
- animation.start({
178
- toValue:
179
- typeof value === 'string'
180
- ? interpolationOutputRange.indexOf(value)
181
- : value,
182
- onFrame,
183
- previousAnimation,
184
- onEnd: callback,
185
- });
186
- }
187
- } else {
188
- if (typeof value !== typeof _value) {
189
- throw new Error(
190
- `Cannot assign ${typeof value} to animated ${typeof _value}`
191
- );
192
- }
193
-
194
- applyAnimationValues({
195
- isTransform,
196
- propertyType,
197
- property,
198
- value,
199
- });
200
- }
201
- };
202
-
203
- animation = generateAnimation(typeof _value === 'string' ? 0 : _value);
204
- applyAnimationValues({
205
- isTransform,
206
- propertyType,
207
- property,
208
- value: _value,
209
- });
210
-
211
- const subscribe = _subscribe(onUpdate, property, Date.now());
212
- subscribers.push(subscribe);
213
- });
214
-
215
- return () => {
216
- subscribers.forEach((subscriber: () => void) => subscriber());
217
- };
218
- }, []);
219
-
220
- return createElement(WrapperComponent, {
221
- ...getCleanProps(givenProps),
222
- ref: combineRefs(instanceRef, givenRef),
223
- });
224
- });
225
- }
226
-
227
- function combineRefs(
228
- ...refs: Array<RefObject<any> | ((element: HTMLElement) => void)>
229
- ) {
230
- return function applyRef(element: HTMLElement) {
231
- refs.forEach((ref) => {
232
- if (!ref) return;
233
- if (typeof ref === 'function') {
234
- ref(element);
235
- return;
236
- }
237
- if ('current' in ref) (ref.current as HTMLElement) = element;
238
- });
239
- };
240
- }
241
-
242
- function animationObjectGenerator(defaultConfig?: FluidValueConfig) {
243
- return (value: number, config?: FluidValueConfig) => {
244
- const animationConfig = { ...defaultConfig, ...config };
245
-
246
- const Animation =
247
- isDefined(animationConfig?.duration) || animationConfig?.immediate
248
- ? TimingAnimation
249
- : SpringAnimation;
250
-
251
- return new Animation({
252
- initialPosition: value,
253
- config: animationConfig,
254
- });
255
- };
256
- }
257
-
258
- type InterpolationValue = {
259
- isInterpolation: boolean;
260
- interpolationConfig: {
261
- inputRange: Array<number>;
262
- outputRange: Array<number | string>;
263
- extrapolateConfig?: ExtrapolateConfig;
264
- };
265
- };
266
-
267
- type Fluid = {
268
- isTransform: boolean;
269
- property: string;
270
- propertyType: 'style' | 'props';
271
- value: FluidValue & InterpolationValue;
272
- };
273
-
274
- type NonFluid = Omit<Fluid, 'value'> & { value: unknown };
275
-
276
- function getFluids(
277
- propertyType: Fluid['propertyType'],
278
- props: Record<string, any> = {}
279
- ) {
280
- return Object.entries(props).reduce(
281
- (res, [property, value]) => {
282
- const isTransform = propertyType === 'style' && isTransformKey(property);
283
-
284
- if (isFluidValue(value)) {
285
- res.fluids.push({ isTransform, property, propertyType, value });
286
- } else {
287
- res.nonFluids.push({ isTransform, property, propertyType, value });
288
- }
289
-
290
- return res;
291
- },
292
- { fluids: [], nonFluids: [] } as { fluids: Fluid[]; nonFluids: NonFluid[] }
293
- );
294
- }
@@ -1,90 +0,0 @@
1
- export const styleTrasformKeys = [
2
- 'translate',
3
- 'translateX',
4
- 'translateY',
5
- 'translateZ',
6
- 'scale',
7
- 'scaleX',
8
- 'scaleY',
9
- 'scaleZ',
10
- 'rotate',
11
- 'rotateX',
12
- 'rotateY',
13
- 'rotateZ',
14
- 'skew',
15
- 'skewX',
16
- 'skewY',
17
- ] as const;
18
-
19
- function splitCSSValueAndUnit(value: string) {
20
- const valueMatch = value.match(/(-)?(\d+.)?\d+/g);
21
- const unitMatch = value.match(
22
- /px|rem|em|ex|%|cm|mm|in|pt|pc|ch|vh|vw|vmin|vmax/
23
- );
24
-
25
- return {
26
- value: Number(valueMatch),
27
- unit: unitMatch && unitMatch[0],
28
- };
29
- }
30
-
31
- // get unit of transform style property
32
- function getValueUnit(property: string, value: string) {
33
- let unit;
34
-
35
- const splitValue = splitCSSValueAndUnit(String(value)).value;
36
- const splitUnit = splitCSSValueAndUnit(String(value)).unit;
37
-
38
- // if string value is passed with unit then split it
39
- if (splitUnit) {
40
- return { value: splitValue, unit: splitUnit };
41
- }
42
-
43
- if (property.includes('translate') || property.includes('perspective')) {
44
- unit = 'px';
45
- } else if (property.includes('scale')) {
46
- unit = '';
47
- } else if (property.includes('rotate') || property.includes('skew')) {
48
- unit = 'deg';
49
- }
50
-
51
- return { value, unit };
52
- }
53
-
54
- function getTransformValueWithUnits(property: string, value: string) {
55
- const valueUnit = getValueUnit(property, value);
56
-
57
- if (
58
- property.includes('X') ||
59
- property.includes('Y') ||
60
- property.includes('Z') ||
61
- property.includes('perspective') ||
62
- property.includes('rotate') ||
63
- property.includes('skew')
64
- ) {
65
- // axis value
66
- return `${property}(${valueUnit.value}${valueUnit.unit})`;
67
- } else if (property.includes('translate') || property.indexOf('scale')) {
68
- // two parameter value
69
- return `${property}(${valueUnit.value}${valueUnit.unit}, ${valueUnit.value}${valueUnit.unit})`;
70
- } else {
71
- throw new Error(`Error! Property '${property}' cannot be transformed`);
72
- }
73
- }
74
-
75
- /**
76
- * getTransform function returns transform string from style object
77
- */
78
- export function getTransform(style: Record<string, any>) {
79
- return Object.entries(style)
80
- .map(([prop, value]) => getTransformValueWithUnits(prop, value))
81
- .reduce(
82
- (transform: string, value: string) => (transform += ` ${value}`),
83
- ''
84
- )
85
- .trim();
86
- }
87
-
88
- export function isTransformKey(key: string) {
89
- return (styleTrasformKeys as readonly string[]).includes(key);
90
- }
@@ -1,43 +0,0 @@
1
- import { useMemo, useCallback } from 'react';
2
-
3
- import { FluidValue } from '../controllers/FluidValue';
4
-
5
- import type {
6
- FluidValueConfig,
7
- Length,
8
- AssignValue,
9
- OnUpdateCallback,
10
- } from '../types/animation';
11
-
12
- /**
13
- * useFluidValue
14
- *
15
- * @param value - initial value
16
- * @param config - the config object for `FluidValue`
17
- */
18
- export const useFluidValue = (
19
- value: Length,
20
- config?: FluidValueConfig
21
- ): [
22
- FluidValue,
23
- (
24
- updateValue: AssignValue,
25
- config?: FluidValueConfig,
26
- callback?: OnUpdateCallback
27
- ) => void
28
- ] => {
29
- const fluid = useMemo(() => new FluidValue(value, config), []);
30
-
31
- const setFluid = useCallback(
32
- (
33
- updateValue: AssignValue,
34
- config?: FluidValueConfig,
35
- callback?: OnUpdateCallback
36
- ) => {
37
- fluid.setValue(updateValue, config, callback);
38
- },
39
- []
40
- );
41
-
42
- return [fluid, setFluid];
43
- };
@@ -1,58 +0,0 @@
1
- import { useState, useRef, useLayoutEffect } from 'react';
2
-
3
- import { useFluidValue } from './useFluidValue';
4
- import { FluidValue } from '../controllers/FluidValue';
5
-
6
- import type { AssignValue, FluidValueConfig } from '../types/animation';
7
-
8
- export interface UseMountConfig {
9
- from: number;
10
- enter: number | AssignValue;
11
- exit: number | AssignValue;
12
- enterConfig?: FluidValueConfig;
13
- exitConfig?: FluidValueConfig;
14
- config?: FluidValueConfig;
15
- }
16
-
17
- /**
18
- * `useMount`
19
- *
20
- * applies mounting and unmounting of a component according to state change
21
- * applying transitions
22
- *
23
- * @param state - boolean indicating mount state of a component
24
- * @param config - the config object `UseMountConfig`
25
- */
26
- export const useMount = (state: boolean, config: UseMountConfig) => {
27
- const [mounted, setMounted] = useState(false);
28
- const {
29
- from,
30
- enter,
31
- exit,
32
- config: innerConfig,
33
- enterConfig,
34
- exitConfig,
35
- } = useRef(config).current;
36
- const [animation, setAnimation] = useFluidValue(from, innerConfig);
37
-
38
- useLayoutEffect(() => {
39
- if (state) {
40
- setMounted(true);
41
- queueMicrotask(() => setAnimation(enter, enterConfig));
42
- } else {
43
- setAnimation(
44
- exit,
45
- exitConfig,
46
- function ({ finished }: { finished: boolean }) {
47
- if (finished) {
48
- setMounted(false);
49
- }
50
- }
51
- );
52
- }
53
- }, [state]);
54
-
55
- return (
56
- callback: (animation: FluidValue, mounted: boolean) => React.ReactNode
57
- ) => callback(animation, mounted);
58
- };