117 lines
3.1 KiB
Go
117 lines
3.1 KiB
Go
package screens
|
|
|
|
import (
|
|
"github.com/calmcacil/wg-admin/internal/tui/components"
|
|
"github.com/charmbracelet/bubbletea"
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
// HelpScreen displays keyboard shortcuts
|
|
type HelpScreen struct {
|
|
previousScreen Screen
|
|
}
|
|
|
|
// NewHelpScreen creates a new help screen
|
|
func NewHelpScreen(previous Screen) *HelpScreen {
|
|
return &HelpScreen{
|
|
previousScreen: previous,
|
|
}
|
|
}
|
|
|
|
// Init initializes the help screen
|
|
func (s *HelpScreen) Init() tea.Cmd {
|
|
return nil
|
|
}
|
|
|
|
// Update handles messages for the help screen
|
|
func (s *HelpScreen) Update(msg tea.Msg) (Screen, tea.Cmd) {
|
|
switch msg := msg.(type) {
|
|
case tea.KeyMsg:
|
|
switch msg.String() {
|
|
case "q", "esc":
|
|
// Return to previous screen
|
|
return s.previousScreen, nil
|
|
}
|
|
}
|
|
return s, nil
|
|
}
|
|
|
|
// View renders the help screen
|
|
func (s *HelpScreen) View() string {
|
|
// Breadcrumb: Help
|
|
breadcrumb := components.RenderBreadcrumb([]components.BreadcrumbItem{{Label: "Help", ID: "help"}})
|
|
|
|
|
|
// Styles
|
|
borderStyle := lipgloss.NewStyle().
|
|
BorderStyle(lipgloss.RoundedBorder()).
|
|
BorderForeground(lipgloss.Color("62")).
|
|
Padding(1, 2)
|
|
|
|
headerStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("62")).
|
|
Bold(true).
|
|
MarginBottom(1)
|
|
|
|
categoryStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("226")).
|
|
Bold(true).
|
|
MarginTop(1).
|
|
MarginBottom(0)
|
|
|
|
keyStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("63")).
|
|
Bold(true).
|
|
Width(12)
|
|
|
|
descStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("250"))
|
|
|
|
// Header
|
|
header := headerStyle.Render("Keyboard Shortcuts")
|
|
|
|
// Shortcut groups
|
|
navigationGroup := categoryStyle.Render("Navigation") + "\n" +
|
|
keyStyle.Render("j / ↓") + descStyle.Render("Move down") + "\n" +
|
|
keyStyle.Render("k / ↑") + descStyle.Render("Move up") + "\n" +
|
|
keyStyle.Render("← →") + descStyle.Render("Move left/right") + "\n" +
|
|
keyStyle.Render("Enter") + descStyle.Render("Select") + "\n" +
|
|
keyStyle.Render("Esc") + descStyle.Render("Go back")
|
|
|
|
actionsGroup := categoryStyle.Render("Actions") + "\n" +
|
|
keyStyle.Render("a") + descStyle.Render("Add client") + "\n" +
|
|
keyStyle.Render("d") + descStyle.Render("Delete client") + "\n" +
|
|
keyStyle.Render("Q") + descStyle.Render("Show QR code") + "\n" +
|
|
keyStyle.Render("r") + descStyle.Render("Refresh list") + "\n" +
|
|
keyStyle.Render("l") + descStyle.Render("List view")
|
|
|
|
otherGroup := categoryStyle.Render("Other") + "\n" +
|
|
keyStyle.Render("?") + descStyle.Render("Show this help") + "\n" +
|
|
keyStyle.Render("/") + descStyle.Render("Search") + "\n" +
|
|
keyStyle.Render("q") + descStyle.Render("Quit")
|
|
|
|
// Two-column layout
|
|
leftColumn := lipgloss.JoinVertical(lipgloss.Left,
|
|
navigationGroup,
|
|
"",
|
|
actionsGroup,
|
|
)
|
|
|
|
rightColumn := lipgloss.JoinVertical(lipgloss.Left,
|
|
otherGroup,
|
|
)
|
|
|
|
content := lipgloss.JoinHorizontal(lipgloss.Top, leftColumn, " ", rightColumn)
|
|
|
|
// Footer
|
|
footerStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("241")).
|
|
MarginTop(1)
|
|
footer := footerStyle.Render("Press q or Esc to return")
|
|
|
|
// Combine all
|
|
return breadcrumb + "\n\n" + borderStyle.Render(
|
|
lipgloss.JoinVertical(lipgloss.Left, header, content, footer),
|
|
)
|
|
}
|