|
346 | 346 | * @param {jQuery} $input The password input field. |
347 | 347 | */ |
348 | 348 | function bindCapsLockWarning( $input ) { |
349 | | - var $capsWarning = $( '#caps-warning' ), |
350 | | - capsLockOn = false; |
| 349 | + var $capsWarning, |
| 350 | + capsLockOn = false; |
351 | 351 |
|
352 | 352 | // Skip warning on macOS Safari + Firefox (they show native indicators). |
353 | 353 | if ( isMac && ( isSafari || isFirefox ) ) { |
354 | 354 | return; |
355 | 355 | } |
356 | 356 |
|
| 357 | + $capsWarning = $( '<div id="caps-warning" class="caps-warning"></div>' ); |
| 358 | + $capsIcon = $( '<span class="caps-icon" aria-hidden="true"><svg viewBox="0 0 24 26" xmlns="http://www.w3.org/2000/svg" fill="#3c434a" stroke="#3c434a" stroke-width="0.5"><path d="M12 5L19 15H16V19H8V15H5L12 5Z"/><rect x="8" y="21" width="8" height="1.5" rx="0.75"/></svg></span>' ); |
| 359 | + $capsText = $( '<span class="caps-warning-text">' + __( 'Caps lock is on.' ) + '</span>' ); |
| 360 | + $capsWarning.append( $capsIcon, $capsText ); |
| 361 | + |
| 362 | + $input.parent( 'div' ).append( $capsWarning ); |
| 363 | + |
357 | 364 | $input.on( 'keydown', function( jqEvent ) { |
358 | 365 | var event = jqEvent.originalEvent; |
359 | 366 |
|
360 | | - // Skip CapsLock key itself. |
361 | | - if ( ev.key === 'CapsLock' ) { |
362 | | - if ( capsLockOn ) { |
363 | | - capsLockOn = false; |
364 | | - $capsWarning.hide(); |
365 | | - } |
366 | | - return; |
367 | | - } |
368 | | - |
369 | 367 | // Skip if key is not a printable character. |
370 | 368 | // Key length > 1 usually means non-printable (e.g., "Enter", "Tab"). |
371 | 369 | if ( event.ctrlKey || event.metaKey || event.altKey || ! event.key || event.key.length !== 1 ) { |
|
374 | 372 |
|
375 | 373 | var state = isCapsLockOn( event ); |
376 | 374 |
|
377 | | - // Only react when the state changes. |
| 375 | + // React when the state changes or if caps lock is on when the user starts typing. |
378 | 376 | if ( state !== capsLockOn ) { |
379 | 377 | capsLockOn = state; |
380 | 378 |
|
381 | 379 | if ( capsLockOn ) { |
382 | 380 | $capsWarning.show(); |
383 | | - wp.a11y.speak( __( 'Caps lock is on.' ) ); |
| 381 | + // Don't duplicate existing screen reader Caps lock notifications. |
| 382 | + if ( event.key !== 'CapsLock' ) { |
| 383 | + wp.a11y.speak( __( 'Caps lock is on.' ), 'assertive' ); |
| 384 | + } |
384 | 385 | } else { |
385 | 386 | $capsWarning.hide(); |
386 | 387 | } |
|
0 commit comments