package tui import ( "strings" "charm.land/bubbles/v2/textinput" ) const ( fieldName = iota fieldHost fieldUser fieldPrivateKey fieldPort fieldSave fieldBack fieldCount ) type addServerForm struct { inputs [5]textinput.Model focused int // 0–6: inputs 0-4, save 5, back 6 } func newAddServerForm() addServerForm { mkInput := func(placeholder string, limit int) textinput.Model { ti := textinput.New() ti.Prompt = "" ti.CharLimit = limit ti.SetWidth(40) ti.Placeholder = placeholder return ti } f := addServerForm{} f.inputs[fieldName] = mkInput("production-web", 64) f.inputs[fieldHost] = mkInput("192.168.1.1 or example.com", 253) f.inputs[fieldUser] = mkInput("deploy", 64) f.inputs[fieldPrivateKey] = mkInput("~/.ssh/id_rsa", 512) f.inputs[fieldPort] = mkInput("22 (optional)", 5) f.inputs[fieldName].Focus() return f } func (f *addServerForm) focusField(i int) { for j := range f.inputs { f.inputs[j].Blur() } if i < len(f.inputs) { f.inputs[i].Focus() } f.focused = i } func (f addServerForm) canSave() bool { return strings.TrimSpace(f.inputs[fieldName].Value()) != "" && strings.TrimSpace(f.inputs[fieldHost].Value()) != "" && strings.TrimSpace(f.inputs[fieldUser].Value()) != "" && strings.TrimSpace(f.inputs[fieldPrivateKey].Value()) != "" } func (f addServerForm) focusNext() addServerForm { next := f.focused + 1 if next >= fieldCount { next = fieldCount - 1 } f.focusField(next) return f } func (f addServerForm) focusPrev() addServerForm { prev := f.focused - 1 if prev < 0 { prev = 0 } f.focusField(prev) return f }