motion-presets-kit 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.
@@ -0,0 +1,167 @@
1
+ import { basePresetSchema, warn, shouldReduceMotion, buildTransition } from './chunk-PFZKSPJW.js';
2
+ import { z } from 'zod';
3
+
4
+ var clipRevealOptionsSchema = basePresetSchema.extend({
5
+ direction: z.enum(["up", "down", "left", "right"]).default("up"),
6
+ scale: z.number().optional()
7
+ });
8
+
9
+ // src/presets/clip-reveal.ts
10
+ var REVEALED_CLIP = "inset(0% 0% 0% 0%)";
11
+ var CLIP_INSETS = {
12
+ up: "inset(100% 0% 0% 0%)",
13
+ down: "inset(0% 0% 100% 0%)",
14
+ left: "inset(0% 100% 0% 0%)",
15
+ right: "inset(0% 0% 0% 100%)"
16
+ };
17
+ function clipReveal(options = {}) {
18
+ const parsed = clipRevealOptionsSchema.safeParse(options);
19
+ if (!parsed.success) {
20
+ warn(
21
+ `Opciones inv\xE1lidas en clipReveal(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
22
+ );
23
+ }
24
+ const opts = parsed.success ? parsed.data : clipRevealOptionsSchema.parse({});
25
+ const {
26
+ direction,
27
+ scale: scale2,
28
+ duration,
29
+ delay,
30
+ ease,
31
+ spring,
32
+ excludeDelay,
33
+ reducedMotion
34
+ } = opts;
35
+ const hasScale = scale2 !== void 0;
36
+ if (shouldReduceMotion(reducedMotion)) {
37
+ const final = { clipPath: REVEALED_CLIP };
38
+ if (hasScale) final.scale = 1;
39
+ return { initial: final, animate: final };
40
+ }
41
+ const transition = buildTransition({
42
+ duration,
43
+ delay,
44
+ ease,
45
+ spring,
46
+ excludeDelay
47
+ });
48
+ const initial = { clipPath: CLIP_INSETS[direction] };
49
+ if (hasScale) initial.scale = scale2;
50
+ const animate = {
51
+ clipPath: REVEALED_CLIP,
52
+ willChange: hasScale ? "clip-path, transform" : "clip-path",
53
+ transition
54
+ };
55
+ if (hasScale) animate.scale = 1;
56
+ return { initial, animate };
57
+ }
58
+ var scaleOptionsSchema = basePresetSchema.extend({
59
+ from: z.number().default(0.8)
60
+ });
61
+
62
+ // src/presets/scale.ts
63
+ function scale(options = {}) {
64
+ const parsed = scaleOptionsSchema.safeParse(options);
65
+ if (!parsed.success) {
66
+ warn(
67
+ `Opciones inv\xE1lidas en scale(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
68
+ );
69
+ }
70
+ const opts = parsed.success ? parsed.data : scaleOptionsSchema.parse({});
71
+ const { from, duration, delay, ease, spring, excludeDelay, reducedMotion } = opts;
72
+ if (shouldReduceMotion(reducedMotion)) {
73
+ return {
74
+ initial: { opacity: 1, scale: 1 },
75
+ animate: { opacity: 1, scale: 1 }
76
+ };
77
+ }
78
+ const transition = buildTransition({
79
+ duration,
80
+ delay,
81
+ ease,
82
+ spring,
83
+ excludeDelay
84
+ });
85
+ return {
86
+ initial: { opacity: 0, scale: from },
87
+ animate: {
88
+ opacity: 1,
89
+ scale: 1,
90
+ willChange: "transform, opacity",
91
+ transition
92
+ }
93
+ };
94
+ }
95
+ var slideOptionsSchema = basePresetSchema.extend({
96
+ direction: z.enum(["up", "down", "left", "right"]).default("right"),
97
+ distance: z.number().default(100)
98
+ });
99
+
100
+ // src/presets/slide.ts
101
+ var SLIDE_AXIS = {
102
+ up: "y",
103
+ down: "y",
104
+ left: "x",
105
+ right: "x"
106
+ };
107
+ var SLIDE_SIGN = {
108
+ up: 1,
109
+ down: -1,
110
+ left: 1,
111
+ right: -1
112
+ };
113
+ function slide(options = {}) {
114
+ const parsed = slideOptionsSchema.safeParse(options);
115
+ if (!parsed.success) {
116
+ warn(
117
+ `Opciones inv\xE1lidas en slide(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
118
+ );
119
+ }
120
+ const opts = parsed.success ? parsed.data : slideOptionsSchema.parse({});
121
+ const {
122
+ direction,
123
+ distance,
124
+ duration,
125
+ delay,
126
+ ease,
127
+ spring,
128
+ excludeDelay,
129
+ reducedMotion
130
+ } = opts;
131
+ if (shouldReduceMotion(reducedMotion)) {
132
+ return {
133
+ initial: { x: 0, y: 0 },
134
+ animate: { x: 0, y: 0 }
135
+ };
136
+ }
137
+ const transition = buildTransition({
138
+ duration,
139
+ delay,
140
+ ease,
141
+ spring,
142
+ excludeDelay
143
+ });
144
+ const offset = SLIDE_SIGN[direction] * distance;
145
+ if (SLIDE_AXIS[direction] === "x") {
146
+ return {
147
+ initial: { x: offset },
148
+ animate: {
149
+ x: 0,
150
+ willChange: "transform",
151
+ transition
152
+ }
153
+ };
154
+ }
155
+ return {
156
+ initial: { y: offset },
157
+ animate: {
158
+ y: 0,
159
+ willChange: "transform",
160
+ transition
161
+ }
162
+ };
163
+ }
164
+
165
+ export { clipReveal, clipRevealOptionsSchema, scale, scaleOptionsSchema, slide, slideOptionsSchema };
166
+ //# sourceMappingURL=chunk-ONXBTJWT.js.map
167
+ //# sourceMappingURL=chunk-ONXBTJWT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/clip-reveal.ts","../src/presets/clip-reveal.ts","../src/schemas/scale.ts","../src/presets/scale.ts","../src/schemas/slide.ts","../src/presets/slide.ts"],"names":["scale","z"],"mappings":"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","file":"chunk-ONXBTJWT.js","sourcesContent":["import { z } from \"zod\";\nimport { basePresetSchema } from \"./base\";\n\nexport const clipRevealOptionsSchema = basePresetSchema.extend({\n\tdirection: z.enum([\"up\", \"down\", \"left\", \"right\"]).default(\"up\"),\n\tscale: z.number().optional(),\n});\n\nexport type ClipRevealOptions = z.input<typeof clipRevealOptionsSchema>;\nexport type ResolvedClipRevealOptions = z.output<\n\ttypeof clipRevealOptionsSchema\n>;\n","import type { TargetAndTransition, Variants } from \"motion/react\";\nimport {\n\ttype ClipRevealOptions,\n\tclipRevealOptionsSchema,\n} from \"../schemas/clip-reveal\";\nimport { buildTransition } from \"../utils/easing\";\nimport { shouldReduceMotion } from \"../utils/reduced-motion\";\nimport { warn } from \"../utils/warn\";\n\nconst REVEALED_CLIP = \"inset(0% 0% 0% 0%)\";\n\nconst CLIP_INSETS = {\n\tup: \"inset(100% 0% 0% 0%)\",\n\tdown: \"inset(0% 0% 100% 0%)\",\n\tleft: \"inset(0% 100% 0% 0%)\",\n\tright: \"inset(0% 0% 0% 100%)\",\n} as const;\n\n/**\n * Reveal cinematográfico animando `clipPath` (con escala opcional).\n * Función pura que retorna `Variants`.\n */\nexport function clipReveal(options: ClipRevealOptions = {}): Variants {\n\tconst parsed = clipRevealOptionsSchema.safeParse(options);\n\tif (!parsed.success) {\n\t\twarn(\n\t\t\t`Opciones inválidas en clipReveal(): ${parsed.error.message}. Se usarán los valores por defecto.`,\n\t\t);\n\t}\n\tconst opts = parsed.success ? parsed.data : clipRevealOptionsSchema.parse({});\n\n\tconst {\n\t\tdirection,\n\t\tscale,\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t\treducedMotion,\n\t} = opts;\n\tconst hasScale = scale !== undefined;\n\n\tif (shouldReduceMotion(reducedMotion)) {\n\t\tconst final: TargetAndTransition = { clipPath: REVEALED_CLIP };\n\t\tif (hasScale) final.scale = 1;\n\t\treturn { initial: final, animate: final };\n\t}\n\n\tconst transition = buildTransition({\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t});\n\n\tconst initial: TargetAndTransition = { clipPath: CLIP_INSETS[direction] };\n\tif (hasScale) initial.scale = scale;\n\n\tconst animate: TargetAndTransition = {\n\t\tclipPath: REVEALED_CLIP,\n\t\twillChange: hasScale ? \"clip-path, transform\" : \"clip-path\",\n\t\ttransition,\n\t};\n\tif (hasScale) animate.scale = 1;\n\n\treturn { initial, animate };\n}\n","import { z } from \"zod\";\nimport { basePresetSchema } from \"./base\";\n\nexport const scaleOptionsSchema = basePresetSchema.extend({\n\tfrom: z.number().default(0.8),\n});\n\nexport type ScaleOptions = z.input<typeof scaleOptionsSchema>;\nexport type ResolvedScaleOptions = z.output<typeof scaleOptionsSchema>;\n","import type { Variants } from \"motion/react\";\nimport { type ScaleOptions, scaleOptionsSchema } from \"../schemas/scale\";\nimport { buildTransition } from \"../utils/easing\";\nimport { shouldReduceMotion } from \"../utils/reduced-motion\";\nimport { warn } from \"../utils/warn\";\n\n/**\n * Entrada con escala (`from` → `1`) junto con `opacity: 0 → 1`.\n * Función pura que retorna `Variants`.\n */\nexport function scale(options: ScaleOptions = {}): Variants {\n\tconst parsed = scaleOptionsSchema.safeParse(options);\n\tif (!parsed.success) {\n\t\twarn(\n\t\t\t`Opciones inválidas en scale(): ${parsed.error.message}. Se usarán los valores por defecto.`,\n\t\t);\n\t}\n\tconst opts = parsed.success ? parsed.data : scaleOptionsSchema.parse({});\n\n\tconst { from, duration, delay, ease, spring, excludeDelay, reducedMotion } =\n\t\topts;\n\n\tif (shouldReduceMotion(reducedMotion)) {\n\t\treturn {\n\t\t\tinitial: { opacity: 1, scale: 1 },\n\t\t\tanimate: { opacity: 1, scale: 1 },\n\t\t};\n\t}\n\n\tconst transition = buildTransition({\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t});\n\n\treturn {\n\t\tinitial: { opacity: 0, scale: from },\n\t\tanimate: {\n\t\t\topacity: 1,\n\t\t\tscale: 1,\n\t\t\twillChange: \"transform, opacity\",\n\t\t\ttransition,\n\t\t},\n\t};\n}\n","import { z } from \"zod\";\nimport { basePresetSchema } from \"./base\";\n\nexport const slideOptionsSchema = basePresetSchema.extend({\n\tdirection: z.enum([\"up\", \"down\", \"left\", \"right\"]).default(\"right\"),\n\tdistance: z.number().default(100),\n});\n\nexport type SlideOptions = z.input<typeof slideOptionsSchema>;\nexport type ResolvedSlideOptions = z.output<typeof slideOptionsSchema>;\n","import type { TargetAndTransition, Variants } from \"motion/react\";\nimport { type SlideOptions, slideOptionsSchema } from \"../schemas/slide\";\nimport { buildTransition } from \"../utils/easing\";\nimport { shouldReduceMotion } from \"../utils/reduced-motion\";\nimport { warn } from \"../utils/warn\";\n\nconst SLIDE_AXIS = {\n\tup: \"y\",\n\tdown: \"y\",\n\tleft: \"x\",\n\tright: \"x\",\n} as const;\n\nconst SLIDE_SIGN = {\n\tup: 1,\n\tdown: -1,\n\tleft: 1,\n\tright: -1,\n} as const;\n\n/**\n * Desplazamiento puro (sin `opacity`) desde una dirección.\n * Función pura que retorna `Variants`.\n */\nexport function slide(options: SlideOptions = {}): Variants {\n\tconst parsed = slideOptionsSchema.safeParse(options);\n\tif (!parsed.success) {\n\t\twarn(\n\t\t\t`Opciones inválidas en slide(): ${parsed.error.message}. Se usarán los valores por defecto.`,\n\t\t);\n\t}\n\tconst opts = parsed.success ? parsed.data : slideOptionsSchema.parse({});\n\n\tconst {\n\t\tdirection,\n\t\tdistance,\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t\treducedMotion,\n\t} = opts;\n\n\tif (shouldReduceMotion(reducedMotion)) {\n\t\treturn {\n\t\t\tinitial: { x: 0, y: 0 },\n\t\t\tanimate: { x: 0, y: 0 },\n\t\t};\n\t}\n\n\tconst transition = buildTransition({\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t});\n\tconst offset = SLIDE_SIGN[direction] * distance;\n\n\tif (SLIDE_AXIS[direction] === \"x\") {\n\t\treturn {\n\t\t\tinitial: { x: offset } satisfies TargetAndTransition,\n\t\t\tanimate: {\n\t\t\t\tx: 0,\n\t\t\t\twillChange: \"transform\",\n\t\t\t\ttransition,\n\t\t\t} satisfies TargetAndTransition,\n\t\t};\n\t}\n\n\treturn {\n\t\tinitial: { y: offset } satisfies TargetAndTransition,\n\t\tanimate: {\n\t\t\ty: 0,\n\t\t\twillChange: \"transform\",\n\t\t\ttransition,\n\t\t} satisfies TargetAndTransition,\n\t};\n}\n"]}
@@ -0,0 +1,164 @@
1
+ import { z } from 'zod';
2
+ import { stagger } from 'motion/react';
3
+
4
+ // src/schemas/base.ts
5
+
6
+ // src/utils/easing.ts
7
+ var DEFAULT_EASE = [0.16, 1, 0.3, 1];
8
+ function buildTransition(options) {
9
+ const { duration, delay, ease, spring, excludeDelay } = options;
10
+ const base = spring ? { type: "spring", ...spring } : { duration, ease };
11
+ return excludeDelay ? base : { ...base, delay };
12
+ }
13
+
14
+ // src/schemas/base.ts
15
+ var EASING_NAMES = /* @__PURE__ */ new Set([
16
+ "linear",
17
+ "easeIn",
18
+ "easeOut",
19
+ "easeInOut",
20
+ "circIn",
21
+ "circOut",
22
+ "circInOut",
23
+ "backIn",
24
+ "backOut",
25
+ "backInOut",
26
+ "anticipate"
27
+ ]);
28
+ function isEasing(value) {
29
+ if (typeof value === "function") return true;
30
+ if (typeof value === "string") return EASING_NAMES.has(value);
31
+ return Array.isArray(value) && value.length === 4 && value.every((item) => typeof item === "number");
32
+ }
33
+ function isSpringOptions(value) {
34
+ return typeof value === "object" && value !== null && !Array.isArray(value);
35
+ }
36
+ var basePresetSchema = z.object({
37
+ duration: z.number().default(0.5),
38
+ delay: z.number().default(0),
39
+ ease: z.custom(isEasing).default(DEFAULT_EASE),
40
+ spring: z.custom(isSpringOptions).optional(),
41
+ excludeDelay: z.boolean().default(false),
42
+ reducedMotion: z.boolean().default(true)
43
+ });
44
+ var fadeOptionsSchema = basePresetSchema.extend({
45
+ direction: z.enum(["up", "down", "left", "right", "none"]).default("up"),
46
+ distance: z.number().default(60),
47
+ blur: z.number().default(0),
48
+ scale: z.number().default(1)
49
+ });
50
+
51
+ // src/utils/reduced-motion.ts
52
+ function shouldReduceMotion(reducedMotion = true) {
53
+ if (!reducedMotion) return false;
54
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
55
+ return false;
56
+ }
57
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
58
+ }
59
+
60
+ // src/utils/warn.ts
61
+ var PREFIX = "[motion-presets-kit]";
62
+ function isProduction() {
63
+ return typeof process !== "undefined" && !!process.env && process.env.NODE_ENV === "production";
64
+ }
65
+ function warn(message) {
66
+ if (isProduction()) return;
67
+ if (typeof console !== "undefined" && typeof console.warn === "function") {
68
+ console.warn(`${PREFIX} ${message}`);
69
+ }
70
+ }
71
+
72
+ // src/presets/fade.ts
73
+ var FADE_OFFSETS = {
74
+ up: (distance) => ({ y: distance }),
75
+ down: (distance) => ({ y: -distance }),
76
+ left: (distance) => ({ x: distance }),
77
+ right: (distance) => ({ x: -distance }),
78
+ none: () => ({})
79
+ };
80
+ function fade(options = {}) {
81
+ const parsed = fadeOptionsSchema.safeParse(options);
82
+ if (!parsed.success) {
83
+ warn(
84
+ `Opciones inv\xE1lidas en fade(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
85
+ );
86
+ }
87
+ const opts = parsed.success ? parsed.data : fadeOptionsSchema.parse({});
88
+ const {
89
+ direction,
90
+ distance,
91
+ duration,
92
+ delay,
93
+ ease,
94
+ spring,
95
+ excludeDelay,
96
+ blur,
97
+ scale,
98
+ reducedMotion
99
+ } = opts;
100
+ if (shouldReduceMotion(reducedMotion)) {
101
+ return {
102
+ initial: { opacity: 1, x: 0, y: 0 },
103
+ animate: { opacity: 1, x: 0, y: 0 }
104
+ };
105
+ }
106
+ const transition = buildTransition({
107
+ duration,
108
+ delay,
109
+ ease,
110
+ spring,
111
+ excludeDelay
112
+ });
113
+ const hasBlur = blur > 0;
114
+ const initial = {
115
+ opacity: 0,
116
+ ...FADE_OFFSETS[direction](distance)
117
+ };
118
+ if (scale !== 1) initial.scale = scale;
119
+ if (hasBlur) initial.filter = `blur(${blur}px)`;
120
+ const animate = {
121
+ opacity: 1,
122
+ x: 0,
123
+ y: 0,
124
+ willChange: hasBlur ? "transform, opacity, filter" : "transform, opacity",
125
+ transition
126
+ };
127
+ if (scale !== 1) animate.scale = 1;
128
+ if (hasBlur) animate.filter = "blur(0px)";
129
+ return { initial, animate };
130
+ }
131
+ var parentVariantsSchema = z.object({
132
+ delayChildren: z.number().default(0),
133
+ startDelay: z.number().default(0),
134
+ reducedMotion: z.boolean().default(true)
135
+ });
136
+ function parentVariants(options = {}) {
137
+ const parsed = parentVariantsSchema.safeParse(options);
138
+ if (!parsed.success) {
139
+ warn(
140
+ `Opciones inv\xE1lidas en parentVariants(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
141
+ );
142
+ }
143
+ const opts = parsed.success ? parsed.data : parentVariantsSchema.parse({});
144
+ const { delayChildren, startDelay, reducedMotion } = opts;
145
+ if (shouldReduceMotion(reducedMotion)) {
146
+ return {
147
+ initial: { opacity: 1 },
148
+ animate: { opacity: 1 }
149
+ };
150
+ }
151
+ return {
152
+ initial: { opacity: 0 },
153
+ animate: {
154
+ opacity: 1,
155
+ transition: {
156
+ delayChildren: stagger(delayChildren, { startDelay })
157
+ }
158
+ }
159
+ };
160
+ }
161
+
162
+ export { basePresetSchema, buildTransition, fade, fadeOptionsSchema, parentVariants, parentVariantsSchema, shouldReduceMotion, warn };
163
+ //# sourceMappingURL=chunk-PFZKSPJW.js.map
164
+ //# sourceMappingURL=chunk-PFZKSPJW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/easing.ts","../src/schemas/base.ts","../src/schemas/fade.ts","../src/utils/reduced-motion.ts","../src/utils/warn.ts","../src/presets/fade.ts","../src/schemas/parent-variants.ts","../src/presets/parent-variants.ts"],"names":["z"],"mappings":"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","file":"chunk-PFZKSPJW.js","sourcesContent":["import type { Easing, SpringOptions, Transition } from \"motion/react\";\n\n/** Curva de easing por defecto de todos los presets. */\nexport const DEFAULT_EASE: Easing = [0.16, 1, 0.3, 1];\n\nexport interface BuildTransitionOptions {\n\tduration: number;\n\tdelay: number;\n\tease: Easing;\n\tspring?: Omit<SpringOptions, \"keyframes\">;\n\texcludeDelay: boolean;\n}\n\n/**\n * Construye la transición compartida por los presets.\n * - Si `spring` está definido, sobrescribe `duration` y `ease`.\n * - Si `excludeDelay` es `true`, omite `delay` (compatibilidad con stagger del padre).\n */\nexport function buildTransition(options: BuildTransitionOptions): Transition {\n\tconst { duration, delay, ease, spring, excludeDelay } = options;\n\n\tconst base: Transition = spring\n\t\t? { type: \"spring\", ...spring }\n\t\t: { duration, ease };\n\n\treturn excludeDelay ? base : { ...base, delay };\n}\n","import type { Easing, SpringOptions } from \"motion/react\";\nimport { z } from \"zod\";\nimport { DEFAULT_EASE } from \"../utils/easing\";\n\nconst EASING_NAMES = new Set([\n\t\"linear\",\n\t\"easeIn\",\n\t\"easeOut\",\n\t\"easeInOut\",\n\t\"circIn\",\n\t\"circOut\",\n\t\"circInOut\",\n\t\"backIn\",\n\t\"backOut\",\n\t\"backInOut\",\n\t\"anticipate\",\n]);\n\n/** Valida un `Easing` de motion: nombre, bezier de 4 números o función. */\nfunction isEasing(value: unknown): value is Easing {\n\tif (typeof value === \"function\") return true;\n\tif (typeof value === \"string\") return EASING_NAMES.has(value);\n\treturn (\n\t\tArray.isArray(value) &&\n\t\tvalue.length === 4 &&\n\t\tvalue.every((item) => typeof item === \"number\")\n\t);\n}\n\n/** Valida un objeto de opciones de spring (sin `keyframes`). */\nfunction isSpringOptions(\n\tvalue: unknown,\n): value is Omit<SpringOptions, \"keyframes\"> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Opciones compartidas por todos los presets que retornan variants. */\nexport const basePresetSchema = z.object({\n\tduration: z.number().default(0.5),\n\tdelay: z.number().default(0),\n\tease: z.custom<Easing>(isEasing).default(DEFAULT_EASE),\n\tspring: z\n\t\t.custom<Omit<SpringOptions, \"keyframes\">>(isSpringOptions)\n\t\t.optional(),\n\texcludeDelay: z.boolean().default(false),\n\treducedMotion: z.boolean().default(true),\n});\n\nexport type BasePresetOptions = z.input<typeof basePresetSchema>;\nexport type ResolvedBasePresetOptions = z.output<typeof basePresetSchema>;\n","import { z } from \"zod\";\nimport { basePresetSchema } from \"./base\";\n\nexport const fadeOptionsSchema = basePresetSchema.extend({\n\tdirection: z.enum([\"up\", \"down\", \"left\", \"right\", \"none\"]).default(\"up\"),\n\tdistance: z.number().default(60),\n\tblur: z.number().default(0),\n\tscale: z.number().default(1),\n});\n\nexport type FadeOptions = z.input<typeof fadeOptionsSchema>;\nexport type ResolvedFadeOptions = z.output<typeof fadeOptionsSchema>;\n","/**\n * `true` cuando el usuario prefiere movimiento reducido y la opción está activa.\n * Devuelve `false` en entornos sin `window.matchMedia` (SSR, Node).\n */\nexport function shouldReduceMotion(reducedMotion = true): boolean {\n\tif (!reducedMotion) return false;\n\tif (\n\t\ttypeof window === \"undefined\" ||\n\t\ttypeof window.matchMedia !== \"function\"\n\t) {\n\t\treturn false;\n\t}\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n","const PREFIX = \"[motion-presets-kit]\";\n\nfunction isProduction(): boolean {\n\treturn (\n\t\ttypeof process !== \"undefined\" &&\n\t\t!!process.env &&\n\t\tprocess.env.NODE_ENV === \"production\"\n\t);\n}\n\n/** Aviso de desarrollo con prefijo de la librería (se silencia en producción). */\nexport function warn(message: string): void {\n\tif (isProduction()) return;\n\tif (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\n\t\tconsole.warn(`${PREFIX} ${message}`);\n\t}\n}\n","import type { TargetAndTransition, Variants } from \"motion/react\";\nimport { type FadeOptions, fadeOptionsSchema } from \"../schemas/fade\";\nimport { buildTransition } from \"../utils/easing\";\nimport { shouldReduceMotion } from \"../utils/reduced-motion\";\nimport { warn } from \"../utils/warn\";\n\nconst FADE_OFFSETS = {\n\tup: (distance: number) => ({ y: distance }),\n\tdown: (distance: number) => ({ y: -distance }),\n\tleft: (distance: number) => ({ x: distance }),\n\tright: (distance: number) => ({ x: -distance }),\n\tnone: () => ({}),\n} as const;\n\n/**\n * Fade de entrada con dirección, blur y escala opcionales.\n * Función pura que retorna `Variants` para usar en `motion`/`motion/react`.\n */\nexport function fade(options: FadeOptions = {}): Variants {\n\tconst parsed = fadeOptionsSchema.safeParse(options);\n\tif (!parsed.success) {\n\t\twarn(\n\t\t\t`Opciones inválidas en fade(): ${parsed.error.message}. Se usarán los valores por defecto.`,\n\t\t);\n\t}\n\tconst opts = parsed.success ? parsed.data : fadeOptionsSchema.parse({});\n\n\tconst {\n\t\tdirection,\n\t\tdistance,\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t\tblur,\n\t\tscale,\n\t\treducedMotion,\n\t} = opts;\n\n\tif (shouldReduceMotion(reducedMotion)) {\n\t\treturn {\n\t\t\tinitial: { opacity: 1, x: 0, y: 0 },\n\t\t\tanimate: { opacity: 1, x: 0, y: 0 },\n\t\t};\n\t}\n\n\tconst transition = buildTransition({\n\t\tduration,\n\t\tdelay,\n\t\tease,\n\t\tspring,\n\t\texcludeDelay,\n\t});\n\tconst hasBlur = blur > 0;\n\n\tconst initial: TargetAndTransition = {\n\t\topacity: 0,\n\t\t...FADE_OFFSETS[direction](distance),\n\t};\n\tif (scale !== 1) initial.scale = scale;\n\tif (hasBlur) initial.filter = `blur(${blur}px)`;\n\n\tconst animate: TargetAndTransition = {\n\t\topacity: 1,\n\t\tx: 0,\n\t\ty: 0,\n\t\twillChange: hasBlur ? \"transform, opacity, filter\" : \"transform, opacity\",\n\t\ttransition,\n\t};\n\tif (scale !== 1) animate.scale = 1;\n\tif (hasBlur) animate.filter = \"blur(0px)\";\n\n\treturn { initial, animate };\n}\n","import { z } from \"zod\";\n\nexport const parentVariantsSchema = z.object({\n\tdelayChildren: z.number().default(0),\n\tstartDelay: z.number().default(0),\n\treducedMotion: z.boolean().default(true),\n});\n\nexport type ParentVariantsOptions = z.input<typeof parentVariantsSchema>;\nexport type ResolvedParentVariantsOptions = z.output<\n\ttypeof parentVariantsSchema\n>;\n","import { stagger, type Variants } from \"motion/react\";\nimport {\n\ttype ParentVariantsOptions,\n\tparentVariantsSchema,\n} from \"../schemas/parent-variants\";\nimport { shouldReduceMotion } from \"../utils/reduced-motion\";\nimport { warn } from \"../utils/warn\";\n\n/**\n * Variants para el contenedor padre: anima hijos en cascada con `stagger()`.\n * Los hijos deben usar `excludeDelay: true` para heredar el stagger (CL-001).\n */\nexport function parentVariants(options: ParentVariantsOptions = {}): Variants {\n\tconst parsed = parentVariantsSchema.safeParse(options);\n\tif (!parsed.success) {\n\t\twarn(\n\t\t\t`Opciones inválidas en parentVariants(): ${parsed.error.message}. Se usarán los valores por defecto.`,\n\t\t);\n\t}\n\tconst opts = parsed.success ? parsed.data : parentVariantsSchema.parse({});\n\n\tconst { delayChildren, startDelay, reducedMotion } = opts;\n\n\tif (shouldReduceMotion(reducedMotion)) {\n\t\treturn {\n\t\t\tinitial: { opacity: 1 },\n\t\t\tanimate: { opacity: 1 },\n\t\t};\n\t}\n\n\treturn {\n\t\tinitial: { opacity: 0 },\n\t\tanimate: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tdelayChildren: stagger(delayChildren, { startDelay }),\n\t\t\t},\n\t\t},\n\t};\n}\n"]}