@gfazioli/mantine-text-animate 1.0.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/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +18 -0
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/dist/cjs/NumberTicker/NumberTicker.cjs +84 -0
- package/dist/cjs/NumberTicker/NumberTicker.cjs.map +1 -0
- package/dist/cjs/NumberTicker/NumberTicker.module.css.cjs +7 -0
- package/dist/cjs/NumberTicker/NumberTicker.module.css.cjs.map +1 -0
- package/dist/cjs/NumberTicker/use-number-ticker.cjs +158 -0
- package/dist/cjs/NumberTicker/use-number-ticker.cjs.map +1 -0
- package/dist/cjs/Spinner/Spinner.cjs +93 -0
- package/dist/cjs/Spinner/Spinner.cjs.map +1 -0
- package/dist/cjs/Spinner/Spinner.module.css.cjs +7 -0
- package/dist/cjs/Spinner/Spinner.module.css.cjs.map +1 -0
- package/dist/cjs/TextAnimate.cjs +148 -0
- package/dist/cjs/TextAnimate.cjs.map +1 -0
- package/dist/cjs/TextAnimate.module.css.cjs +7 -0
- package/dist/cjs/TextAnimate.module.css.cjs.map +1 -0
- package/dist/cjs/TextTicker/TextTicker.cjs +93 -0
- package/dist/cjs/TextTicker/TextTicker.cjs.map +1 -0
- package/dist/cjs/TextTicker/TextTicker.module.css.cjs +7 -0
- package/dist/cjs/TextTicker/TextTicker.module.css.cjs.map +1 -0
- package/dist/cjs/TextTicker/use-text-ticker.cjs +227 -0
- package/dist/cjs/TextTicker/use-text-ticker.cjs.map +1 -0
- package/dist/cjs/Typewriter/Typewriter.cjs +87 -0
- package/dist/cjs/Typewriter/Typewriter.cjs.map +1 -0
- package/dist/cjs/Typewriter/Typewriter.module.css.cjs +7 -0
- package/dist/cjs/Typewriter/Typewriter.module.css.cjs.map +1 -0
- package/dist/cjs/Typewriter/use-typewriter.cjs +144 -0
- package/dist/cjs/Typewriter/use-typewriter.cjs.map +1 -0
- package/dist/cjs/index.cjs +15 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/NumberTicker/NumberTicker.mjs +82 -0
- package/dist/esm/NumberTicker/NumberTicker.mjs.map +1 -0
- package/dist/esm/NumberTicker/NumberTicker.module.css.mjs +5 -0
- package/dist/esm/NumberTicker/NumberTicker.module.css.mjs.map +1 -0
- package/dist/esm/NumberTicker/use-number-ticker.mjs +156 -0
- package/dist/esm/NumberTicker/use-number-ticker.mjs.map +1 -0
- package/dist/esm/Spinner/Spinner.mjs +91 -0
- package/dist/esm/Spinner/Spinner.mjs.map +1 -0
- package/dist/esm/Spinner/Spinner.module.css.mjs +5 -0
- package/dist/esm/Spinner/Spinner.module.css.mjs.map +1 -0
- package/dist/esm/TextAnimate.mjs +146 -0
- package/dist/esm/TextAnimate.mjs.map +1 -0
- package/dist/esm/TextAnimate.module.css.mjs +5 -0
- package/dist/esm/TextAnimate.module.css.mjs.map +1 -0
- package/dist/esm/TextTicker/TextTicker.mjs +91 -0
- package/dist/esm/TextTicker/TextTicker.mjs.map +1 -0
- package/dist/esm/TextTicker/TextTicker.module.css.mjs +5 -0
- package/dist/esm/TextTicker/TextTicker.module.css.mjs.map +1 -0
- package/dist/esm/TextTicker/use-text-ticker.mjs +225 -0
- package/dist/esm/TextTicker/use-text-ticker.mjs.map +1 -0
- package/dist/esm/Typewriter/Typewriter.mjs +85 -0
- package/dist/esm/Typewriter/Typewriter.mjs.map +1 -0
- package/dist/esm/Typewriter/Typewriter.module.css.mjs +5 -0
- package/dist/esm/Typewriter/Typewriter.module.css.mjs.map +1 -0
- package/dist/esm/Typewriter/use-typewriter.mjs +142 -0
- package/dist/esm/Typewriter/use-typewriter.mjs.map +1 -0
- package/dist/esm/index.mjs +5 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/styles.layer.css +1 -0
- package/dist/types/NumberTicker/NumberTicker.d.ts +53 -0
- package/dist/types/NumberTicker/use-number-ticker.d.ts +88 -0
- package/dist/types/Spinner/Spinner.d.ts +93 -0
- package/dist/types/TextAnimate.d.ts +174 -0
- package/dist/types/TextTicker/TextTicker.d.ts +49 -0
- package/dist/types/TextTicker/use-text-ticker.d.ts +114 -0
- package/dist/types/Typewriter/Typewriter.d.ts +67 -0
- package/dist/types/Typewriter/use-typewriter.d.ts +67 -0
- package/dist/types/index.d.mts +9 -0
- package/dist/types/index.d.ts +9 -0
- package/package.json +45 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import React, { useState, useEffect } from 'react';
|
|
3
|
+
import { createVarsResolver, getSize, polymorphicFactory, useProps, useStyles, Box, Text } from '@mantine/core';
|
|
4
|
+
import { NumberTicker } from './NumberTicker/NumberTicker.mjs';
|
|
5
|
+
import { Spinner } from './Spinner/Spinner.mjs';
|
|
6
|
+
import { TextTicker } from './TextTicker/TextTicker.mjs';
|
|
7
|
+
import { Typewriter } from './Typewriter/Typewriter.mjs';
|
|
8
|
+
import classes from './TextAnimate.module.css.mjs';
|
|
9
|
+
|
|
10
|
+
const defaultProps = {
|
|
11
|
+
delay: 0,
|
|
12
|
+
duration: 0.3,
|
|
13
|
+
segmentDelay: 0.05,
|
|
14
|
+
by: "word",
|
|
15
|
+
animation: "fade",
|
|
16
|
+
animateProps: {
|
|
17
|
+
translateDistance: "20",
|
|
18
|
+
scaleAmount: 2,
|
|
19
|
+
blurAmount: "10"
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const defaultStaggerTimings = {
|
|
23
|
+
text: 0.06,
|
|
24
|
+
word: 0.05,
|
|
25
|
+
character: 0.03,
|
|
26
|
+
line: 0.06
|
|
27
|
+
};
|
|
28
|
+
const varsResolver = createVarsResolver(
|
|
29
|
+
(_, { animateProps: { translateDistance, blurAmount, scaleAmount } }) => ({
|
|
30
|
+
root: {
|
|
31
|
+
"--text-animate-translation-distance": translateDistance ? getSize(translateDistance, "translate-distance") : "20px",
|
|
32
|
+
"--text-animate-blur-amount": blurAmount ? getSize(blurAmount, "blur-amount") : "10px",
|
|
33
|
+
"--text-animate-scale-amount": scaleAmount ? scaleAmount.toString() : "0.8"
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
);
|
|
37
|
+
const TextAnimate = polymorphicFactory((_props, ref) => {
|
|
38
|
+
const props = useProps("TextAnimate", defaultProps, _props);
|
|
39
|
+
const {
|
|
40
|
+
delay,
|
|
41
|
+
duration,
|
|
42
|
+
segmentClassName,
|
|
43
|
+
animate,
|
|
44
|
+
by,
|
|
45
|
+
animation,
|
|
46
|
+
segmentDelay,
|
|
47
|
+
animateProps,
|
|
48
|
+
onAnimationStart,
|
|
49
|
+
onAnimationEnd,
|
|
50
|
+
classNames,
|
|
51
|
+
style,
|
|
52
|
+
styles,
|
|
53
|
+
unstyled,
|
|
54
|
+
vars,
|
|
55
|
+
children,
|
|
56
|
+
className,
|
|
57
|
+
...others
|
|
58
|
+
} = props;
|
|
59
|
+
const staggerTiming = segmentDelay !== undefined ? segmentDelay : defaultStaggerTimings[by];
|
|
60
|
+
const [isInitialRender, setIsInitialRender] = useState(true);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (animate === "in") {
|
|
63
|
+
setIsInitialRender(false);
|
|
64
|
+
}
|
|
65
|
+
}, [animate]);
|
|
66
|
+
const containerStyles = {
|
|
67
|
+
whiteSpace: "pre-wrap",
|
|
68
|
+
position: "relative",
|
|
69
|
+
display: "block",
|
|
70
|
+
minHeight: "1em"
|
|
71
|
+
};
|
|
72
|
+
const getStyles = useStyles({
|
|
73
|
+
name: "TextAnimate",
|
|
74
|
+
props,
|
|
75
|
+
classes,
|
|
76
|
+
className,
|
|
77
|
+
style,
|
|
78
|
+
classNames,
|
|
79
|
+
styles,
|
|
80
|
+
unstyled,
|
|
81
|
+
vars,
|
|
82
|
+
varsResolver
|
|
83
|
+
});
|
|
84
|
+
if (animate === "none" || animate === false || animate === undefined) {
|
|
85
|
+
if (!isInitialRender) {
|
|
86
|
+
setIsInitialRender(true);
|
|
87
|
+
}
|
|
88
|
+
return /* @__PURE__ */ React.createElement(Box, { ref, ...getStyles("root"), style: containerStyles }, /* @__PURE__ */ React.createElement(Text, { component: "span", ...others, style: { visibility: "hidden" } }, children));
|
|
89
|
+
}
|
|
90
|
+
if (animate === "static") {
|
|
91
|
+
return /* @__PURE__ */ React.createElement(Box, { ref, ...getStyles("root"), style: containerStyles }, /* @__PURE__ */ React.createElement(Text, { component: "span", ...others }, children));
|
|
92
|
+
}
|
|
93
|
+
function handleOnAnimationStart() {
|
|
94
|
+
onAnimationStart?.(animate);
|
|
95
|
+
}
|
|
96
|
+
function handleOnAnimationEnd() {
|
|
97
|
+
onAnimationEnd?.(animate);
|
|
98
|
+
}
|
|
99
|
+
let segments = [];
|
|
100
|
+
switch (by) {
|
|
101
|
+
case "word":
|
|
102
|
+
segments = children.split(/(\s+)/);
|
|
103
|
+
break;
|
|
104
|
+
case "character":
|
|
105
|
+
segments = children.split("");
|
|
106
|
+
break;
|
|
107
|
+
case "line":
|
|
108
|
+
segments = children.split("\n");
|
|
109
|
+
break;
|
|
110
|
+
case "text":
|
|
111
|
+
default:
|
|
112
|
+
segments = [children];
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
return /* @__PURE__ */ React.createElement(Box, { ref, ...getStyles("root", { style: containerStyles }) }, segments.map((segment, i) => /* @__PURE__ */ React.createElement(
|
|
116
|
+
Text,
|
|
117
|
+
{
|
|
118
|
+
"data-text-animate": animate,
|
|
119
|
+
"data-text-animate-animation": animation,
|
|
120
|
+
key: `${by}-${segment}-${delay}-${animate}-${duration}-${JSON.stringify(animateProps)}-${i}`,
|
|
121
|
+
...getStyles("segment", {
|
|
122
|
+
style: {
|
|
123
|
+
...by === "line" ? { display: "block", whiteSpace: "normal" } : {},
|
|
124
|
+
animationDelay: `${delay + i * staggerTiming}s`,
|
|
125
|
+
animationDuration: `${duration}s`,
|
|
126
|
+
animationFillMode: "forwards",
|
|
127
|
+
animationDirection: animate === "in" ? "normal" : "reverse"
|
|
128
|
+
}
|
|
129
|
+
}),
|
|
130
|
+
component: "span",
|
|
131
|
+
onAnimationStart: handleOnAnimationStart,
|
|
132
|
+
onAnimationEnd: handleOnAnimationEnd,
|
|
133
|
+
...others
|
|
134
|
+
},
|
|
135
|
+
segment
|
|
136
|
+
)));
|
|
137
|
+
});
|
|
138
|
+
TextAnimate.classes = classes;
|
|
139
|
+
TextAnimate.displayName = "TextAnimate";
|
|
140
|
+
TextAnimate.Typewriter = Typewriter;
|
|
141
|
+
TextAnimate.Spinner = Spinner;
|
|
142
|
+
TextAnimate.NumberTicker = NumberTicker;
|
|
143
|
+
TextAnimate.TextTicker = TextTicker;
|
|
144
|
+
|
|
145
|
+
export { TextAnimate };
|
|
146
|
+
//# sourceMappingURL=TextAnimate.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAnimate.mjs","sources":["../../src/TextAnimate.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport {\n Box,\n createVarsResolver,\n getSize,\n polymorphicFactory,\n Text,\n useProps,\n useStyles,\n type BoxProps,\n type MantineSize,\n type PolymorphicFactory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { NumberTicker } from './NumberTicker/NumberTicker';\nimport { Spinner } from './Spinner/Spinner';\nimport { TextTicker } from './TextTicker/TextTicker';\nimport { Typewriter } from './Typewriter/Typewriter';\nimport classes from './TextAnimate.module.css';\n\n/**\n * Type defining how text should be split for animation\n * - text: Animate the entire text as one unit\n * - word: Animate each word separately\n * - character: Animate each character separately\n * - line: Animate each line separately (split by newlines)\n */\nexport type AnimationType = 'text' | 'word' | 'character' | 'line';\n\n/**\n * Available animation variants\n */\nexport type AnimationVariant =\n | 'fade'\n | 'blur'\n | 'scale'\n | 'slideUp'\n | 'slideDown'\n | 'slideUpElastic'\n | 'slideDownElastic'\n | 'slideLeft'\n | 'slideRight'\n | 'slideLeftElastic'\n | 'slideRightElastic'\n | 'blurUp'\n | 'blurDown';\n\n/**\n * Animation direction\n */\ntype AnimationDirection = 'in' | 'out' | 'static' | 'none' | false | undefined;\n\n// Add a new interface for AnimateProps\ninterface AnimateProps {\n /**\n * Controls the distance for slide animations (in pixels)\n * @default 20\n */\n translateDistance?: MantineSize;\n\n /**\n * Controls the scale factor for scale animations\n * For scaleUp: initial scale = 1 - scaleAmount (e.g., 0.8 means start at 0.2)\n * For scaleDown: initial scale = 1 + scaleAmount (e.g., 0.8 means start at 1.8)\n * @default 0.8\n */\n scaleAmount?: number;\n\n /**\n * Controls the blur amount for blur animations (in pixels)\n * @default 10\n */\n blurAmount?: MantineSize;\n}\n\nexport type TextAnimateStylesNames = 'root' | 'segment';\n\nexport type TextAnimateCssVariables = {\n root:\n | '--text-animate-translation-distance'\n | '--text-animate-blur-amount'\n | '--text-animate-scale-amount';\n};\n\nexport type TextAnimateDirection = 'horizontal' | 'vertical';\n\nexport type TextAnimateIn = 'positive' | 'negative';\n\nexport type TextAnimateOut = TextAnimateIn;\n\nexport interface TextAnimateBaseProps {\n /**\n * The text content to animate\n */\n children: string;\n\n /**\n * The class name to be applied to each segment\n */\n segmentClassName?: string;\n\n /**\n * The delay before the animation starts (in seconds)\n * @default 0\n */\n delay?: number;\n\n /**\n * The duration of the animation (in seconds)\n * @default 0.3\n */\n duration?: number;\n\n /**\n * How to split the text for animation\n * @default \"word\"\n */\n by?: AnimationType;\n\n /**\n * Controls the animation direction\n * - `in`: Animate elements in (appear)\n * - `out`: Animate elements out (disappear)\n * - `static`: Do not animate\n * - `none`: Do not animate\n * @default undefined (no animation)\n */\n animate?: AnimationDirection;\n\n /**\n * The animation preset to use\n * @default \"fadeIn\"\n */\n animation?: AnimationVariant;\n\n /**\n * The delay between each segment's animation (in seconds)\n * This controls the staggered timing between segments\n * @default Based on animation type (0.03-0.06)\n */\n segmentDelay?: number;\n\n /**\n * Animation properties to control intensity of animations\n * @default { translateDistance: 20, scaleAmount: 0.8, blurAmount: 10 }\n */\n animateProps?: AnimateProps;\n\n /**\n * Callback function to be called when the animation starts\n * @param animate The direction of the animation\n */\n onAnimationStart?: (animate: 'in' | 'out') => void;\n\n /**\n * Callback function to be called when the animation ends\n * @param animate The direction of the animation\n */\n onAnimationEnd?: (animate: 'in' | 'out') => void;\n}\n\nexport interface TextAnimateProps\n extends BoxProps,\n TextAnimateBaseProps,\n StylesApiProps<TextAnimateFactory> {}\n\nexport type TextAnimateFactory = PolymorphicFactory<{\n props: TextAnimateProps;\n defaultComponent: 'div';\n defaultRef: HTMLDivElement;\n stylesNames: TextAnimateStylesNames;\n vars: TextAnimateCssVariables;\n staticComponents: {\n Typewriter: typeof Typewriter;\n Spinner: typeof Spinner;\n NumberTicker: typeof NumberTicker;\n TextTicker: typeof TextTicker;\n };\n}>;\n\nconst defaultProps: Partial<TextAnimateProps> = {\n delay: 0,\n duration: 0.3,\n segmentDelay: 0.05,\n by: 'word',\n animation: 'fade',\n animateProps: {\n translateDistance: '20' as MantineSize,\n scaleAmount: 2,\n blurAmount: '10' as MantineSize,\n },\n};\n\n/**\n * Default stagger timing values for different animation types (in seconds)\n * Controls the delay between animating each segment\n */\nconst defaultStaggerTimings: Record<AnimationType, number> = {\n text: 0.06,\n word: 0.05,\n character: 0.03,\n line: 0.06,\n};\n\nconst varsResolver = createVarsResolver<TextAnimateFactory>(\n (_, { animateProps: { translateDistance, blurAmount, scaleAmount } }) => ({\n root: {\n '--text-animate-translation-distance': translateDistance\n ? getSize(translateDistance, 'translate-distance')\n : '20px',\n '--text-animate-blur-amount': blurAmount ? getSize(blurAmount, 'blur-amount') : '10px',\n '--text-animate-scale-amount': scaleAmount ? scaleAmount.toString() : '0.8',\n },\n })\n);\n\nexport const TextAnimate = polymorphicFactory<TextAnimateFactory>((_props, ref) => {\n const props = useProps('TextAnimate', defaultProps, _props);\n const {\n delay,\n duration,\n segmentClassName,\n animate,\n by,\n animation,\n segmentDelay,\n animateProps,\n onAnimationStart,\n onAnimationEnd,\n\n classNames,\n style,\n styles,\n unstyled,\n vars,\n children,\n className,\n\n ...others\n } = props;\n\n // Use provided segmentDelay or default based on animation type\n const staggerTiming = segmentDelay !== undefined ? segmentDelay : defaultStaggerTimings[by];\n\n // Add state to track if we're transitioning from \"none\" to \"in\"\n const [isInitialRender, setIsInitialRender] = useState(true);\n\n // Use useEffect to handle the transition\n useEffect(() => {\n if (animate === 'in') {\n // If we're animating in, we're no longer in initial render state\n setIsInitialRender(false);\n }\n }, [animate]);\n\n // Container styles\n const containerStyles: React.CSSProperties = {\n whiteSpace: 'pre-wrap',\n position: 'relative',\n display: 'block',\n minHeight: '1em',\n };\n\n const getStyles = useStyles<TextAnimateFactory>({\n name: 'TextAnimate',\n props,\n classes,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n });\n\n // If animate is \"none\" or false, return null (don't render anything)\n if (animate === 'none' || animate === false || animate === undefined) {\n // Reset the initial render state when we hide the component\n if (!isInitialRender) {\n setIsInitialRender(true);\n }\n return (\n <Box ref={ref} {...getStyles('root')} style={containerStyles}>\n <Text component=\"span\" {...others} style={{ visibility: 'hidden' }}>\n {children}\n </Text>\n </Box>\n );\n }\n\n // If animate is \"static\", render the text directly without animation\n if (animate === 'static') {\n return (\n <Box ref={ref} {...getStyles('root')} style={containerStyles}>\n <Text component=\"span\" {...others}>\n {children}\n </Text>\n </Box>\n );\n }\n\n // Handle animation events\n function handleOnAnimationStart() {\n onAnimationStart?.(animate as 'in' | 'out');\n }\n\n // Handle animation end event\n function handleOnAnimationEnd() {\n onAnimationEnd?.(animate as 'in' | 'out');\n }\n\n // Split text based on the 'by' prop\n let segments: string[] = [];\n switch (by) {\n case 'word':\n segments = children.split(/(\\s+)/);\n break;\n case 'character':\n segments = children.split('');\n break;\n case 'line':\n segments = children.split('\\n');\n break;\n case 'text':\n default:\n segments = [children];\n break;\n }\n\n return (\n <Box ref={ref} {...getStyles('root', { style: containerStyles })}>\n {segments.map((segment, i) => (\n <Text\n data-text-animate={animate}\n data-text-animate-animation={animation}\n key={`${by}-${segment}-${delay}-${animate}-${duration}-${JSON.stringify(animateProps)}-${i}`}\n {...getStyles('segment', {\n style: {\n ...(by === 'line' ? { display: 'block', whiteSpace: 'normal' } : {}),\n animationDelay: `${delay + i * staggerTiming}s`,\n animationDuration: `${duration}s`,\n animationFillMode: 'forwards',\n animationDirection: animate === 'in' ? 'normal' : 'reverse',\n },\n })}\n component=\"span\"\n onAnimationStart={handleOnAnimationStart}\n onAnimationEnd={handleOnAnimationEnd}\n {...others}\n >\n {segment}\n </Text>\n ))}\n </Box>\n );\n});\n\nTextAnimate.classes = classes;\nTextAnimate.displayName = 'TextAnimate';\nTextAnimate.Typewriter = Typewriter;\nTextAnimate.Spinner = Spinner;\nTextAnimate.NumberTicker = NumberTicker;\nTextAnimate.TextTicker = TextTicker;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var classes = {"root":"me_3013963b","segment":"me_dabadf3a","fade":"me_300debd5","blur":"me_300c45c0","scale":"me_d2679f11","slideUp":"me_e6c4e033","slideDown":"me_4905f03a","slideUpElastic":"me_6dc15b22","slideDownElastic":"me_1a56853b","slideLeft":"me_49096b9f","slideRight":"me_d87a6984","slideLeftElastic":"me_cd595e36","slideRightElastic":"me_75aee4b1","blurUp":"me_5e11e07b","blurDown":"me_2113fe82"};
|
|
3
|
+
|
|
4
|
+
export { classes as default };
|
|
5
|
+
//# sourceMappingURL=TextAnimate.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAnimate.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { createVarsResolver, polymorphicFactory, useProps, useStyles, Box } from '@mantine/core';
|
|
4
|
+
import { useTextTicker } from './use-text-ticker.mjs';
|
|
5
|
+
import classes from './TextTicker.module.css.mjs';
|
|
6
|
+
|
|
7
|
+
const defaultProps = {
|
|
8
|
+
characterSet: "alphanumeric",
|
|
9
|
+
customCharacters: "",
|
|
10
|
+
delay: 0,
|
|
11
|
+
speed: 1,
|
|
12
|
+
easing: "ease-out",
|
|
13
|
+
randomChangeSpeed: 1,
|
|
14
|
+
revealDirection: "left-to-right",
|
|
15
|
+
initialText: "random",
|
|
16
|
+
animate: true
|
|
17
|
+
};
|
|
18
|
+
const varsResolver = createVarsResolver((_, { delay, speed }) => ({
|
|
19
|
+
root: {
|
|
20
|
+
"--text-ticker-animation-duration": `${1 / (speed || 1)}s`,
|
|
21
|
+
"--text-ticker-animation-delay": `${delay || 0}s`
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
const TextTicker = polymorphicFactory((_props, ref) => {
|
|
25
|
+
const props = useProps("TextTicker", defaultProps, _props);
|
|
26
|
+
const {
|
|
27
|
+
value,
|
|
28
|
+
initialText,
|
|
29
|
+
animate,
|
|
30
|
+
characterSet,
|
|
31
|
+
customCharacters,
|
|
32
|
+
delay,
|
|
33
|
+
speed,
|
|
34
|
+
easing,
|
|
35
|
+
randomChangeSpeed,
|
|
36
|
+
revealDirection,
|
|
37
|
+
onCompleted,
|
|
38
|
+
classNames,
|
|
39
|
+
style,
|
|
40
|
+
styles,
|
|
41
|
+
unstyled,
|
|
42
|
+
vars,
|
|
43
|
+
className,
|
|
44
|
+
...others
|
|
45
|
+
} = props;
|
|
46
|
+
const { text } = useTextTicker({
|
|
47
|
+
value,
|
|
48
|
+
initialText,
|
|
49
|
+
animate,
|
|
50
|
+
characterSet,
|
|
51
|
+
customCharacters,
|
|
52
|
+
delay,
|
|
53
|
+
speed,
|
|
54
|
+
easing,
|
|
55
|
+
randomChangeSpeed,
|
|
56
|
+
revealDirection,
|
|
57
|
+
onCompleted
|
|
58
|
+
});
|
|
59
|
+
const getStyles = useStyles({
|
|
60
|
+
name: "TextTicker",
|
|
61
|
+
props,
|
|
62
|
+
classes,
|
|
63
|
+
className,
|
|
64
|
+
style,
|
|
65
|
+
classNames,
|
|
66
|
+
styles,
|
|
67
|
+
unstyled,
|
|
68
|
+
vars,
|
|
69
|
+
varsResolver
|
|
70
|
+
});
|
|
71
|
+
return /* @__PURE__ */ React.createElement(
|
|
72
|
+
Box,
|
|
73
|
+
{
|
|
74
|
+
ref,
|
|
75
|
+
...getStyles("root", {
|
|
76
|
+
style: {
|
|
77
|
+
display: "inline-block",
|
|
78
|
+
fontFamily: "monospace",
|
|
79
|
+
whiteSpace: "pre"
|
|
80
|
+
}
|
|
81
|
+
}),
|
|
82
|
+
component: "p",
|
|
83
|
+
...others
|
|
84
|
+
},
|
|
85
|
+
text
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
TextTicker.displayName = "TextTicker";
|
|
89
|
+
|
|
90
|
+
export { TextTicker };
|
|
91
|
+
//# sourceMappingURL=TextTicker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextTicker.mjs","sources":["../../../src/TextTicker/TextTicker.tsx"],"sourcesContent":["import React from 'react';\nimport {\n Box,\n createVarsResolver,\n polymorphicFactory,\n useProps,\n useStyles,\n type BoxProps,\n type PolymorphicFactory,\n type StylesApiProps,\n} from '@mantine/core';\nimport { useTextTicker, type TextTickerBaseProps } from './use-text-ticker';\nimport classes from './TextTicker.module.css';\n\nexport type TextTickerStylesNames = 'root';\n\nexport type TextTickerCssVariables = {\n root: '--text-ticker-animation-duration' | '--text-ticker-animation-delay';\n};\n\nexport interface TextTickerProps\n extends BoxProps,\n TextTickerBaseProps,\n StylesApiProps<TextTickerFactory> {}\n\nexport type TextTickerFactory = PolymorphicFactory<{\n props: TextTickerProps;\n defaultComponent: 'p';\n defaultRef: HTMLParagraphElement;\n stylesNames: TextTickerStylesNames;\n vars: TextTickerCssVariables;\n}>;\n\nconst defaultProps: Partial<TextTickerProps> = {\n characterSet: 'alphanumeric',\n customCharacters: '',\n delay: 0,\n speed: 1,\n easing: 'ease-out',\n randomChangeSpeed: 1,\n revealDirection: 'left-to-right',\n initialText: 'random',\n animate: true,\n};\n\nconst varsResolver = createVarsResolver<TextTickerFactory>((_, { delay, speed }) => ({\n root: {\n '--text-ticker-animation-duration': `${1 / (speed || 1)}s`,\n '--text-ticker-animation-delay': `${delay || 0}s`,\n },\n}));\n\n/**\n * TextTicker Component\n *\n * A component that animates text from random characters to a target string.\n * This implementation uses the useTextTicker hook internally.\n */\nexport const TextTicker = polymorphicFactory<TextTickerFactory>((_props, ref) => {\n const props = useProps('TextTicker', defaultProps, _props);\n\n const {\n value,\n initialText,\n animate,\n characterSet,\n customCharacters,\n delay,\n speed,\n easing,\n randomChangeSpeed,\n revealDirection,\n onCompleted,\n\n classNames,\n style,\n styles,\n unstyled,\n vars,\n className,\n\n ...others\n } = props;\n\n // Use the hook with mapped props\n const { text } = useTextTicker({\n value,\n initialText,\n animate,\n characterSet,\n customCharacters,\n delay,\n speed,\n easing,\n randomChangeSpeed,\n revealDirection,\n onCompleted,\n });\n\n const getStyles = useStyles<TextTickerFactory>({\n name: 'TextTicker',\n props,\n classes,\n className,\n style,\n classNames,\n styles,\n unstyled,\n vars,\n varsResolver,\n });\n\n return (\n <Box\n ref={ref}\n {...getStyles('root', {\n style: {\n display: 'inline-block',\n fontFamily: 'monospace',\n whiteSpace: 'pre',\n },\n })}\n component=\"p\"\n {...others}\n >\n {text}\n </Box>\n );\n});\n\nTextTicker.displayName = 'TextTicker';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextTicker.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useState, useRef, useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
const characterSets = {
|
|
5
|
+
alphanumeric: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
|
6
|
+
alphabetic: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
|
7
|
+
numeric: "0123456789",
|
|
8
|
+
symbols: "!@#$%^&*()_+-=[]{}|;:,.<>?/"
|
|
9
|
+
};
|
|
10
|
+
const easingFunctions = {
|
|
11
|
+
linear: (t) => t,
|
|
12
|
+
"ease-in": (t) => t * t,
|
|
13
|
+
"ease-out": (t) => 1 - Math.pow(1 - t, 2),
|
|
14
|
+
"ease-in-out": (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2
|
|
15
|
+
};
|
|
16
|
+
const shuffleArray = (array) => {
|
|
17
|
+
const result = [...array];
|
|
18
|
+
for (let i = result.length - 1; i > 0; i--) {
|
|
19
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
20
|
+
[result[i], result[j]] = [result[j], result[i]];
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
function useTextTicker({
|
|
25
|
+
value,
|
|
26
|
+
initialText = "random",
|
|
27
|
+
animate = true,
|
|
28
|
+
characterSet = "alphanumeric",
|
|
29
|
+
customCharacters = "",
|
|
30
|
+
delay = 0,
|
|
31
|
+
speed = 1,
|
|
32
|
+
easing = "ease-out",
|
|
33
|
+
randomChangeSpeed = 1,
|
|
34
|
+
revealDirection = "left-to-right",
|
|
35
|
+
onCompleted
|
|
36
|
+
}) {
|
|
37
|
+
const [displayText, setDisplayText] = useState("");
|
|
38
|
+
const [isAnimating, setIsAnimating] = useState(false);
|
|
39
|
+
const animationFrameRef = useRef(null);
|
|
40
|
+
const delayTimeoutRef = useRef(null);
|
|
41
|
+
const startTimeRef = useRef(0);
|
|
42
|
+
const charStabilityRef = useRef([]);
|
|
43
|
+
const randomOrderRef = useRef([]);
|
|
44
|
+
const isFirstRenderRef = useRef(true);
|
|
45
|
+
const manualStartRef = useRef(false);
|
|
46
|
+
const animatePropRef = useRef(animate);
|
|
47
|
+
const animationCompletedRef = useRef(false);
|
|
48
|
+
const getCharacterPool = () => {
|
|
49
|
+
if (characterSet === "custom" && customCharacters && customCharacters.length > 0) {
|
|
50
|
+
return customCharacters;
|
|
51
|
+
}
|
|
52
|
+
return characterSets[characterSet === "custom" ? "alphanumeric" : characterSet];
|
|
53
|
+
};
|
|
54
|
+
const generateRandomText = () => {
|
|
55
|
+
const pool = getCharacterPool();
|
|
56
|
+
let result = "";
|
|
57
|
+
for (let i = 0; i < value.length; i++) {
|
|
58
|
+
result += pool[Math.floor(Math.random() * pool.length)];
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
};
|
|
62
|
+
const generateInitialText = () => {
|
|
63
|
+
if (initialText === "none") return "";
|
|
64
|
+
if (initialText === "target") return value;
|
|
65
|
+
return generateRandomText();
|
|
66
|
+
};
|
|
67
|
+
const getCharIndexOrder = () => {
|
|
68
|
+
const indices = Array.from({ length: value.length }, (_, i) => i);
|
|
69
|
+
switch (revealDirection) {
|
|
70
|
+
case "right-to-left":
|
|
71
|
+
return indices.reverse();
|
|
72
|
+
case "center-out": {
|
|
73
|
+
const result = [];
|
|
74
|
+
const mid = Math.floor(value.length / 2);
|
|
75
|
+
result.push(mid);
|
|
76
|
+
for (let i = 1; i <= mid; i++) {
|
|
77
|
+
if (mid - i >= 0) result.push(mid - i);
|
|
78
|
+
if (mid + i < value.length) result.push(mid + i);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
case "random":
|
|
83
|
+
if (randomOrderRef.current.length === value.length) {
|
|
84
|
+
return randomOrderRef.current;
|
|
85
|
+
}
|
|
86
|
+
const randomOrder = shuffleArray(indices);
|
|
87
|
+
randomOrderRef.current = randomOrder;
|
|
88
|
+
return randomOrder;
|
|
89
|
+
case "left-to-right":
|
|
90
|
+
default:
|
|
91
|
+
return indices;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const animateFrame = (timestamp) => {
|
|
95
|
+
if (!startTimeRef.current) {
|
|
96
|
+
startTimeRef.current = timestamp;
|
|
97
|
+
charStabilityRef.current = Array(value.length).fill(false);
|
|
98
|
+
}
|
|
99
|
+
const elapsed = timestamp - startTimeRef.current;
|
|
100
|
+
const duration = 1e3 / speed;
|
|
101
|
+
const progress = Math.min(elapsed / duration, 1);
|
|
102
|
+
const easingFunction = easingFunctions[easing] || easingFunctions["ease-out"];
|
|
103
|
+
const easedProgress = easingFunction(progress);
|
|
104
|
+
let allStable = true;
|
|
105
|
+
const pool = getCharacterPool();
|
|
106
|
+
const changeThreshold = 1 / randomChangeSpeed;
|
|
107
|
+
const charOrder = getCharIndexOrder();
|
|
108
|
+
const newTextArray = Array(value.length).fill("");
|
|
109
|
+
for (let orderIndex = 0; orderIndex < charOrder.length; orderIndex++) {
|
|
110
|
+
const i = charOrder[orderIndex];
|
|
111
|
+
const positionFactor = orderIndex / charOrder.length;
|
|
112
|
+
const charStability = Math.min(1, easedProgress * 3 - positionFactor);
|
|
113
|
+
if (charStabilityRef.current[i] || Math.random() < charStability) {
|
|
114
|
+
charStabilityRef.current[i] = true;
|
|
115
|
+
newTextArray[i] = value[i];
|
|
116
|
+
} else {
|
|
117
|
+
if (Math.random() < changeThreshold) {
|
|
118
|
+
newTextArray[i] = pool[Math.floor(Math.random() * pool.length)];
|
|
119
|
+
} else {
|
|
120
|
+
const currentChar = displayText[i] || pool[Math.floor(Math.random() * pool.length)];
|
|
121
|
+
newTextArray[i] = currentChar;
|
|
122
|
+
}
|
|
123
|
+
allStable = false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
setDisplayText(newTextArray.join(""));
|
|
127
|
+
if (progress >= 1 || allStable) {
|
|
128
|
+
setDisplayText(value);
|
|
129
|
+
setIsAnimating(false);
|
|
130
|
+
startTimeRef.current = 0;
|
|
131
|
+
animationCompletedRef.current = true;
|
|
132
|
+
if (onCompleted) {
|
|
133
|
+
onCompleted();
|
|
134
|
+
}
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
animationFrameRef.current = requestAnimationFrame(animateFrame);
|
|
138
|
+
};
|
|
139
|
+
const start = () => {
|
|
140
|
+
animationCompletedRef.current = false;
|
|
141
|
+
if (!animatePropRef.current) {
|
|
142
|
+
manualStartRef.current = true;
|
|
143
|
+
} else {
|
|
144
|
+
manualStartRef.current = false;
|
|
145
|
+
}
|
|
146
|
+
if (isAnimating) return;
|
|
147
|
+
if (animationFrameRef.current) {
|
|
148
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
149
|
+
animationFrameRef.current = null;
|
|
150
|
+
}
|
|
151
|
+
if (delayTimeoutRef.current) {
|
|
152
|
+
clearTimeout(delayTimeoutRef.current);
|
|
153
|
+
delayTimeoutRef.current = null;
|
|
154
|
+
}
|
|
155
|
+
startTimeRef.current = 0;
|
|
156
|
+
charStabilityRef.current = Array(value.length).fill(false);
|
|
157
|
+
setIsAnimating(true);
|
|
158
|
+
delayTimeoutRef.current = setTimeout(() => {
|
|
159
|
+
animationFrameRef.current = requestAnimationFrame(animateFrame);
|
|
160
|
+
}, delay * 1e3);
|
|
161
|
+
};
|
|
162
|
+
const stop = () => {
|
|
163
|
+
manualStartRef.current = false;
|
|
164
|
+
if (animationFrameRef.current) {
|
|
165
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
166
|
+
animationFrameRef.current = null;
|
|
167
|
+
}
|
|
168
|
+
if (delayTimeoutRef.current) {
|
|
169
|
+
clearTimeout(delayTimeoutRef.current);
|
|
170
|
+
delayTimeoutRef.current = null;
|
|
171
|
+
}
|
|
172
|
+
setIsAnimating(false);
|
|
173
|
+
};
|
|
174
|
+
const reset = () => {
|
|
175
|
+
stop();
|
|
176
|
+
setDisplayText(generateInitialText());
|
|
177
|
+
startTimeRef.current = 0;
|
|
178
|
+
charStabilityRef.current = Array(value.length).fill(false);
|
|
179
|
+
animationCompletedRef.current = false;
|
|
180
|
+
};
|
|
181
|
+
useEffect(() => {
|
|
182
|
+
if (isFirstRenderRef.current) {
|
|
183
|
+
setDisplayText(generateInitialText());
|
|
184
|
+
isFirstRenderRef.current = false;
|
|
185
|
+
}
|
|
186
|
+
}, []);
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
if (animate !== animatePropRef.current) {
|
|
189
|
+
animatePropRef.current = animate;
|
|
190
|
+
if (animate && !isAnimating) {
|
|
191
|
+
animationCompletedRef.current = false;
|
|
192
|
+
start();
|
|
193
|
+
} else if (!animate && isAnimating) {
|
|
194
|
+
stop();
|
|
195
|
+
}
|
|
196
|
+
} else if (animate && !isAnimating && !animationCompletedRef.current) {
|
|
197
|
+
start();
|
|
198
|
+
}
|
|
199
|
+
}, [isAnimating, animate]);
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
if (!isAnimating) {
|
|
202
|
+
setDisplayText(generateInitialText());
|
|
203
|
+
}
|
|
204
|
+
}, [value, initialText, characterSet, customCharacters]);
|
|
205
|
+
useEffect(() => {
|
|
206
|
+
return () => {
|
|
207
|
+
if (animationFrameRef.current) {
|
|
208
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
209
|
+
}
|
|
210
|
+
if (delayTimeoutRef.current) {
|
|
211
|
+
clearTimeout(delayTimeoutRef.current);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}, []);
|
|
215
|
+
return {
|
|
216
|
+
text: displayText,
|
|
217
|
+
start,
|
|
218
|
+
stop,
|
|
219
|
+
reset,
|
|
220
|
+
isAnimating
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export { useTextTicker };
|
|
225
|
+
//# sourceMappingURL=use-text-ticker.mjs.map
|