import { target, targetable } from '@github/catalyst/lib/targetable' export default targetable(class extends HTMLElement { static [target.static] = [ 'visiblePasswordIcon', 'hiddenPasswordIcon', 'passwordInput', 'togglePasswordVisibility' ] connectedCallback () { // Make toggle button keyboard accessible if (!this.togglePasswordVisibility.hasAttribute('tabindex')) { this.togglePasswordVisibility.setAttribute('tabindex', '0') } if (!this.togglePasswordVisibility.hasAttribute('role')) { this.togglePasswordVisibility.setAttribute('role', 'button') } this.updateToggleAria() this.togglePasswordVisibility.addEventListener('click', this.handleTogglePasswordVisibility) // Add keyboard support for Enter and Space keys this.handleKeydown = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault() this.handleTogglePasswordVisibility() } } this.togglePasswordVisibility.addEventListener('keydown', this.handleKeydown) document.addEventListener('turbo:submit-start', this.setInitialPasswordType) } disconnectedCallback () { this.togglePasswordVisibility.removeEventListener('click', this.handleTogglePasswordVisibility) this.togglePasswordVisibility.removeEventListener('keydown', this.handleKeydown) document.removeEventListener('turbo:submit-start', this.setInitialPasswordType) } handleTogglePasswordVisibility = () => { this.passwordInput.type = this.passwordInput.type === 'password' ? 'text' : 'password' this.toggleIcon() } setInitialPasswordType = () => { this.passwordInput.type = 'password' this.toggleIcon() } toggleIcon = () => { this.visiblePasswordIcon.classList.toggle('hidden', this.passwordInput.type === 'password') this.hiddenPasswordIcon.classList.toggle('hidden', this.passwordInput.type === 'text') this.updateToggleAria() } updateToggleAria = () => { const isVisible = this.passwordInput.type === 'text' this.togglePasswordVisibility.setAttribute('aria-label', isVisible ? 'Hide password' : 'Show password') this.togglePasswordVisibility.setAttribute('aria-pressed', isVisible ? 'true' : 'false') } })