11import { HTMLProps , ReactNode , useEffect , useMemo , useRef , useState } from "react" ;
22import styles from "./type-out.module.scss" ;
33import { Optional } from "@m2d/core/utils" ;
4- import { addAnimationListeners , setupTypingFX } from "./utils" ;
4+ import { addAnimationListeners , listElements , setupTypingFX } from "./utils" ;
55
66/**
77 * Props for the TypeOut component.
@@ -63,8 +63,10 @@ const TypingAnimation = ({
6363 ...props
6464} : DefaultTypeOutProps ) => {
6565 const [ processing , setProcessing ] = useState ( true ) ;
66+
6667 const animatedSteps = useMemo ( ( ) => {
6768 const newSteps = children ? [ ...steps , children ] : steps ;
69+ console . log ( { children, steps, newSteps } ) ;
6870 if ( newSteps . length < 2 ) newSteps . unshift ( "" , "" ) ;
6971 return newSteps . map ( setupTypingFX ) ;
7072 } , [ children , steps ] ) ;
@@ -73,48 +75,34 @@ const TypingAnimation = ({
7375
7476 // Trigger animations on mount or changes
7577 useEffect ( ( ) => {
76- if ( ! containerRef . current ) return ;
7778 setProcessing ( true ) ;
7879
79- const enqueue = ( node : Element , els : Element [ ] ) => {
80- els . push ( node ) ;
81- const el = node as HTMLElement ;
82- if ( el . classList . contains ( styles . hk ) ) el . style . setProperty ( "--n" , "0" ) ;
83- else if ( el . classList . contains ( styles . word ) ) {
84- el . style . setProperty ( "--n" , `${ el . textContent ?. length ?? 0 } ` ) ;
85- el . style . setProperty ( "--w" , `${ el . offsetWidth } px` ) ;
80+ requestAnimationFrame ( ( ) => {
81+ if ( ! containerRef . current ) return ;
82+ const elements = listElements ( containerRef . current ) ;
83+
84+ for ( let i = 0 ; i < elements [ 0 ] . length ; i ++ ) {
85+ const el = elements [ 0 ] [ i ] as HTMLElement ;
86+ const nextEl = elements [ 0 ] [ i + 1 ] as HTMLElement ;
87+ el . onanimationend = ( e : AnimationEvent ) => {
88+ e . stopPropagation ( ) ;
89+ el . style . width = el . style . getPropertyValue ( "--w" ) ;
90+ el . classList . remove ( styles . type , styles . hk ) ;
91+
92+ // skipcq: JS-0354
93+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
94+ nextEl
95+ ? nextEl . classList . add ( styles . type )
96+ : ( addAnimationListeners ( elements as HTMLElement [ ] [ ] , repeat , noCursorAfterAnimEnd ) ,
97+ el . classList . add ( styles . del ) ) ;
98+ } ;
8699 }
87- Array . from ( node . children ) . forEach ( child => enqueue ( child , els ) ) ;
88- } ;
89-
90- const elements : Element [ ] [ ] = [ ] ;
91- Array . from ( containerRef . current . children ) . forEach ( child => {
92- const els : Element [ ] = [ ] ;
93- enqueue ( child , els ) ;
94- elements . push ( els ) ;
95- } ) ;
96100
97- for ( let i = 0 ; i < elements [ 0 ] . length ; i ++ ) {
98- const el = elements [ 0 ] [ i ] as HTMLElement ;
99- const nextEl = elements [ 0 ] [ i + 1 ] as HTMLElement ;
100- const animListener = ( e : AnimationEvent ) => {
101- e . stopPropagation ( ) ;
102- el . removeEventListener ( "animationend" , animListener ) ;
103- el . style . width = el . style . getPropertyValue ( "--w" ) ;
104- el . classList . remove ( styles . type , styles . hk ) ;
105-
106- // skipcq: JS-0354
107- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
108- nextEl
109- ? nextEl . classList . add ( styles . type )
110- : ( addAnimationListeners ( elements as HTMLElement [ ] [ ] , repeat , noCursorAfterAnimEnd ) ,
111- el . classList . add ( styles . del ) ) ;
112- } ;
113- el . addEventListener ( "animationend" , animListener ) ;
114- }
101+ console . log ( { elements } ) ;
115102
116- requestAnimationFrame ( ( ) => elements [ 0 ] [ 0 ] . classList . add ( styles . type ) ) ;
117- setProcessing ( false ) ;
103+ requestAnimationFrame ( ( ) => elements [ 0 ] [ 0 ] . classList . add ( styles . type ) ) ;
104+ setProcessing ( false ) ;
105+ } ) ;
118106 } , [ animatedSteps , repeat , noCursorAfterAnimEnd ] ) ;
119107
120108 // Respect pause and pause on visibility hidden
0 commit comments