@pyreon/kinetic-presets 0.11.0 → 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/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`)