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.
- package/LICENSE +21 -0
- package/README.md +174 -0
- package/bin/cli.mjs +115 -0
- package/bin/skill.mjs +94 -0
- package/dist/chunk-GU3ZCMLK.js +537 -0
- package/dist/chunk-GU3ZCMLK.js.map +1 -0
- package/dist/chunk-ONXBTJWT.js +167 -0
- package/dist/chunk-ONXBTJWT.js.map +1 -0
- package/dist/chunk-PFZKSPJW.js +164 -0
- package/dist/chunk-PFZKSPJW.js.map +1 -0
- package/dist/components.cjs +719 -0
- package/dist/components.cjs.map +1 -0
- package/dist/components.d.cts +199 -0
- package/dist/components.d.ts +199 -0
- package/dist/components.js +4 -0
- package/dist/components.js.map +1 -0
- package/dist/index-DtNOkqyg.d.cts +112 -0
- package/dist/index-DtNOkqyg.d.ts +112 -0
- package/dist/index.cjs +890 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/presets.cjs +334 -0
- package/dist/presets.cjs.map +1 -0
- package/dist/presets.d.cts +3 -0
- package/dist/presets.d.ts +3 -0
- package/dist/presets.js +4 -0
- package/dist/presets.js.map +1 -0
- package/package.json +117 -0
- package/scripts/postinstall.mjs +75 -0
- package/skill/motion-presets-kit/SKILL.md +221 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,890 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
var react$1 = require('motion/react');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
// src/schemas/counter.ts
|
|
9
|
+
var counterOptionsSchema = zod.z.object({
|
|
10
|
+
from: zod.z.number().default(0),
|
|
11
|
+
to: zod.z.number().default(100),
|
|
12
|
+
decimals: zod.z.number().int().min(0).default(0),
|
|
13
|
+
prefix: zod.z.string().default(""),
|
|
14
|
+
suffix: zod.z.string().default(""),
|
|
15
|
+
separator: zod.z.string().default(","),
|
|
16
|
+
format: zod.z.custom(
|
|
17
|
+
(value) => typeof value === "function"
|
|
18
|
+
).optional(),
|
|
19
|
+
duration: zod.z.number().default(1),
|
|
20
|
+
reducedMotion: zod.z.boolean().default(true)
|
|
21
|
+
});
|
|
22
|
+
var dragConstraintsSchema = zod.z.object({
|
|
23
|
+
top: zod.z.number().optional(),
|
|
24
|
+
right: zod.z.number().optional(),
|
|
25
|
+
bottom: zod.z.number().optional(),
|
|
26
|
+
left: zod.z.number().optional()
|
|
27
|
+
});
|
|
28
|
+
var draggableOptionsSchema = zod.z.object({
|
|
29
|
+
axis: zod.z.enum(["x", "y", "both"]).default("both"),
|
|
30
|
+
bounds: zod.z.union([zod.z.literal("parent"), zod.z.literal("document"), dragConstraintsSchema]).optional(),
|
|
31
|
+
snapToGrid: zod.z.tuple([zod.z.number(), zod.z.number()]).optional(),
|
|
32
|
+
dragElastic: zod.z.union([zod.z.number(), zod.z.boolean()]).optional(),
|
|
33
|
+
dragMomentum: zod.z.boolean().optional()
|
|
34
|
+
});
|
|
35
|
+
var marqueeOptionsSchema = zod.z.object({
|
|
36
|
+
speed: zod.z.number().positive().default(20),
|
|
37
|
+
direction: zod.z.enum(["left", "right"]).default("left"),
|
|
38
|
+
pauseOnHover: zod.z.boolean().default(true),
|
|
39
|
+
gap: zod.z.string().default("2rem"),
|
|
40
|
+
reducedMotion: zod.z.boolean().default(true)
|
|
41
|
+
});
|
|
42
|
+
var textAnimateOptionsSchema = zod.z.object({
|
|
43
|
+
by: zod.z.enum(["word", "letter"]).default("word"),
|
|
44
|
+
type: zod.z.enum([
|
|
45
|
+
"blurIn",
|
|
46
|
+
"slideUp",
|
|
47
|
+
"slideDown",
|
|
48
|
+
"slideLeft",
|
|
49
|
+
"slideRight",
|
|
50
|
+
"typeWriter"
|
|
51
|
+
]).default("slideUp"),
|
|
52
|
+
duration: zod.z.number().default(0.4),
|
|
53
|
+
startDelay: zod.z.number().default(0),
|
|
54
|
+
highlight: zod.z.array(zod.z.string()).default([]),
|
|
55
|
+
highlightClassName: zod.z.string().default(""),
|
|
56
|
+
reducedMotion: zod.z.boolean().default(true)
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// src/components/counter-utils.ts
|
|
60
|
+
function formatCounterValue(value, options = {}) {
|
|
61
|
+
const {
|
|
62
|
+
decimals = 0,
|
|
63
|
+
prefix = "",
|
|
64
|
+
suffix = "",
|
|
65
|
+
separator = ",",
|
|
66
|
+
format
|
|
67
|
+
} = options;
|
|
68
|
+
if (format) return `${prefix}${format(value)}${suffix}`;
|
|
69
|
+
const fixed = Math.abs(value).toFixed(decimals);
|
|
70
|
+
const [integer = "", fraction] = fixed.split(".");
|
|
71
|
+
const requestGrouped = separator !== "" && separator !== "none";
|
|
72
|
+
const grouped = requestGrouped ? integer.replace(/\B(?=(\d{3})+(?!\d))/g, separator) : integer;
|
|
73
|
+
const sign = value < 0 ? "-" : "";
|
|
74
|
+
const decimalPart = fraction ? `.${fraction}` : "";
|
|
75
|
+
return `${prefix}${sign}${grouped}${decimalPart}${suffix}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// src/utils/warn.ts
|
|
79
|
+
var PREFIX = "[motion-presets-kit]";
|
|
80
|
+
function isProduction() {
|
|
81
|
+
return typeof process !== "undefined" && !!process.env && process.env.NODE_ENV === "production";
|
|
82
|
+
}
|
|
83
|
+
function warn(message) {
|
|
84
|
+
if (isProduction()) return;
|
|
85
|
+
if (typeof console !== "undefined" && typeof console.warn === "function") {
|
|
86
|
+
console.warn(`${PREFIX} ${message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/components/draggable-utils.ts
|
|
91
|
+
function hasInvalidBounds(bounds) {
|
|
92
|
+
if (bounds.top !== void 0 && bounds.bottom !== void 0 && bounds.top > bounds.bottom) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (bounds.left !== void 0 && bounds.right !== void 0 && bounds.left > bounds.right) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
function resolveDragConstraints(bounds) {
|
|
101
|
+
if (bounds === void 0) return null;
|
|
102
|
+
if (bounds === "parent" || bounds === "document") return bounds;
|
|
103
|
+
return hasInvalidBounds(bounds) ? null : bounds;
|
|
104
|
+
}
|
|
105
|
+
function getDragConstraintsProp(resolved, containerRef) {
|
|
106
|
+
if (resolved === "parent" || resolved === "document") return containerRef;
|
|
107
|
+
return resolved ?? void 0;
|
|
108
|
+
}
|
|
109
|
+
function buildSnapModifier(snapToGrid) {
|
|
110
|
+
if (!snapToGrid) return void 0;
|
|
111
|
+
const [gridX, gridY] = snapToGrid;
|
|
112
|
+
const grid = gridX === 0 ? gridY : gridY === 0 ? gridX : gridX;
|
|
113
|
+
if (grid === 0) return void 0;
|
|
114
|
+
return (value) => Math.round(value / grid) * grid;
|
|
115
|
+
}
|
|
116
|
+
function Draggable({
|
|
117
|
+
children,
|
|
118
|
+
axis = "both",
|
|
119
|
+
bounds,
|
|
120
|
+
snapToGrid,
|
|
121
|
+
dragElastic,
|
|
122
|
+
dragMomentum,
|
|
123
|
+
dragControls,
|
|
124
|
+
onDragStart,
|
|
125
|
+
onDrag,
|
|
126
|
+
onDragEnd,
|
|
127
|
+
className
|
|
128
|
+
}) {
|
|
129
|
+
const parsed = draggableOptionsSchema.safeParse({
|
|
130
|
+
axis,
|
|
131
|
+
bounds,
|
|
132
|
+
snapToGrid,
|
|
133
|
+
dragElastic,
|
|
134
|
+
dragMomentum
|
|
135
|
+
});
|
|
136
|
+
if (!parsed.success) {
|
|
137
|
+
warn(`Opciones inv\xE1lidas en Draggable: ${parsed.error.message}`);
|
|
138
|
+
}
|
|
139
|
+
const data = parsed.success ? parsed.data : draggableOptionsSchema.parse({});
|
|
140
|
+
if (typeof data.bounds === "object" && data.bounds !== null && hasInvalidBounds(data.bounds)) {
|
|
141
|
+
warn(
|
|
142
|
+
"bounds inv\xE1lidos en Draggable (top > bottom o left > right). Se ignoran los l\xEDmites (CL-007)."
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
const resolved = resolveDragConstraints(data.bounds);
|
|
146
|
+
const containerMode = resolved === "parent" || resolved === "document" ? resolved : null;
|
|
147
|
+
const elementRef = react.useRef(null);
|
|
148
|
+
const containerRef = react.useRef(null);
|
|
149
|
+
react.useEffect(() => {
|
|
150
|
+
const element = elementRef.current;
|
|
151
|
+
if (!element || containerMode === null) return;
|
|
152
|
+
containerRef.current = containerMode === "parent" ? element.parentElement : element.ownerDocument?.documentElement ?? null;
|
|
153
|
+
}, [containerMode]);
|
|
154
|
+
const drag = data.axis === "both" ? true : data.axis;
|
|
155
|
+
const dragConstraints = getDragConstraintsProp(resolved, containerRef);
|
|
156
|
+
const modifyTarget = buildSnapModifier(data.snapToGrid);
|
|
157
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
158
|
+
react$1.motion.div,
|
|
159
|
+
{
|
|
160
|
+
ref: elementRef,
|
|
161
|
+
drag,
|
|
162
|
+
dragConstraints,
|
|
163
|
+
dragElastic: data.dragElastic,
|
|
164
|
+
dragMomentum: data.dragMomentum,
|
|
165
|
+
dragTransition: modifyTarget ? { modifyTarget } : void 0,
|
|
166
|
+
dragControls,
|
|
167
|
+
onDragStart,
|
|
168
|
+
onDrag,
|
|
169
|
+
onDragEnd,
|
|
170
|
+
className,
|
|
171
|
+
children
|
|
172
|
+
}
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/utils/reduced-motion.ts
|
|
177
|
+
function shouldReduceMotion(reducedMotion = true) {
|
|
178
|
+
if (!reducedMotion) return false;
|
|
179
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// src/components/hooks/useCounter.ts
|
|
186
|
+
function useCounter(ref, options = {}) {
|
|
187
|
+
const parsed = counterOptionsSchema.safeParse(options);
|
|
188
|
+
if (!parsed.success) {
|
|
189
|
+
warn(`Opciones inv\xE1lidas en useCounter: ${parsed.error.message}`);
|
|
190
|
+
}
|
|
191
|
+
const config = parsed.success ? parsed.data : counterOptionsSchema.parse({});
|
|
192
|
+
const { from, to, duration, reducedMotion } = config;
|
|
193
|
+
const formatOptions = react.useMemo(
|
|
194
|
+
() => ({
|
|
195
|
+
decimals: config.decimals,
|
|
196
|
+
prefix: config.prefix,
|
|
197
|
+
suffix: config.suffix,
|
|
198
|
+
separator: config.separator,
|
|
199
|
+
format: config.format
|
|
200
|
+
}),
|
|
201
|
+
[
|
|
202
|
+
config.decimals,
|
|
203
|
+
config.prefix,
|
|
204
|
+
config.suffix,
|
|
205
|
+
config.separator,
|
|
206
|
+
config.format
|
|
207
|
+
]
|
|
208
|
+
);
|
|
209
|
+
const motionValue = react$1.useMotionValue(from);
|
|
210
|
+
const [value, setValue] = react.useState(from);
|
|
211
|
+
const writeValue = react.useCallback(
|
|
212
|
+
(next) => {
|
|
213
|
+
const element = ref.current;
|
|
214
|
+
if (element) {
|
|
215
|
+
element.textContent = formatCounterValue(next, formatOptions);
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
[ref, formatOptions]
|
|
219
|
+
);
|
|
220
|
+
react$1.useMotionValueEvent(motionValue, "change", (latest) => {
|
|
221
|
+
setValue(latest);
|
|
222
|
+
writeValue(latest);
|
|
223
|
+
});
|
|
224
|
+
react.useEffect(() => {
|
|
225
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
226
|
+
motionValue.set(to);
|
|
227
|
+
setValue(to);
|
|
228
|
+
writeValue(to);
|
|
229
|
+
}
|
|
230
|
+
}, [motionValue, to, reducedMotion, writeValue]);
|
|
231
|
+
const start = react.useCallback(() => {
|
|
232
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
233
|
+
motionValue.set(to);
|
|
234
|
+
setValue(to);
|
|
235
|
+
writeValue(to);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
motionValue.set(from);
|
|
239
|
+
setValue(from);
|
|
240
|
+
react$1.animate(motionValue, to, {
|
|
241
|
+
duration,
|
|
242
|
+
ease: [0.16, 1, 0.3, 1]
|
|
243
|
+
});
|
|
244
|
+
}, [motionValue, from, to, duration, reducedMotion, writeValue]);
|
|
245
|
+
const reset = react.useCallback(() => {
|
|
246
|
+
motionValue.set(from);
|
|
247
|
+
setValue(from);
|
|
248
|
+
writeValue(from);
|
|
249
|
+
}, [motionValue, from, writeValue]);
|
|
250
|
+
return { value, start, reset };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// src/components/marquee-utils.ts
|
|
254
|
+
function buildMarqueeKeyframes(options) {
|
|
255
|
+
const { id, direction, gap, speed, pauseOnHover } = options;
|
|
256
|
+
const animationName = `motion-marquee-${id}`;
|
|
257
|
+
const listClassName = `motion-marquee-list-${id}`;
|
|
258
|
+
const trackClassName = `motion-marquee-track-${id}`;
|
|
259
|
+
const from = direction === "left" ? "0" : `calc(-100% - ${gap})`;
|
|
260
|
+
const to = direction === "left" ? `calc(-100% - ${gap})` : "0";
|
|
261
|
+
const css = [
|
|
262
|
+
`@keyframes ${animationName}{from{transform:translateX(${from})}to{transform:translateX(${to})}}`,
|
|
263
|
+
`.${listClassName}{display:flex;align-items:center;flex-shrink:0;min-width:100%;gap:${gap};animation:${animationName} ${speed}s linear infinite;will-change:transform;backface-visibility:hidden}`,
|
|
264
|
+
`.${trackClassName}{display:flex;gap:${gap}}`,
|
|
265
|
+
pauseOnHover ? `.${trackClassName}:hover .${listClassName}{animation-play-state:paused}` : ""
|
|
266
|
+
].filter(Boolean).join("");
|
|
267
|
+
return { animationName, listClassName, trackClassName, css };
|
|
268
|
+
}
|
|
269
|
+
var MASK_STYLE = {
|
|
270
|
+
maskImage: "linear-gradient(to right, transparent, black 15%, black 85%, transparent)",
|
|
271
|
+
WebkitMaskImage: "linear-gradient(to right, transparent, black 15%, black 85%, transparent)"
|
|
272
|
+
};
|
|
273
|
+
var BASE_STYLE = {
|
|
274
|
+
display: "flex",
|
|
275
|
+
overflow: "hidden",
|
|
276
|
+
width: "100%"
|
|
277
|
+
};
|
|
278
|
+
var Marquee = react.memo(function Marquee2({
|
|
279
|
+
children,
|
|
280
|
+
speed = 20,
|
|
281
|
+
direction = "left",
|
|
282
|
+
pauseOnHover = true,
|
|
283
|
+
gap = "2rem",
|
|
284
|
+
className,
|
|
285
|
+
reducedMotion = true
|
|
286
|
+
}) {
|
|
287
|
+
const rawId = react.useId();
|
|
288
|
+
const id = rawId.replace(/[^a-zA-Z0-9_-]/g, "");
|
|
289
|
+
const duplicateRef = react.useRef(null);
|
|
290
|
+
react.useEffect(() => {
|
|
291
|
+
const element = duplicateRef.current;
|
|
292
|
+
if (element) element.inert = true;
|
|
293
|
+
}, []);
|
|
294
|
+
const parsed = marqueeOptionsSchema.safeParse({
|
|
295
|
+
speed,
|
|
296
|
+
direction,
|
|
297
|
+
pauseOnHover,
|
|
298
|
+
gap,
|
|
299
|
+
reducedMotion
|
|
300
|
+
});
|
|
301
|
+
if (!parsed.success) {
|
|
302
|
+
warn(`Opciones inv\xE1lidas en Marquee: ${parsed.error.message}`);
|
|
303
|
+
}
|
|
304
|
+
const config = parsed.success ? parsed.data : marqueeOptionsSchema.parse({});
|
|
305
|
+
const keyframes = react.useMemo(
|
|
306
|
+
() => buildMarqueeKeyframes({
|
|
307
|
+
id,
|
|
308
|
+
direction: config.direction,
|
|
309
|
+
gap: config.gap,
|
|
310
|
+
speed: config.speed,
|
|
311
|
+
pauseOnHover: config.pauseOnHover
|
|
312
|
+
}),
|
|
313
|
+
[id, config.direction, config.gap, config.speed, config.pauseOnHover]
|
|
314
|
+
);
|
|
315
|
+
const paused = shouldReduceMotion(config.reducedMotion);
|
|
316
|
+
const listStyle = {
|
|
317
|
+
display: "flex",
|
|
318
|
+
alignItems: "center",
|
|
319
|
+
flexShrink: 0,
|
|
320
|
+
minWidth: "100%",
|
|
321
|
+
gap: config.gap,
|
|
322
|
+
...paused ? {} : {
|
|
323
|
+
animation: `${keyframes.animationName} ${config.speed}s linear infinite`,
|
|
324
|
+
willChange: "transform",
|
|
325
|
+
backfaceVisibility: "hidden"
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
329
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: keyframes.css }),
|
|
330
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
331
|
+
"section",
|
|
332
|
+
{
|
|
333
|
+
"aria-label": "Contenido en desplazamiento continuo",
|
|
334
|
+
className: className ? `${keyframes.trackClassName} ${className}` : keyframes.trackClassName,
|
|
335
|
+
style: { ...BASE_STYLE, ...MASK_STYLE },
|
|
336
|
+
children: [
|
|
337
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: keyframes.listClassName, style: listStyle, children }),
|
|
338
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
339
|
+
"div",
|
|
340
|
+
{
|
|
341
|
+
ref: duplicateRef,
|
|
342
|
+
className: keyframes.listClassName,
|
|
343
|
+
style: listStyle,
|
|
344
|
+
"aria-hidden": "true",
|
|
345
|
+
children
|
|
346
|
+
}
|
|
347
|
+
)
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
)
|
|
351
|
+
] });
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// src/utils/easing.ts
|
|
355
|
+
var DEFAULT_EASE = [0.16, 1, 0.3, 1];
|
|
356
|
+
function buildTransition(options) {
|
|
357
|
+
const { duration, delay, ease, spring, excludeDelay } = options;
|
|
358
|
+
const base = spring ? { type: "spring", ...spring } : { duration, ease };
|
|
359
|
+
return excludeDelay ? base : { ...base, delay };
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// src/schemas/base.ts
|
|
363
|
+
var EASING_NAMES = /* @__PURE__ */ new Set([
|
|
364
|
+
"linear",
|
|
365
|
+
"easeIn",
|
|
366
|
+
"easeOut",
|
|
367
|
+
"easeInOut",
|
|
368
|
+
"circIn",
|
|
369
|
+
"circOut",
|
|
370
|
+
"circInOut",
|
|
371
|
+
"backIn",
|
|
372
|
+
"backOut",
|
|
373
|
+
"backInOut",
|
|
374
|
+
"anticipate"
|
|
375
|
+
]);
|
|
376
|
+
function isEasing(value) {
|
|
377
|
+
if (typeof value === "function") return true;
|
|
378
|
+
if (typeof value === "string") return EASING_NAMES.has(value);
|
|
379
|
+
return Array.isArray(value) && value.length === 4 && value.every((item) => typeof item === "number");
|
|
380
|
+
}
|
|
381
|
+
function isSpringOptions(value) {
|
|
382
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
383
|
+
}
|
|
384
|
+
var basePresetSchema = zod.z.object({
|
|
385
|
+
duration: zod.z.number().default(0.5),
|
|
386
|
+
delay: zod.z.number().default(0),
|
|
387
|
+
ease: zod.z.custom(isEasing).default(DEFAULT_EASE),
|
|
388
|
+
spring: zod.z.custom(isSpringOptions).optional(),
|
|
389
|
+
excludeDelay: zod.z.boolean().default(false),
|
|
390
|
+
reducedMotion: zod.z.boolean().default(true)
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
// src/schemas/fade.ts
|
|
394
|
+
var fadeOptionsSchema = basePresetSchema.extend({
|
|
395
|
+
direction: zod.z.enum(["up", "down", "left", "right", "none"]).default("up"),
|
|
396
|
+
distance: zod.z.number().default(60),
|
|
397
|
+
blur: zod.z.number().default(0),
|
|
398
|
+
scale: zod.z.number().default(1)
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// src/presets/fade.ts
|
|
402
|
+
var FADE_OFFSETS = {
|
|
403
|
+
up: (distance) => ({ y: distance }),
|
|
404
|
+
down: (distance) => ({ y: -distance }),
|
|
405
|
+
left: (distance) => ({ x: distance }),
|
|
406
|
+
right: (distance) => ({ x: -distance }),
|
|
407
|
+
none: () => ({})
|
|
408
|
+
};
|
|
409
|
+
function fade(options = {}) {
|
|
410
|
+
const parsed = fadeOptionsSchema.safeParse(options);
|
|
411
|
+
if (!parsed.success) {
|
|
412
|
+
warn(
|
|
413
|
+
`Opciones inv\xE1lidas en fade(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
const opts = parsed.success ? parsed.data : fadeOptionsSchema.parse({});
|
|
417
|
+
const {
|
|
418
|
+
direction,
|
|
419
|
+
distance,
|
|
420
|
+
duration,
|
|
421
|
+
delay,
|
|
422
|
+
ease,
|
|
423
|
+
spring,
|
|
424
|
+
excludeDelay,
|
|
425
|
+
blur,
|
|
426
|
+
scale: scale2,
|
|
427
|
+
reducedMotion
|
|
428
|
+
} = opts;
|
|
429
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
430
|
+
return {
|
|
431
|
+
initial: { opacity: 1, x: 0, y: 0 },
|
|
432
|
+
animate: { opacity: 1, x: 0, y: 0 }
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
const transition = buildTransition({
|
|
436
|
+
duration,
|
|
437
|
+
delay,
|
|
438
|
+
ease,
|
|
439
|
+
spring,
|
|
440
|
+
excludeDelay
|
|
441
|
+
});
|
|
442
|
+
const hasBlur = blur > 0;
|
|
443
|
+
const initial = {
|
|
444
|
+
opacity: 0,
|
|
445
|
+
...FADE_OFFSETS[direction](distance)
|
|
446
|
+
};
|
|
447
|
+
if (scale2 !== 1) initial.scale = scale2;
|
|
448
|
+
if (hasBlur) initial.filter = `blur(${blur}px)`;
|
|
449
|
+
const animate2 = {
|
|
450
|
+
opacity: 1,
|
|
451
|
+
x: 0,
|
|
452
|
+
y: 0,
|
|
453
|
+
willChange: hasBlur ? "transform, opacity, filter" : "transform, opacity",
|
|
454
|
+
transition
|
|
455
|
+
};
|
|
456
|
+
if (scale2 !== 1) animate2.scale = 1;
|
|
457
|
+
if (hasBlur) animate2.filter = "blur(0px)";
|
|
458
|
+
return { initial, animate: animate2 };
|
|
459
|
+
}
|
|
460
|
+
var parentVariantsSchema = zod.z.object({
|
|
461
|
+
delayChildren: zod.z.number().default(0),
|
|
462
|
+
startDelay: zod.z.number().default(0),
|
|
463
|
+
reducedMotion: zod.z.boolean().default(true)
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
// src/presets/parent-variants.ts
|
|
467
|
+
function parentVariants(options = {}) {
|
|
468
|
+
const parsed = parentVariantsSchema.safeParse(options);
|
|
469
|
+
if (!parsed.success) {
|
|
470
|
+
warn(
|
|
471
|
+
`Opciones inv\xE1lidas en parentVariants(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
const opts = parsed.success ? parsed.data : parentVariantsSchema.parse({});
|
|
475
|
+
const { delayChildren, startDelay, reducedMotion } = opts;
|
|
476
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
477
|
+
return {
|
|
478
|
+
initial: { opacity: 1 },
|
|
479
|
+
animate: { opacity: 1 }
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
return {
|
|
483
|
+
initial: { opacity: 0 },
|
|
484
|
+
animate: {
|
|
485
|
+
opacity: 1,
|
|
486
|
+
transition: {
|
|
487
|
+
delayChildren: react$1.stagger(delayChildren, { startDelay })
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// src/components/text-animate-utils.ts
|
|
494
|
+
var TAG_RE = /<[^>]*>/g;
|
|
495
|
+
var TOKEN_SOURCE = "<[^>]*>|\\s+|[^<\\s]+";
|
|
496
|
+
function tokenize(text) {
|
|
497
|
+
const tokens = [];
|
|
498
|
+
const regex = new RegExp(TOKEN_SOURCE, "g");
|
|
499
|
+
let match = regex.exec(text);
|
|
500
|
+
while (match !== null) {
|
|
501
|
+
const value = match[0];
|
|
502
|
+
if (value.startsWith("<")) tokens.push({ kind: "tag", value });
|
|
503
|
+
else if (/^\s+$/.test(value)) tokens.push({ kind: "space", value });
|
|
504
|
+
else tokens.push({ kind: "text", value });
|
|
505
|
+
match = regex.exec(text);
|
|
506
|
+
}
|
|
507
|
+
return tokens;
|
|
508
|
+
}
|
|
509
|
+
function groupWords(tokens) {
|
|
510
|
+
const units = [];
|
|
511
|
+
let pending = "";
|
|
512
|
+
let current = null;
|
|
513
|
+
const flush = () => {
|
|
514
|
+
if (current !== null) {
|
|
515
|
+
units.push(current);
|
|
516
|
+
current = null;
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
for (const token of tokens) {
|
|
520
|
+
if (token.kind === "space") {
|
|
521
|
+
flush();
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
if (token.kind === "tag") {
|
|
525
|
+
if (current !== null) current += token.value;
|
|
526
|
+
else pending += token.value;
|
|
527
|
+
continue;
|
|
528
|
+
}
|
|
529
|
+
flush();
|
|
530
|
+
current = pending + token.value;
|
|
531
|
+
pending = "";
|
|
532
|
+
}
|
|
533
|
+
flush();
|
|
534
|
+
if (pending) units.push(pending);
|
|
535
|
+
return units;
|
|
536
|
+
}
|
|
537
|
+
function groupLetters(tokens) {
|
|
538
|
+
const units = [];
|
|
539
|
+
let pending = "";
|
|
540
|
+
for (const token of tokens) {
|
|
541
|
+
if (token.kind === "space") {
|
|
542
|
+
for (const char of token.value) units.push(char);
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
if (token.kind === "tag") {
|
|
546
|
+
if (token.value.startsWith("</") && units.length > 0) {
|
|
547
|
+
const last = units.length - 1;
|
|
548
|
+
units[last] = `${units[last] ?? ""}${token.value}`;
|
|
549
|
+
} else {
|
|
550
|
+
pending += token.value;
|
|
551
|
+
}
|
|
552
|
+
continue;
|
|
553
|
+
}
|
|
554
|
+
const chars = [...token.value];
|
|
555
|
+
chars.forEach((char, index) => {
|
|
556
|
+
units.push((index === 0 ? pending : "") + char);
|
|
557
|
+
pending = "";
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
if (pending) units.push(pending);
|
|
561
|
+
return units;
|
|
562
|
+
}
|
|
563
|
+
function splitText(text, by = "word") {
|
|
564
|
+
const tokens = tokenize(text);
|
|
565
|
+
return by === "letter" ? groupLetters(tokens) : groupWords(tokens);
|
|
566
|
+
}
|
|
567
|
+
function getHighlightRanges(text, highlights) {
|
|
568
|
+
const plain = text.replace(TAG_RE, "");
|
|
569
|
+
const lower = plain.toLowerCase();
|
|
570
|
+
const ranges = [];
|
|
571
|
+
for (const highlight of highlights) {
|
|
572
|
+
if (!highlight) continue;
|
|
573
|
+
const needle = highlight.toLowerCase();
|
|
574
|
+
let from = 0;
|
|
575
|
+
while (from <= lower.length - needle.length) {
|
|
576
|
+
const index = lower.indexOf(needle, from);
|
|
577
|
+
if (index === -1) break;
|
|
578
|
+
ranges.push([index, index + needle.length]);
|
|
579
|
+
from = index + needle.length;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
return ranges;
|
|
583
|
+
}
|
|
584
|
+
function isWordHighlighted(word, highlights) {
|
|
585
|
+
const plain = word.replace(TAG_RE, "").toLowerCase();
|
|
586
|
+
return highlights.some(
|
|
587
|
+
(highlight) => highlight !== "" && plain.includes(highlight.toLowerCase())
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
function getAnimationParams(type = "slideUp") {
|
|
591
|
+
switch (type) {
|
|
592
|
+
case "blurIn":
|
|
593
|
+
return { direction: "none", distance: 0, blur: 8 };
|
|
594
|
+
case "slideDown":
|
|
595
|
+
return { direction: "down", distance: 20, blur: 4 };
|
|
596
|
+
case "slideLeft":
|
|
597
|
+
return { direction: "left", distance: 20, blur: 4 };
|
|
598
|
+
case "slideRight":
|
|
599
|
+
return { direction: "right", distance: 20, blur: 4 };
|
|
600
|
+
case "typeWriter":
|
|
601
|
+
return { direction: "none", distance: 0, blur: 0 };
|
|
602
|
+
default:
|
|
603
|
+
return { direction: "up", distance: 20, blur: 4 };
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
var componentCache = /* @__PURE__ */ new Map();
|
|
607
|
+
function getMotionComponent(tag) {
|
|
608
|
+
const key = String(tag);
|
|
609
|
+
let component = componentCache.get(key);
|
|
610
|
+
if (!component) {
|
|
611
|
+
component = react$1.motion.create(tag);
|
|
612
|
+
componentCache.set(key, component);
|
|
613
|
+
}
|
|
614
|
+
return component;
|
|
615
|
+
}
|
|
616
|
+
var SPAN_STYLE = { display: "inline-block", whiteSpace: "pre-wrap" };
|
|
617
|
+
var WORD_STYLE = { ...SPAN_STYLE, marginRight: "0.25em" };
|
|
618
|
+
function TextAnimate({
|
|
619
|
+
text,
|
|
620
|
+
as = "p",
|
|
621
|
+
by = "word",
|
|
622
|
+
type = "slideUp",
|
|
623
|
+
duration = 0.4,
|
|
624
|
+
startDelay = 0,
|
|
625
|
+
highlight = [],
|
|
626
|
+
highlightClassName = "",
|
|
627
|
+
reducedMotion = true,
|
|
628
|
+
...props
|
|
629
|
+
}) {
|
|
630
|
+
const parsed = textAnimateOptionsSchema.safeParse({
|
|
631
|
+
by,
|
|
632
|
+
type,
|
|
633
|
+
duration,
|
|
634
|
+
startDelay,
|
|
635
|
+
highlight,
|
|
636
|
+
highlightClassName,
|
|
637
|
+
reducedMotion
|
|
638
|
+
});
|
|
639
|
+
if (!parsed.success) {
|
|
640
|
+
warn(`Opciones inv\xE1lidas en TextAnimate: ${parsed.error.message}`);
|
|
641
|
+
}
|
|
642
|
+
const config = parsed.success ? parsed.data : textAnimateOptionsSchema.parse({});
|
|
643
|
+
const MotionWrapper = react.useMemo(() => getMotionComponent(as), [as]);
|
|
644
|
+
const units = react.useMemo(() => splitText(text, config.by), [text, config.by]);
|
|
645
|
+
const ranges = react.useMemo(
|
|
646
|
+
() => config.by === "letter" ? getHighlightRanges(text, config.highlight) : [],
|
|
647
|
+
[text, config.by, config.highlight]
|
|
648
|
+
);
|
|
649
|
+
const animationParams = react.useMemo(
|
|
650
|
+
() => getAnimationParams(config.type),
|
|
651
|
+
[config.type]
|
|
652
|
+
);
|
|
653
|
+
const parent = react.useMemo(
|
|
654
|
+
() => parentVariants({
|
|
655
|
+
delayChildren: config.type === "typeWriter" && config.by === "letter" ? 0.05 : 0.08,
|
|
656
|
+
startDelay: config.startDelay,
|
|
657
|
+
reducedMotion: config.reducedMotion
|
|
658
|
+
}),
|
|
659
|
+
[config.type, config.by, config.startDelay, config.reducedMotion]
|
|
660
|
+
);
|
|
661
|
+
const child = react.useMemo(
|
|
662
|
+
() => fade({
|
|
663
|
+
...animationParams,
|
|
664
|
+
excludeDelay: true,
|
|
665
|
+
duration: config.type === "typeWriter" ? 0.05 : config.duration,
|
|
666
|
+
reducedMotion: config.reducedMotion
|
|
667
|
+
}),
|
|
668
|
+
[animationParams, config.type, config.duration, config.reducedMotion]
|
|
669
|
+
);
|
|
670
|
+
const isWord = config.by === "word";
|
|
671
|
+
const itemStyle = isWord ? WORD_STYLE : SPAN_STYLE;
|
|
672
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
673
|
+
MotionWrapper,
|
|
674
|
+
{
|
|
675
|
+
variants: parent,
|
|
676
|
+
initial: "initial",
|
|
677
|
+
whileInView: "animate",
|
|
678
|
+
viewport: { once: true },
|
|
679
|
+
...props,
|
|
680
|
+
children: units.map((unit, index) => {
|
|
681
|
+
const highlighted = isWord ? isWordHighlighted(unit, config.highlight) : ranges.some(([start, end]) => index >= start && index < end);
|
|
682
|
+
const hasHtml = /<[^>]*>/.test(unit);
|
|
683
|
+
const key = `${index}-${unit}`;
|
|
684
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
685
|
+
react$1.motion.span,
|
|
686
|
+
{
|
|
687
|
+
variants: child,
|
|
688
|
+
className: highlighted ? config.highlightClassName : void 0,
|
|
689
|
+
style: itemStyle,
|
|
690
|
+
...hasHtml ? { dangerouslySetInnerHTML: { __html: unit } } : { children: unit === "" ? "\xA0" : unit }
|
|
691
|
+
},
|
|
692
|
+
key
|
|
693
|
+
);
|
|
694
|
+
})
|
|
695
|
+
}
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
var clipRevealOptionsSchema = basePresetSchema.extend({
|
|
699
|
+
direction: zod.z.enum(["up", "down", "left", "right"]).default("up"),
|
|
700
|
+
scale: zod.z.number().optional()
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
// src/presets/clip-reveal.ts
|
|
704
|
+
var REVEALED_CLIP = "inset(0% 0% 0% 0%)";
|
|
705
|
+
var CLIP_INSETS = {
|
|
706
|
+
up: "inset(100% 0% 0% 0%)",
|
|
707
|
+
down: "inset(0% 0% 100% 0%)",
|
|
708
|
+
left: "inset(0% 100% 0% 0%)",
|
|
709
|
+
right: "inset(0% 0% 0% 100%)"
|
|
710
|
+
};
|
|
711
|
+
function clipReveal(options = {}) {
|
|
712
|
+
const parsed = clipRevealOptionsSchema.safeParse(options);
|
|
713
|
+
if (!parsed.success) {
|
|
714
|
+
warn(
|
|
715
|
+
`Opciones inv\xE1lidas en clipReveal(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
|
|
716
|
+
);
|
|
717
|
+
}
|
|
718
|
+
const opts = parsed.success ? parsed.data : clipRevealOptionsSchema.parse({});
|
|
719
|
+
const {
|
|
720
|
+
direction,
|
|
721
|
+
scale: scale2,
|
|
722
|
+
duration,
|
|
723
|
+
delay,
|
|
724
|
+
ease,
|
|
725
|
+
spring,
|
|
726
|
+
excludeDelay,
|
|
727
|
+
reducedMotion
|
|
728
|
+
} = opts;
|
|
729
|
+
const hasScale = scale2 !== void 0;
|
|
730
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
731
|
+
const final = { clipPath: REVEALED_CLIP };
|
|
732
|
+
if (hasScale) final.scale = 1;
|
|
733
|
+
return { initial: final, animate: final };
|
|
734
|
+
}
|
|
735
|
+
const transition = buildTransition({
|
|
736
|
+
duration,
|
|
737
|
+
delay,
|
|
738
|
+
ease,
|
|
739
|
+
spring,
|
|
740
|
+
excludeDelay
|
|
741
|
+
});
|
|
742
|
+
const initial = { clipPath: CLIP_INSETS[direction] };
|
|
743
|
+
if (hasScale) initial.scale = scale2;
|
|
744
|
+
const animate2 = {
|
|
745
|
+
clipPath: REVEALED_CLIP,
|
|
746
|
+
willChange: hasScale ? "clip-path, transform" : "clip-path",
|
|
747
|
+
transition
|
|
748
|
+
};
|
|
749
|
+
if (hasScale) animate2.scale = 1;
|
|
750
|
+
return { initial, animate: animate2 };
|
|
751
|
+
}
|
|
752
|
+
var scaleOptionsSchema = basePresetSchema.extend({
|
|
753
|
+
from: zod.z.number().default(0.8)
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
// src/presets/scale.ts
|
|
757
|
+
function scale(options = {}) {
|
|
758
|
+
const parsed = scaleOptionsSchema.safeParse(options);
|
|
759
|
+
if (!parsed.success) {
|
|
760
|
+
warn(
|
|
761
|
+
`Opciones inv\xE1lidas en scale(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
const opts = parsed.success ? parsed.data : scaleOptionsSchema.parse({});
|
|
765
|
+
const { from, duration, delay, ease, spring, excludeDelay, reducedMotion } = opts;
|
|
766
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
767
|
+
return {
|
|
768
|
+
initial: { opacity: 1, scale: 1 },
|
|
769
|
+
animate: { opacity: 1, scale: 1 }
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
const transition = buildTransition({
|
|
773
|
+
duration,
|
|
774
|
+
delay,
|
|
775
|
+
ease,
|
|
776
|
+
spring,
|
|
777
|
+
excludeDelay
|
|
778
|
+
});
|
|
779
|
+
return {
|
|
780
|
+
initial: { opacity: 0, scale: from },
|
|
781
|
+
animate: {
|
|
782
|
+
opacity: 1,
|
|
783
|
+
scale: 1,
|
|
784
|
+
willChange: "transform, opacity",
|
|
785
|
+
transition
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
var slideOptionsSchema = basePresetSchema.extend({
|
|
790
|
+
direction: zod.z.enum(["up", "down", "left", "right"]).default("right"),
|
|
791
|
+
distance: zod.z.number().default(100)
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
// src/presets/slide.ts
|
|
795
|
+
var SLIDE_AXIS = {
|
|
796
|
+
up: "y",
|
|
797
|
+
down: "y",
|
|
798
|
+
left: "x",
|
|
799
|
+
right: "x"
|
|
800
|
+
};
|
|
801
|
+
var SLIDE_SIGN = {
|
|
802
|
+
up: 1,
|
|
803
|
+
down: -1,
|
|
804
|
+
left: 1,
|
|
805
|
+
right: -1
|
|
806
|
+
};
|
|
807
|
+
function slide(options = {}) {
|
|
808
|
+
const parsed = slideOptionsSchema.safeParse(options);
|
|
809
|
+
if (!parsed.success) {
|
|
810
|
+
warn(
|
|
811
|
+
`Opciones inv\xE1lidas en slide(): ${parsed.error.message}. Se usar\xE1n los valores por defecto.`
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
const opts = parsed.success ? parsed.data : slideOptionsSchema.parse({});
|
|
815
|
+
const {
|
|
816
|
+
direction,
|
|
817
|
+
distance,
|
|
818
|
+
duration,
|
|
819
|
+
delay,
|
|
820
|
+
ease,
|
|
821
|
+
spring,
|
|
822
|
+
excludeDelay,
|
|
823
|
+
reducedMotion
|
|
824
|
+
} = opts;
|
|
825
|
+
if (shouldReduceMotion(reducedMotion)) {
|
|
826
|
+
return {
|
|
827
|
+
initial: { x: 0, y: 0 },
|
|
828
|
+
animate: { x: 0, y: 0 }
|
|
829
|
+
};
|
|
830
|
+
}
|
|
831
|
+
const transition = buildTransition({
|
|
832
|
+
duration,
|
|
833
|
+
delay,
|
|
834
|
+
ease,
|
|
835
|
+
spring,
|
|
836
|
+
excludeDelay
|
|
837
|
+
});
|
|
838
|
+
const offset = SLIDE_SIGN[direction] * distance;
|
|
839
|
+
if (SLIDE_AXIS[direction] === "x") {
|
|
840
|
+
return {
|
|
841
|
+
initial: { x: offset },
|
|
842
|
+
animate: {
|
|
843
|
+
x: 0,
|
|
844
|
+
willChange: "transform",
|
|
845
|
+
transition
|
|
846
|
+
}
|
|
847
|
+
};
|
|
848
|
+
}
|
|
849
|
+
return {
|
|
850
|
+
initial: { y: offset },
|
|
851
|
+
animate: {
|
|
852
|
+
y: 0,
|
|
853
|
+
willChange: "transform",
|
|
854
|
+
transition
|
|
855
|
+
}
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
exports.Draggable = Draggable;
|
|
860
|
+
exports.Marquee = Marquee;
|
|
861
|
+
exports.TextAnimate = TextAnimate;
|
|
862
|
+
exports.basePresetSchema = basePresetSchema;
|
|
863
|
+
exports.buildMarqueeKeyframes = buildMarqueeKeyframes;
|
|
864
|
+
exports.buildSnapModifier = buildSnapModifier;
|
|
865
|
+
exports.clipReveal = clipReveal;
|
|
866
|
+
exports.clipRevealOptionsSchema = clipRevealOptionsSchema;
|
|
867
|
+
exports.counterOptionsSchema = counterOptionsSchema;
|
|
868
|
+
exports.dragConstraintsSchema = dragConstraintsSchema;
|
|
869
|
+
exports.draggableOptionsSchema = draggableOptionsSchema;
|
|
870
|
+
exports.fade = fade;
|
|
871
|
+
exports.fadeOptionsSchema = fadeOptionsSchema;
|
|
872
|
+
exports.formatCounterValue = formatCounterValue;
|
|
873
|
+
exports.getAnimationParams = getAnimationParams;
|
|
874
|
+
exports.getDragConstraintsProp = getDragConstraintsProp;
|
|
875
|
+
exports.getHighlightRanges = getHighlightRanges;
|
|
876
|
+
exports.hasInvalidBounds = hasInvalidBounds;
|
|
877
|
+
exports.isWordHighlighted = isWordHighlighted;
|
|
878
|
+
exports.marqueeOptionsSchema = marqueeOptionsSchema;
|
|
879
|
+
exports.parentVariants = parentVariants;
|
|
880
|
+
exports.parentVariantsSchema = parentVariantsSchema;
|
|
881
|
+
exports.resolveDragConstraints = resolveDragConstraints;
|
|
882
|
+
exports.scale = scale;
|
|
883
|
+
exports.scaleOptionsSchema = scaleOptionsSchema;
|
|
884
|
+
exports.slide = slide;
|
|
885
|
+
exports.slideOptionsSchema = slideOptionsSchema;
|
|
886
|
+
exports.splitText = splitText;
|
|
887
|
+
exports.textAnimateOptionsSchema = textAnimateOptionsSchema;
|
|
888
|
+
exports.useCounter = useCounter;
|
|
889
|
+
//# sourceMappingURL=index.cjs.map
|
|
890
|
+
//# sourceMappingURL=index.cjs.map
|