diff --git a/cmd/picoclaw-launcher-tui/ui/app.go b/cmd/picoclaw-launcher-tui/ui/app.go index b0f1799e..53d1cf8c 100644 --- a/cmd/picoclaw-launcher-tui/ui/app.go +++ b/cmd/picoclaw-launcher-tui/ui/app.go @@ -102,17 +102,23 @@ func (a *App) refreshModelCache(onDone func()) { // New creates and wires up the TUI application. func New(cfg *tuicfg.TUIConfig, configPath string) *App { - tview.Styles.PrimitiveBackgroundColor = tcell.ColorBlack - tview.Styles.ContrastBackgroundColor = tcell.ColorTeal - tview.Styles.MoreContrastBackgroundColor = tcell.ColorLime - tview.Styles.BorderColor = tcell.ColorDarkCyan - tview.Styles.TitleColor = tcell.ColorAqua - tview.Styles.GraphicsColor = tcell.ColorDarkCyan - tview.Styles.PrimaryTextColor = tcell.ColorWhite - tview.Styles.SecondaryTextColor = tcell.ColorSilver - tview.Styles.TertiaryTextColor = tcell.ColorAqua - tview.Styles.InverseTextColor = tcell.ColorBlack - tview.Styles.ContrastSecondaryTextColor = tcell.ColorNavy + // Cyberpunk Theme Colors + // Dark background + tview.Styles.PrimitiveBackgroundColor = tcell.NewHexColor(0x050510) // Deep Void + tview.Styles.ContrastBackgroundColor = tcell.NewHexColor(0x1a1a2e) // Dark Indigo + tview.Styles.MoreContrastBackgroundColor = tcell.NewHexColor(0x2a2a40) + + // Borders and Titles + tview.Styles.BorderColor = tcell.NewHexColor(0x00f0ff) // Neon Cyan + tview.Styles.TitleColor = tcell.NewHexColor(0x00f0ff) // Neon Cyan + tview.Styles.GraphicsColor = tcell.NewHexColor(0xff00ff) // Neon Magenta + + // Text + tview.Styles.PrimaryTextColor = tcell.NewHexColor(0xe0e0e0) // Off-white + tview.Styles.SecondaryTextColor = tcell.NewHexColor(0x00f0ff) // Neon Cyan + tview.Styles.TertiaryTextColor = tcell.NewHexColor(0x39ff14) // Neon Lime + tview.Styles.InverseTextColor = tcell.NewHexColor(0x000000) // Black + tview.Styles.ContrastSecondaryTextColor = tcell.NewHexColor(0xff00ff) // Neon Magenta a := &App{ tapp: tview.NewApplication(), @@ -127,7 +133,7 @@ func New(cfg *tuicfg.TUIConfig, configPath string) *App { a.tapp.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyEscape { if len(a.modalOpen) > 0 { - return nil + return event } return a.goBack() } @@ -192,21 +198,22 @@ func (a *App) save() { func (a *App) showError(msg string) { modal := tview.NewModal(). - SetText("Error: " + msg). + SetText(" [red::b]ERROR[-::-]\n\n" + msg). AddButtons([]string{"OK"}). SetDoneFunc(func(_ int, _ string) { a.hideModal("error") }) - modal.SetBackgroundColor(tcell.ColorNavy) - modal.SetTextColor(tcell.ColorWhite) - modal.SetButtonBackgroundColor(tcell.ColorDarkCyan) - modal.SetButtonTextColor(tcell.ColorWhite) + // Cyberpunk Modal Style + modal.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) // Deep Indigo + modal.SetTextColor(tcell.NewHexColor(0xffffff)) // White + modal.SetButtonBackgroundColor(tcell.NewHexColor(0xff2a2a)) // Neon Red + modal.SetButtonTextColor(tcell.NewHexColor(0xffffff)) // White a.showModal("error", modal) } func (a *App) confirmDelete(label string, onConfirm func()) { modal := tview.NewModal(). - SetText("Delete " + label + "?\nThis cannot be undone."). + SetText(" [red::b]DELETE WARNING[-::-]\n\nDelete " + label + "?\n[gray]This action cannot be undone.[-]"). AddButtons([]string{"Delete", "Cancel"}). SetDoneFunc(func(_ int, buttonLabel string) { a.hideModal("confirm-delete") @@ -214,10 +221,11 @@ func (a *App) confirmDelete(label string, onConfirm func()) { onConfirm() } }) - modal.SetBackgroundColor(tcell.ColorNavy) - modal.SetTextColor(tcell.ColorWhite) - modal.SetButtonBackgroundColor(tcell.ColorDarkCyan) - modal.SetButtonTextColor(tcell.ColorWhite) + // Cyberpunk Modal Style + modal.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) // Deep Indigo + modal.SetTextColor(tcell.NewHexColor(0xffffff)) // White + modal.SetButtonBackgroundColor(tcell.NewHexColor(0xff2a2a)) // Neon Red for danger + modal.SetButtonTextColor(tcell.NewHexColor(0xffffff)) // White a.showModal("confirm-delete", modal) } @@ -234,9 +242,10 @@ func centeredForm(form *tview.Form, widthPct, height int) tview.Primitive { func hintBar(text string) *tview.TextView { tv := tview.NewTextView(). SetText(text). + SetDynamicColors(true). SetTextAlign(tview.AlignCenter). - SetTextColor(tcell.ColorAqua) - tv.SetBackgroundColor(tcell.ColorMidnightBlue) + SetTextColor(tcell.NewHexColor(0x00f0ff)) // Neon Cyan + tv.SetBackgroundColor(tcell.NewHexColor(0x2a2a40)) // Darker Indigo return tv } @@ -246,21 +255,21 @@ func (a *App) buildShell(pageID string, content tview.Primitive, hint string) tv if a.headerModelTV == nil { a.headerModelTV = tview.NewTextView() a.headerModelTV.SetTextAlign(tview.AlignRight). - SetTextColor(tcell.ColorYellow). + SetTextColor(tcell.NewHexColor(0x39ff14)). // Neon Lime SetDynamicColors(true). - SetBackgroundColor(tcell.ColorBlack) + SetBackgroundColor(tcell.NewHexColor(0x050510)) } modelTV = a.headerModelTV - modelTV.SetText(a.cfg.CurrentModelLabel() + " ") + modelTV.SetText("MODEL: " + a.cfg.CurrentModelLabel() + " ") } else { modelTV = tview.NewTextView() - modelTV.SetBackgroundColor(tcell.ColorBlack) + modelTV.SetBackgroundColor(tcell.NewHexColor(0x050510)) } headerLeft := tview.NewTextView(). - SetText(" ▓▓ PICOCLAW LAUNCHER ▓▓"). - SetTextColor(tcell.ColorAqua). - SetBackgroundColor(tcell.ColorBlack) + SetText(" [#ff00ff::b]///[#00f0ff] PICOCLAW LAUNCHER [#ff00ff]///"). + SetDynamicColors(true). + SetBackgroundColor(tcell.NewHexColor(0x050510)) header := tview.NewFlex(). AddItem(headerLeft, 0, 1, false). @@ -269,44 +278,42 @@ func (a *App) buildShell(pageID string, content tview.Primitive, hint string) tv sidebar := tview.NewTextView(). SetDynamicColors(true). SetWrap(false) - sidebar.SetBackgroundColor(tcell.ColorNavy) + sidebar.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) // Deep Indigo - activeColor := "[lime]▶ " - inactiveColor := "[gray] " + // Cyberpunk Sidebar Styling + activePrefix := "[#39ff14::b]>> " // Neon Lime arrow + activeSuffix := "[-]" + inactivePrefix := "[#808080] " + inactiveSuffix := "[-]" - sbText := "\n" - if pageID == "home" { - sbText += activeColor + "HOME[-]\n" - } else { - sbText += inactiveColor + "HOME[-]\n" - } - if pageID == "schemes" { - sbText += activeColor + "SCHEMES[-]\n" - } else { - sbText += inactiveColor + "SCHEMES[-]\n" - } - if pageID == "users" { - sbText += activeColor + "USERS[-]\n" - } else { - sbText += inactiveColor + "USERS[-]\n" - } - if pageID == "models" { - sbText += activeColor + "MODELS[-]\n" - } else { - sbText += inactiveColor + "MODELS[-]\n" + sbText := "\n\n" // Top padding + + menuItem := func(id, label string) string { + if pageID == id { + return activePrefix + label + activeSuffix + "\n\n" + } + return inactivePrefix + label + inactiveSuffix + "\n\n" } + sbText += menuItem("home", "HOME") + sbText += menuItem("schemes", "SCHEMES") + sbText += menuItem("users", "USERS") + sbText += menuItem("models", "MODELS") + sidebar.SetText(sbText) footer := hintBar(hint) grid := tview.NewGrid(). SetRows(1, 0, 1). - SetColumns(16, 0). + SetColumns(20, 0). // Slightly wider sidebar AddItem(header, 0, 0, 1, 2, 0, 0, false). AddItem(sidebar, 1, 0, 1, 1, 0, 0, false). AddItem(content, 1, 1, 1, 1, 0, 0, true). AddItem(footer, 2, 0, 1, 2, 0, 0, false) + // Add a border around the content area if possible, or ensure content has its own border + // grid.SetBorders(false) // Grid borders usually look bad, handled by components + return grid } diff --git a/cmd/picoclaw-launcher-tui/ui/home.go b/cmd/picoclaw-launcher-tui/ui/home.go index af25f9b4..4e952d53 100644 --- a/cmd/picoclaw-launcher-tui/ui/home.go +++ b/cmd/picoclaw-launcher-tui/ui/home.go @@ -12,20 +12,20 @@ import ( func (a *App) newHomePage() tview.Primitive { list := tview.NewList() - list.SetBorder(true).SetTitle(" Active Configuration ").SetTitleColor(tcell.ColorAqua).SetBorderColor(tcell.ColorDarkCyan) - list.SetMainTextColor(tcell.ColorWhite) - list.SetSecondaryTextColor(tcell.ColorDarkGray) - list.SetSelectedStyle(tcell.StyleDefault.Background(tcell.ColorTeal).Foreground(tcell.ColorWhite)) - list.SetSelectedBackgroundColor(tcell.ColorTeal) - list.SetSelectedTextColor(tcell.ColorWhite) + list.SetBorder(true).SetTitle(" [#00f0ff::b] ACTIVE CONFIGURATION ").SetTitleColor(tcell.NewHexColor(0x00f0ff)).SetBorderColor(tcell.NewHexColor(0x00f0ff)) + list.SetMainTextColor(tcell.NewHexColor(0xe0e0e0)) + list.SetSecondaryTextColor(tcell.NewHexColor(0x808080)) + list.SetSelectedStyle(tcell.StyleDefault.Background(tcell.NewHexColor(0x39ff14)).Foreground(tcell.NewHexColor(0x050510))) + list.SetHighlightFullLine(true) + list.SetBackgroundColor(tcell.NewHexColor(0x050510)) rebuildList := func() { sel := list.GetCurrentItem() list.Clear() - list.AddItem("model: "+a.cfg.CurrentModelLabel(), "Enter to configure", 'm', func() { + list.AddItem("MODEL: "+a.cfg.CurrentModelLabel(), "Select to configure AI model", 'm', func() { a.navigateTo("schemes", a.newSchemesPage()) }) - list.AddItem("Quit", "", 'q', func() { a.tapp.Stop() }) + list.AddItem("QUIT SYSTEM", "Exit PicoClaw Launcher", 'q', func() { a.tapp.Stop() }) if sel >= 0 && sel < list.GetItemCount() { list.SetCurrentItem(sel) } @@ -34,5 +34,5 @@ func (a *App) newHomePage() tview.Primitive { a.pageRefreshFns["home"] = rebuildList - return a.buildShell("home", list, " m: configure model q: quit ") + return a.buildShell("home", list, " [#00f0ff]m:[-] configure model [#ff2a2a]q:[-] quit ") } diff --git a/cmd/picoclaw-launcher-tui/ui/models.go b/cmd/picoclaw-launcher-tui/ui/models.go index c9747d54..46daaeb3 100644 --- a/cmd/picoclaw-launcher-tui/ui/models.go +++ b/cmd/picoclaw-launcher-tui/ui/models.go @@ -33,17 +33,17 @@ func (a *App) newModelsPage(schemeName, userName, baseURL string) tview.Primitiv SetBorders(false). SetSelectable(true, false). SetFixed(0, 0) - table.SetBorder(true).SetTitle(fmt.Sprintf(" Models · %s / %s ", schemeName, userName)) - table.SetTitleColor(tcell.ColorAqua).SetBorderColor(tcell.ColorDarkCyan) - table.SetSelectedStyle(tcell.StyleDefault.Background(tcell.ColorTeal).Foreground(tcell.ColorWhite)) + table.SetBorder(true).SetTitle(fmt.Sprintf(" [#00f0ff::b] MODELS · %s / %s ", schemeName, userName)).SetTitleColor(tcell.NewHexColor(0x00f0ff)).SetBorderColor(tcell.NewHexColor(0x00f0ff)) + table.SetSelectedStyle(tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0xffffff))) + table.SetBackgroundColor(tcell.NewHexColor(0x050510)) var modelIDs []string status := tview.NewTextView(). SetTextAlign(tview.AlignCenter). SetDynamicColors(true). - SetText("[yellow]Fetching models…[-]") - status.SetBackgroundColor(tcell.ColorBlack) + SetText("[#ffff00]FETCHING MODELS...[-]") + status.SetBackgroundColor(tcell.NewHexColor(0x050510)) flex := tview.NewFlex(). SetDirection(tview.FlexRow). @@ -74,32 +74,32 @@ func (a *App) newModelsPage(schemeName, userName, baseURL string) tview.Primitiv a.tapp.QueueUpdateDraw(func() { if err != nil { - status.SetText(fmt.Sprintf("[red]Error: %s[-]", err.Error())) - table.SetCell(0, 0, tview.NewTableCell("(failed to load models)")) + status.SetText(fmt.Sprintf("[#ff2a2a]ERROR: %s[-]", err.Error())) + table.SetCell(0, 0, tview.NewTableCell(" (failed to load models)")) a.tapp.SetFocus(table) return } if len(entries) == 0 { - status.SetText("[yellow]No models returned[-]") - table.SetCell(0, 0, tview.NewTableCell("(no models available)")) + status.SetText("[#ff2a2a]NO MODELS RETURNED[-]") + table.SetCell(0, 0, tview.NewTableCell(" (no models available)")) a.tapp.SetFocus(table) return } - status.SetText(fmt.Sprintf("[lime]%d model(s) loaded[-]", len(entries))) + status.SetText(fmt.Sprintf("[#39ff14]%d MODEL(S) LOADED[-]", len(entries))) for i, m := range entries { modelIDs = append(modelIDs, m.ID) table.SetCell(i, 0, tview.NewTableCell(fmt.Sprintf("%3d", i+1)). SetAlign(tview.AlignRight). - SetTextColor(tcell.ColorGray). + SetTextColor(tcell.NewHexColor(0x808080)). SetSelectable(false), ) table.SetCell(i, 1, tview.NewTableCell(" "+m.ID). SetAlign(tview.AlignLeft). SetExpansion(1). - SetTextColor(tcell.ColorWhite), + SetTextColor(tcell.NewHexColor(0xe0e0e0)), ) } a.tapp.SetFocus(table) @@ -119,7 +119,7 @@ func (a *App) newModelsPage(schemeName, userName, baseURL string) tview.Primitiv a.goBack() }) - return a.buildShell("models", flex, " Enter: select ESC: back ") + return a.buildShell("models", flex, " [#39ff14]Enter:[-] select [#ff00ff]ESC:[-] back ") } func (a *App) resolveKey(schemeName, userName string) string { diff --git a/cmd/picoclaw-launcher-tui/ui/schemes.go b/cmd/picoclaw-launcher-tui/ui/schemes.go index 92cae3b4..70375ecc 100644 --- a/cmd/picoclaw-launcher-tui/ui/schemes.go +++ b/cmd/picoclaw-launcher-tui/ui/schemes.go @@ -17,9 +17,9 @@ func (a *App) newSchemesPage() tview.Primitive { table := tview.NewTable(). SetBorders(false). SetSelectable(true, false) - table.SetBorder(true).SetTitle(" Provider Schemes ") - table.SetTitleColor(tcell.ColorAqua).SetBorderColor(tcell.ColorDarkCyan) - table.SetSelectedStyle(tcell.StyleDefault.Background(tcell.ColorTeal).Foreground(tcell.ColorWhite)) + table.SetBorder(true).SetTitle(" [#00f0ff::b] PROVIDER SCHEMES ").SetTitleColor(tcell.NewHexColor(0x00f0ff)).SetBorderColor(tcell.NewHexColor(0x00f0ff)) + table.SetSelectedStyle(tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0xffffff))) + table.SetBackgroundColor(tcell.NewHexColor(0x050510)) rowToIdx := func(row int) int { return row / 2 } @@ -43,7 +43,7 @@ func (a *App) newSchemesPage() tview.Primitive { table.SetCell(nameRow, 0, tview.NewTableCell(" "+s.Name). - SetTextColor(tcell.ColorWhite). + SetTextColor(tcell.NewHexColor(0xe0e0e0)). SetExpansion(1). SetSelectable(true), ) @@ -57,14 +57,13 @@ func (a *App) newSchemesPage() tview.Primitive { } } table.SetCell(detailRow, 0, - tview.NewTableCell(fmt.Sprintf(" (%d/%d)%s", m, n, s.BaseURL)). - SetTextColor(tcell.ColorDarkGray). + tview.NewTableCell(fmt.Sprintf(" [#808080](%d/%d) %s", m, n, s.BaseURL)). + SetTextColor(tcell.NewHexColor(0x808080)). SetExpansion(1). SetSelectable(false), ) table.SetCell(detailRow, 1, - tview.NewTableCell(s.Type+" "). - SetTextColor(tcell.ColorDarkGray). + tview.NewTableCell("[#00f0ff]"+s.Type+" "). SetAlign(tview.AlignRight). SetSelectable(false), ) @@ -166,20 +165,20 @@ func (a *App) newSchemesPage() tview.Primitive { return event }) - return a.buildShell("schemes", table, " a: add e: edit d: delete Enter: open ESC: back ") + return a.buildShell("schemes", table, " [#00f0ff]a:[-] add [#00f0ff]e:[-] edit [#ff2a2a]d:[-] delete [#39ff14]Enter:[-] open [#ff00ff]ESC:[-] back ") } func (a *App) showSchemeForm(existing *tuicfg.Scheme, onSave func(tuicfg.Scheme)) { name := "" baseURL := "" schemeType := "openai-compatible" - title := " Add Scheme " + title := " ADD SCHEME " if existing != nil { name = existing.Name baseURL = existing.BaseURL schemeType = existing.Type - title = " Edit Scheme " + title = " EDIT SCHEME " } typeOptions := []string{"openai-compatible", "anthropic"} @@ -194,10 +193,10 @@ func (a *App) showSchemeForm(existing *tuicfg.Scheme, onSave func(tuicfg.Scheme) form := tview.NewForm() form. - AddInputField("Name", name, 32, nil, func(text string) { name = text }). - AddInputField("Base URL", baseURL, 32, nil, func(text string) { baseURL = text }). + AddInputField("Name", name, 20, nil, func(text string) { name = text }). + AddInputField("Base URL", baseURL, 28, nil, func(text string) { baseURL = text }). AddDropDown("Type", typeOptions, typeIdx, func(option string, _ int) { schemeType = option }). - AddButton("Save", func() { + AddButton("SAVE", func() { if name == "" { a.showError("Name is required") return @@ -217,17 +216,17 @@ func (a *App) showSchemeForm(existing *tuicfg.Scheme, onSave func(tuicfg.Scheme) a.hideModal("scheme-form") onSave(tuicfg.Scheme{Name: name, BaseURL: baseURL, Type: schemeType}) }). - AddButton("Cancel", func() { + AddButton("CANCEL", func() { a.hideModal("scheme-form") }) - form.SetBorder(true).SetTitle(title).SetTitleColor(tcell.ColorLime) - form.SetBorderColor(tcell.ColorDarkCyan) - form.SetFieldBackgroundColor(tcell.ColorBlack) - form.SetFieldTextColor(tcell.ColorWhite) - form.SetLabelColor(tcell.ColorAqua) - form.SetButtonBackgroundColor(tcell.ColorDarkCyan) - form.SetButtonTextColor(tcell.ColorWhite) + form.SetBorder(true).SetTitle(" [::b]" + title + " ").SetTitleColor(tcell.NewHexColor(0x39ff14)).SetBorderColor(tcell.NewHexColor(0x00f0ff)) + form.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) + form.SetFieldBackgroundColor(tcell.NewHexColor(0x050510)) + form.SetFieldTextColor(tcell.NewHexColor(0x00f0ff)) + form.SetLabelColor(tcell.NewHexColor(0xe0e0e0)) + form.SetButtonBackgroundColor(tcell.NewHexColor(0xff00ff)) + form.SetButtonTextColor(tcell.NewHexColor(0xffffff)) form.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyEscape { a.hideModal("scheme-form") @@ -236,5 +235,5 @@ func (a *App) showSchemeForm(existing *tuicfg.Scheme, onSave func(tuicfg.Scheme) return event }) - a.showModal("scheme-form", centeredForm(form, 6, 12)) + a.showModal("scheme-form", centeredForm(form, 4, 12)) } diff --git a/cmd/picoclaw-launcher-tui/ui/users.go b/cmd/picoclaw-launcher-tui/ui/users.go index f561938d..4a877d3c 100644 --- a/cmd/picoclaw-launcher-tui/ui/users.go +++ b/cmd/picoclaw-launcher-tui/ui/users.go @@ -17,9 +17,9 @@ func (a *App) newUsersPage(schemeName string) tview.Primitive { table := tview.NewTable(). SetBorders(false). SetSelectable(true, false) - table.SetBorder(true).SetTitle(fmt.Sprintf(" Users · %s ", schemeName)) - table.SetTitleColor(tcell.ColorAqua).SetBorderColor(tcell.ColorDarkCyan) - table.SetSelectedStyle(tcell.StyleDefault.Background(tcell.ColorTeal).Foreground(tcell.ColorWhite)) + table.SetBorder(true).SetTitle(fmt.Sprintf(" [#00f0ff::b] USERS · %s ", schemeName)).SetTitleColor(tcell.NewHexColor(0x00f0ff)).SetBorderColor(tcell.NewHexColor(0x00f0ff)) + table.SetSelectedStyle(tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0xffffff))) + table.SetBackgroundColor(tcell.NewHexColor(0x050510)) visibleUsers := func() []tuicfg.User { var out []tuicfg.User @@ -62,7 +62,7 @@ func (a *App) newUsersPage(schemeName string) tview.Primitive { table.SetCell(nameRow, 0, tview.NewTableCell(" "+u.Name). - SetTextColor(tcell.ColorWhite). + SetTextColor(tcell.NewHexColor(0xe0e0e0)). SetExpansion(1). SetSelectable(true), ) @@ -74,19 +74,18 @@ func (a *App) newUsersPage(schemeName string) tview.Primitive { models := a.cachedModels(schemeName, u.Name) var detailText string if len(models) > 0 { - detailText = fmt.Sprintf(" %d models", len(models)) + detailText = fmt.Sprintf(" [#39ff14]%d models available[-]", len(models)) } else { - detailText = " [red]Inactive[-]" + detailText = " [#ff2a2a]Inactive / No Access[-]" } table.SetCell(detailRow, 0, tview.NewTableCell(detailText). - SetTextColor(tcell.ColorDarkGray). + SetTextColor(tcell.NewHexColor(0x808080)). SetExpansion(1). SetSelectable(false), ) table.SetCell(detailRow, 1, - tview.NewTableCell(u.Type+" "). - SetTextColor(tcell.ColorDarkGray). + tview.NewTableCell("[#00f0ff]"+u.Type+" "). SetAlign(tview.AlignRight). SetSelectable(false), ) @@ -180,20 +179,20 @@ func (a *App) newUsersPage(schemeName string) tview.Primitive { return event }) - return a.buildShell("users", table, " a: add e: edit d: delete Enter: models ESC: back ") + return a.buildShell("users", table, " [#00f0ff]a:[-] add [#00f0ff]e:[-] edit [#ff2a2a]d:[-] delete [#39ff14]Enter:[-] models [#ff00ff]ESC:[-] back ") } func (a *App) showUserForm(schemeName string, existing *tuicfg.User, onSave func(tuicfg.User)) { name := "" userType := "key" key := "" - title := " Add User " + title := " ADD USER " if existing != nil { name = existing.Name userType = existing.Type key = existing.Key - title = " Edit User " + title = " EDIT USER " } typeOptions := []string{"key", "OAuth"} @@ -207,10 +206,10 @@ func (a *App) showUserForm(schemeName string, existing *tuicfg.User, onSave func form := tview.NewForm() form. - AddInputField("Name", name, 32, nil, func(text string) { name = text }). + AddInputField("Name", name, 20, nil, func(text string) { name = text }). AddDropDown("Type", typeOptions, typeIdx, func(option string, _ int) { userType = option }). - AddPasswordField("Key", key, 32, '*', func(text string) { key = text }). - AddButton("Save", func() { + AddPasswordField("Key", key, 28, '*', func(text string) { key = text }). + AddButton("SAVE", func() { if name == "" { a.showError("Name is required") return @@ -226,17 +225,17 @@ func (a *App) showUserForm(schemeName string, existing *tuicfg.User, onSave func a.hideModal("user-form") onSave(tuicfg.User{Name: name, Scheme: schemeName, Type: userType, Key: key}) }). - AddButton("Cancel", func() { + AddButton("CANCEL", func() { a.hideModal("user-form") }) - form.SetBorder(true).SetTitle(title).SetTitleColor(tcell.ColorLime) - form.SetBorderColor(tcell.ColorDarkCyan) - form.SetFieldBackgroundColor(tcell.ColorBlack) - form.SetFieldTextColor(tcell.ColorWhite) - form.SetLabelColor(tcell.ColorAqua) - form.SetButtonBackgroundColor(tcell.ColorDarkCyan) - form.SetButtonTextColor(tcell.ColorWhite) + form.SetBorder(true).SetTitle(" [::b]" + title + " ").SetTitleColor(tcell.NewHexColor(0x39ff14)).SetBorderColor(tcell.NewHexColor(0x00f0ff)) + form.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) + form.SetFieldBackgroundColor(tcell.NewHexColor(0x050510)) + form.SetFieldTextColor(tcell.NewHexColor(0x00f0ff)) + form.SetLabelColor(tcell.NewHexColor(0xe0e0e0)) + form.SetButtonBackgroundColor(tcell.NewHexColor(0xff00ff)) + form.SetButtonTextColor(tcell.NewHexColor(0xffffff)) form.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyEscape { a.hideModal("user-form") @@ -245,5 +244,5 @@ func (a *App) showUserForm(schemeName string, existing *tuicfg.User, onSave func return event }) - a.showModal("user-form", centeredForm(form, 6, 13)) + a.showModal("user-form", centeredForm(form, 4, 13)) }