@@ -177,20 +177,39 @@ function appendWords(count = 10) {
177177 space . dataset . word = textArray . length - 1 ;
178178 textEl . appendChild ( space ) ;
179179 }
180+
181+ // Ensure caret is visible after words are added
182+ setTimeout ( ( ) => {
183+ caret . style . display = "block" ;
184+ caret . style . opacity = "1" ;
185+ updateCaret ( ) ;
186+ } , 10 ) ;
180187}
181188
182189// Update caret position relative to text container
183190function updateCaret ( ) {
184191 const spans = textEl . querySelectorAll ( "span" ) ;
192+
185193 if ( index >= spans . length ) {
186194 caret . style . display = "none" ;
187195 return ;
188196 }
197+
189198 const span = spans [ index ] ;
190- caret . style . left = `${ span . offsetLeft } px` ;
191- caret . style . top = `${ span . offsetTop } px` ;
192- caret . style . height = `${ span . offsetHeight } px` ;
193- caret . style . display = "block" ;
199+
200+ // Use requestAnimationFrame for better performance and timing
201+ requestAnimationFrame ( ( ) => {
202+ // Get the position relative to the text container
203+ const textRect = textEl . getBoundingClientRect ( ) ;
204+ const spanRect = span . getBoundingClientRect ( ) ;
205+
206+ // Position the caret at the beginning of the current character
207+ caret . style . left = `${ spanRect . left - textRect . left } px` ;
208+ caret . style . top = `${ spanRect . top - textRect . top } px` ;
209+ caret . style . height = `${ spanRect . height } px` ;
210+ caret . style . display = "block" ;
211+ caret . style . opacity = "1" ;
212+ } ) ;
194213}
195214
196215// Start timer on first keystroke
@@ -240,15 +259,22 @@ function resetTest() {
240259 timeLeft = parseInt ( timeSelect . value ) ;
241260 timeEl . textContent = timeLeft ;
242261
243- caret . style . display = "none" ;
244262 currentScoreEl . style . display = "none" ;
245263
246264 textArray = [ ] ;
247265 textEl . innerHTML = "" ;
248266 appendWords ( 30 ) ;
249- updateCaret ( ) ;
267+
268+ // Force caret to be visible and positioned immediately
269+ forceCaretVisible ( ) ;
270+ setTimeout ( forceCaretVisible , 10 ) ;
271+ setTimeout ( forceCaretVisible , 50 ) ;
272+ setTimeout ( forceCaretVisible , 100 ) ;
250273
251274 document . addEventListener ( "keydown" , handleTyping ) ;
275+
276+ // Make sure caret is visible when user clicks on text area
277+ textEl . addEventListener ( "click" , forceCaretVisible ) ;
252278}
253279
254280// Handle typing input
@@ -259,7 +285,9 @@ function handleTyping(e) {
259285 startTimer ( ) ;
260286 typingStarted = true ;
261287 start = Date . now ( ) ;
288+ // Caret should already be visible, but ensure it's shown
262289 caret . style . display = "block" ;
290+ caret . style . opacity = "1" ;
263291 }
264292
265293 const spans = textEl . querySelectorAll ( "span" ) ;
@@ -329,9 +357,39 @@ window.addEventListener('resize', checkScrollable);
329357// Update after leaderboard loads
330358setTimeout ( checkScrollable , 1000 ) ;
331359
360+ // Force caret to be visible
361+ function forceCaretVisible ( ) {
362+ if ( caret ) {
363+ caret . style . display = "block" ;
364+ caret . style . opacity = "1" ;
365+ caret . style . visibility = "visible" ;
366+ updateCaret ( ) ;
367+ }
368+ }
369+
332370// Initialize
333371resetTest ( ) ;
334372initLeaderboard ( ) ;
335373restartBtn . addEventListener ( "click" , resetTest ) ;
336374timeSelect . addEventListener ( "change" , resetTest ) ;
337- window . addEventListener ( "resize" , updateCaret ) ;
375+ window . addEventListener ( "resize" , updateCaret ) ;
376+
377+ // Ensure caret is visible when page loads
378+ document . addEventListener ( "DOMContentLoaded" , ( ) => {
379+ setTimeout ( forceCaretVisible , 100 ) ;
380+ setTimeout ( forceCaretVisible , 300 ) ;
381+ setTimeout ( forceCaretVisible , 500 ) ;
382+ } ) ;
383+
384+ // Also ensure caret is visible after a short delay
385+ setTimeout ( forceCaretVisible , 200 ) ;
386+ setTimeout ( forceCaretVisible , 400 ) ;
387+ setTimeout ( forceCaretVisible , 800 ) ;
388+
389+ // Ensure caret is visible when window gets focus
390+ window . addEventListener ( "focus" , forceCaretVisible ) ;
391+ window . addEventListener ( "load" , forceCaretVisible ) ;
392+
393+
394+
395+
0 commit comments