diff --git a/cmd/picoclaw-launcher-tui/ui/app.go b/cmd/picoclaw-launcher-tui/ui/app.go index b0f1799ea..53d1cf8cd 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 af25f9b43..4e952d534 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 c9747d544..46daaeb3e 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 92cae3b42..70375eccc 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 f561938d5..4a877d3c7 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)) }