@pyreon/kinetic-presets 0.11.1 → 0.11.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.
- package/package.json +4 -3
- package/src/__tests__/factories.test.ts +263 -0
- package/src/__tests__/presets.test.ts +1065 -0
- package/src/__tests__/utils.test.ts +387 -0
- package/src/factories.ts +138 -0
- package/src/index.ts +137 -0
- package/src/presets.ts +825 -0
- package/src/types.ts +62 -0
- package/src/utils.ts +81 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** CSS properties as inline style object. Framework-agnostic alternative to React.CSSProperties. */
|
|
2
|
+
export type CSSProperties = Record<string, string | number | undefined>
|
|
3
|
+
|
|
4
|
+
export type Preset = {
|
|
5
|
+
enterStyle?: CSSProperties | undefined
|
|
6
|
+
enterToStyle?: CSSProperties | undefined
|
|
7
|
+
enterTransition?: string | undefined
|
|
8
|
+
leaveStyle?: CSSProperties | undefined
|
|
9
|
+
leaveToStyle?: CSSProperties | undefined
|
|
10
|
+
leaveTransition?: string | undefined
|
|
11
|
+
enter?: string | undefined
|
|
12
|
+
enterFrom?: string | undefined
|
|
13
|
+
enterTo?: string | undefined
|
|
14
|
+
leave?: string | undefined
|
|
15
|
+
leaveFrom?: string | undefined
|
|
16
|
+
leaveTo?: string | undefined
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type Direction = "up" | "down" | "left" | "right"
|
|
20
|
+
|
|
21
|
+
export type FadeOptions = {
|
|
22
|
+
direction?: Direction
|
|
23
|
+
distance?: number
|
|
24
|
+
duration?: number
|
|
25
|
+
leaveDuration?: number
|
|
26
|
+
easing?: string
|
|
27
|
+
leaveEasing?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type SlideOptions = {
|
|
31
|
+
direction?: Direction
|
|
32
|
+
distance?: number
|
|
33
|
+
duration?: number
|
|
34
|
+
leaveDuration?: number
|
|
35
|
+
easing?: string
|
|
36
|
+
leaveEasing?: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type ScaleOptions = {
|
|
40
|
+
from?: number
|
|
41
|
+
duration?: number
|
|
42
|
+
leaveDuration?: number
|
|
43
|
+
easing?: string
|
|
44
|
+
leaveEasing?: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type RotateOptions = {
|
|
48
|
+
degrees?: number
|
|
49
|
+
duration?: number
|
|
50
|
+
leaveDuration?: number
|
|
51
|
+
easing?: string
|
|
52
|
+
leaveEasing?: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type BlurOptions = {
|
|
56
|
+
amount?: number
|
|
57
|
+
scale?: number
|
|
58
|
+
duration?: number
|
|
59
|
+
leaveDuration?: number
|
|
60
|
+
easing?: string
|
|
61
|
+
leaveEasing?: string
|
|
62
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { CSSProperties, Preset } from "./types"
|
|
2
|
+
|
|
3
|
+
const mergeStyle = (
|
|
4
|
+
a: CSSProperties | undefined,
|
|
5
|
+
b: CSSProperties | undefined,
|
|
6
|
+
): CSSProperties | undefined => (b ? { ...a, ...b } : a)
|
|
7
|
+
|
|
8
|
+
const concatClass = (a: string | undefined, b: string | undefined): string | undefined =>
|
|
9
|
+
b ? (a ? `${a} ${b}` : b) : a
|
|
10
|
+
|
|
11
|
+
const mergeStyles = (result: Preset, p: Preset): void => {
|
|
12
|
+
result.enterStyle = mergeStyle(result.enterStyle, p.enterStyle)
|
|
13
|
+
result.enterToStyle = mergeStyle(result.enterToStyle, p.enterToStyle)
|
|
14
|
+
result.leaveStyle = mergeStyle(result.leaveStyle, p.leaveStyle)
|
|
15
|
+
result.leaveToStyle = mergeStyle(result.leaveToStyle, p.leaveToStyle)
|
|
16
|
+
if (p.enterTransition) result.enterTransition = p.enterTransition
|
|
17
|
+
if (p.leaveTransition) result.leaveTransition = p.leaveTransition
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const mergeClasses = (result: Preset, p: Preset): void => {
|
|
21
|
+
result.enter = concatClass(result.enter, p.enter)
|
|
22
|
+
result.enterFrom = concatClass(result.enterFrom, p.enterFrom)
|
|
23
|
+
result.enterTo = concatClass(result.enterTo, p.enterTo)
|
|
24
|
+
result.leave = concatClass(result.leave, p.leave)
|
|
25
|
+
result.leaveFrom = concatClass(result.leaveFrom, p.leaveFrom)
|
|
26
|
+
result.leaveTo = concatClass(result.leaveTo, p.leaveTo)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const compose = (...items: Preset[]): Preset => {
|
|
30
|
+
const result: Preset = {}
|
|
31
|
+
for (const p of items) {
|
|
32
|
+
mergeStyles(result, p)
|
|
33
|
+
mergeClasses(result, p)
|
|
34
|
+
}
|
|
35
|
+
return result
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const withDuration = (preset: Preset, enterMs: number, leaveMs?: number): Preset => ({
|
|
39
|
+
...preset,
|
|
40
|
+
enterTransition: replaceDuration(preset.enterTransition ?? "", `${enterMs}ms`),
|
|
41
|
+
leaveTransition: replaceDuration(preset.leaveTransition ?? "", `${leaveMs ?? enterMs}ms`),
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
export const withEasing = (preset: Preset, enterEasing: string, leaveEasing?: string): Preset => ({
|
|
45
|
+
...preset,
|
|
46
|
+
enterTransition: replaceEasing(preset.enterTransition ?? "", enterEasing),
|
|
47
|
+
leaveTransition: replaceEasing(preset.leaveTransition ?? "", leaveEasing ?? enterEasing),
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
export const withDelay = (preset: Preset, enterDelayMs: number, leaveDelayMs?: number): Preset => ({
|
|
51
|
+
...preset,
|
|
52
|
+
enterTransition: addDelay(preset.enterTransition ?? "", `${enterDelayMs}ms`),
|
|
53
|
+
leaveTransition: addDelay(preset.leaveTransition ?? "", `${leaveDelayMs ?? enterDelayMs}ms`),
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
export const reverse = (preset: Preset): Preset => ({
|
|
57
|
+
enterStyle: preset.leaveStyle,
|
|
58
|
+
enterToStyle: preset.leaveToStyle,
|
|
59
|
+
enterTransition: preset.leaveTransition,
|
|
60
|
+
leaveStyle: preset.enterStyle,
|
|
61
|
+
leaveToStyle: preset.enterToStyle,
|
|
62
|
+
leaveTransition: preset.enterTransition,
|
|
63
|
+
enter: preset.leave,
|
|
64
|
+
enterFrom: preset.leaveFrom,
|
|
65
|
+
enterTo: preset.leaveTo,
|
|
66
|
+
leave: preset.enter,
|
|
67
|
+
leaveFrom: preset.enterFrom,
|
|
68
|
+
leaveTo: preset.enterTo,
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
const replaceDuration = (transition: string, newDuration: string): string =>
|
|
72
|
+
transition.replace(/\d{1,10}(?:ms|s)/, newDuration)
|
|
73
|
+
|
|
74
|
+
const replaceEasing = (transition: string, newEasing: string): string =>
|
|
75
|
+
transition.replace(
|
|
76
|
+
/(?:ease-in-out|ease-in|ease-out|ease|linear|cubic-bezier\([^)]{1,100}\))\s*$/,
|
|
77
|
+
newEasing,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
const addDelay = (transition: string, delay: string): string =>
|
|
81
|
+
transition.replace(/(\d{1,10}(?:ms|s))(\s)/, `$1 ${delay}$2`)
|