From 4ea3d63b299a07ac456e5876fd5ebe814cafbc42 Mon Sep 17 00:00:00 2001 From: cclohmar Date: Tue, 2 Jun 2026 00:00:57 +0000 Subject: [PATCH] feat: OTP inputs auto-advance to next field when digit is typed - oninput moves focus to next field when digit entered - onkeydown Backspace moves to previous field when current is empty - Last field (digit_5) only handles backspace --- internal/handlers/templates.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/internal/handlers/templates.go b/internal/handlers/templates.go index acde3e3..a292ae7 100644 --- a/internal/handlers/templates.go +++ b/internal/handlers/templates.go @@ -49,24 +49,30 @@ func loadTemplates() { log.Printf("Loaded %d templates", len(templates)) } -// otpFormHTML is the inline OTP form template fragment. +// otpFormHTML is the inline OTP form template fragment with auto-advance. const otpFormHTML = `
{{if .Error}}
{{.Error}}
{{end}}
+ style="width: 3rem; height: 3rem; text-align: center; font-size: 1.5rem; border: 2px solid #475569; border-radius: 0.5rem; background: #1e293b; color: #f8fafc;" + oninput="if(this.value)this.nextElementSibling.focus()" onkeydown="if(event.key==='Backspace'&&!this.value)this.previousElementSibling?.focus()"> + style="width: 3rem; height: 3rem; text-align: center; font-size: 1.5rem; border: 2px solid #475569; border-radius: 0.5rem; background: #1e293b; color: #f8fafc;" + oninput="if(this.value)this.nextElementSibling.focus()" onkeydown="if(event.key==='Backspace'&&!this.value)this.previousElementSibling?.focus()"> + style="width: 3rem; height: 3rem; text-align: center; font-size: 1.5rem; border: 2px solid #475569; border-radius: 0.5rem; background: #1e293b; color: #f8fafc;" + oninput="if(this.value)this.nextElementSibling.focus()" onkeydown="if(event.key==='Backspace'&&!this.value)this.previousElementSibling?.focus()"> + style="width: 3rem; height: 3rem; text-align: center; font-size: 1.5rem; border: 2px solid #475569; border-radius: 0.5rem; background: #1e293b; color: #f8fafc;" + oninput="if(this.value)this.nextElementSibling.focus()" onkeydown="if(event.key==='Backspace'&&!this.value)this.previousElementSibling?.focus()"> + style="width: 3rem; height: 3rem; text-align: center; font-size: 1.5rem; border: 2px solid #475569; border-radius: 0.5rem; background: #1e293b; color: #f8fafc;" + oninput="if(this.value)this.nextElementSibling.focus()" onkeydown="if(event.key==='Backspace'&&!this.value)this.previousElementSibling?.focus()"> + style="width: 3rem; height: 3rem; text-align: center; font-size: 1.5rem; border: 2px solid #475569; border-radius: 0.5rem; background: #1e293b; color: #f8fafc;" + onkeydown="if(event.key==='Backspace'&&!this.value)this.previousElementSibling?.focus()">
`