ui

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 19, 2026 License: AGPL-3.0 Imports: 19 Imported by: 0

Documentation

Index

Constants

View Source
const (
	SidebarAll       = "__all__"
	SidebarUngrouped = "__ungrouped__"
)
View Source
const (
	PreviewTab int = iota
	DiffTab
	GitTab
)
View Source
const ZoneRepoSwitch = "repo-switch"

ZoneRepoSwitch is the bubblezone ID for the clickable repo indicator.

Variables

View Source
var (
	AdditionStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#22c55e"))
	DeletionStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#ef4444"))
	HunkStyle     = lipgloss.NewStyle().Foreground(lipgloss.Color("#0ea5e9"))
)
View Source
var FallBackText = lipgloss.JoinVertical(lipgloss.Center,
	GradientText(fallbackBannerRaw, "#F0A868", "#7EC8D8"))

Functions

func AdjustPreviewWidth

func AdjustPreviewWidth(width int) int

AdjustPreviewWidth adjusts the width of the preview pane to be 90% of the provided width.

func GradientBar

func GradientBar(width, filled int, startHex, endHex string) string

GradientBar renders a progress bar of `width` characters with `filled` filled blocks. Filled portion uses a gradient from startHex to endHex; unfilled uses dim blocks.

func GradientText

func GradientText(text, startHex, endHex string) string

GradientText renders a string with a left-to-right truecolor gradient from startHex to endHex. Newlines are preserved; ANSI reset appended.

Types

type DiffPane

type DiffPane struct {
	// contains filtered or unexported fields
}

func NewDiffPane

func NewDiffPane() *DiffPane

func (*DiffPane) FileDown

func (d *DiffPane) FileDown()

func (*DiffPane) FileUp

func (d *DiffPane) FileUp()

func (*DiffPane) HasFiles

func (d *DiffPane) HasFiles() bool

func (*DiffPane) ScrollDown

func (d *DiffPane) ScrollDown()

func (*DiffPane) ScrollUp

func (d *DiffPane) ScrollUp()

func (*DiffPane) SetDiff

func (d *DiffPane) SetDiff(instance *session.Instance)

func (*DiffPane) SetSize

func (d *DiffPane) SetSize(width, height int)

func (*DiffPane) String

func (d *DiffPane) String() string

type GitPane

type GitPane struct {
	// contains filtered or unexported fields
}

GitPane manages an interactive lazygit subprocess inside a tmux session, rendered via tmux capture-pane through an EmbeddedTerminal.

func NewGitPane

func NewGitPane() *GitPane

NewGitPane creates a new GitPane (no subprocess yet).

func (*GitPane) IsRunning

func (g *GitPane) IsRunning() bool

IsRunning returns true if a lazygit session is active.

func (*GitPane) Kill

func (g *GitPane) Kill()

Kill stops the lazygit subprocess and cleans up resources.

func (*GitPane) NeedsRespawn

func (g *GitPane) NeedsRespawn(instanceTitle string) bool

NeedsRespawn returns true if the current instance differs from what's running.

func (*GitPane) Render

func (g *GitPane) Render() (string, bool)

Render returns the current terminal frame content.

func (*GitPane) SendKey

func (g *GitPane) SendKey(data []byte) error

SendKey forwards raw key bytes to the lazygit PTY via the embedded terminal. If the write fails (e.g. lazygit exited), it cleans up the dead session.

func (*GitPane) SetSize

func (g *GitPane) SetSize(width, height int)

SetSize updates the PTY and tmux window dimensions.

func (*GitPane) Spawn

func (g *GitPane) Spawn(worktreePath, instanceTitle string)

Spawn starts a lazygit process inside a tmux session in the given worktree directory. If lazygit is already running for a different instance, it kills the old one first.

func (*GitPane) String

func (g *GitPane) String() string

String returns the current frame for display.

type InstanceRenderer

type InstanceRenderer struct {
	// contains filtered or unexported fields
}

InstanceRenderer handles rendering of session.Instance objects

func (*InstanceRenderer) Render

func (r *InstanceRenderer) Render(i *session.Instance, selected bool, focused bool, hasMultipleRepos bool, rowIndex int) string

type List

type List struct {
	// contains filtered or unexported fields
}

func NewList

func NewList(spinner *spinner.Model, autoYes bool) *List

func (*List) AddInstance

func (l *List) AddInstance(instance *session.Instance) (finalize func())

AddInstance adds a new instance to the list. It returns a finalizer function that should be called when the instance is started. If the instance was restored from storage or is paused, you can call the finalizer immediately. When creating a new one and entering the name, you want to call the finalizer once the name is done.

func (*List) Attach

func (l *List) Attach() (chan struct{}, error)

func (*List) Clear

func (l *List) Clear()

Clear removes all instances from the list.

func (*List) CycleSortMode

func (l *List) CycleSortMode()

CycleSortMode advances to the next sort mode and rebuilds.

func (*List) Down

func (l *List) Down()

Down selects the next item in the list.

func (*List) GetInstances

func (l *List) GetInstances() []*session.Instance

GetInstances returns all instances (unfiltered) for persistence and metadata updates.

func (*List) GetItemAtRow

func (l *List) GetItemAtRow(row int) int

GetItemAtRow maps a row offset (relative to the first item) to an item index. Returns -1 if the row doesn't correspond to any item.

func (*List) GetSelectedIdx

func (l *List) GetSelectedIdx() int

GetSelectedIdx returns the index of the currently selected item in the filtered list.

func (*List) GetSelectedInstance

func (l *List) GetSelectedInstance() *session.Instance

GetSelectedInstance returns the currently selected instance

func (*List) GetSortMode

func (l *List) GetSortMode() SortMode

GetSortMode returns the current sort mode.

func (*List) GetStatusFilter

func (l *List) GetStatusFilter() StatusFilter

GetStatusFilter returns the current status filter.

func (*List) HandleTabClick

func (l *List) HandleTabClick(localX, localY int) (StatusFilter, bool)

HandleTabClick checks if a click at the given local coordinates (relative to the list's top-left corner) hits a filter tab. Returns the filter and true if a tab was clicked, or false if the click was outside the tab area.

func (*List) Kill

func (l *List) Kill()

Kill removes and kills the currently selected instance.

func (*List) KillInstancesByTopic

func (l *List) KillInstancesByTopic(topicName string)

KillInstancesByTopic kills and removes all instances belonging to the given topic.

func (*List) NumInstances

func (l *List) NumInstances() int

func (*List) SetFilter

func (l *List) SetFilter(topicFilter string)

SetFilter filters the displayed instances by topic name. Empty string shows all. SidebarUngrouped shows only ungrouped instances.

func (*List) SetFocused

func (l *List) SetFocused(focused bool)

func (*List) SetSearchFilter

func (l *List) SetSearchFilter(query string)

SetSearchFilter filters instances by search query across all topics. SetSearchFilter filters instances by search query across all topics.

func (*List) SetSearchFilterWithTopic

func (l *List) SetSearchFilterWithTopic(query string, topicFilter string)

SetSearchFilterWithTopic filters instances by search query, optionally scoped to a topic. topicFilter: "" = all topics, "__ungrouped__" = ungrouped only, otherwise = specific topic.

func (*List) SetSelectedInstance

func (l *List) SetSelectedInstance(idx int)

SetSelectedInstance sets the selected index. Noop if the index is out of bounds.

func (*List) SetSessionPreviewSize

func (l *List) SetSessionPreviewSize(width, height int) (err error)

SetSessionPreviewSize sets the height and width for the tmux sessions. This makes the stdout line have the correct width and height.

func (*List) SetSize

func (l *List) SetSize(width, height int)

SetSize sets the height and width of the list.

func (*List) SetStatusFilter

func (l *List) SetStatusFilter(filter StatusFilter)

SetStatusFilter sets the status filter and rebuilds the filtered items.

func (*List) String

func (l *List) String() string

func (*List) TotalInstances

func (l *List) TotalInstances() int

TotalInstances returns the total number of instances regardless of filter.

func (*List) Up

func (l *List) Up()

Up selects the prev item in the list.

type Menu struct {
	// contains filtered or unexported fields
}

func NewMenu

func NewMenu() *Menu
func (m *Menu) ClearKeydown()
func (m *Menu) Keydown(name keys.KeyName)
func (m *Menu) SetInDiffTab(inDiffTab bool)

SetInDiffTab updates whether we're currently in the diff tab

func (m *Menu) SetInstance(instance *session.Instance)

SetInstance updates the current instance and refreshes menu options

func (m *Menu) SetSize(width, height int)

SetSize sets the width of the window. The menu will be centered horizontally within this width.

func (m *Menu) SetState(state MenuState)

SetState updates the menu state and options accordingly

func (m *Menu) String() string
type MenuState int

MenuState represents different states the menu can be in

const (
	StateDefault MenuState = iota
	StateEmpty
	StateNewInstance
	StatePrompt
)

type PreviewPane

type PreviewPane struct {
	// contains filtered or unexported fields
}

func NewPreviewPane

func NewPreviewPane() *PreviewPane

func (*PreviewPane) ResetToNormalMode

func (p *PreviewPane) ResetToNormalMode(instance *session.Instance) error

ResetToNormalMode exits scroll mode and returns to normal mode

func (*PreviewPane) ScrollDown

func (p *PreviewPane) ScrollDown(instance *session.Instance) error

ScrollDown scrolls down in the viewport

func (*PreviewPane) ScrollUp

func (p *PreviewPane) ScrollUp(instance *session.Instance) error

ScrollUp scrolls up in the viewport

func (*PreviewPane) SetRawContent

func (p *PreviewPane) SetRawContent(content string)

SetRawContent sets the preview content directly from a pre-rendered string. Used by the embedded terminal emulator in focus mode.

func (*PreviewPane) SetSize

func (p *PreviewPane) SetSize(width, maxHeight int)

func (*PreviewPane) String

func (p *PreviewPane) String() string

Returns the preview pane content as a string.

func (*PreviewPane) UpdateContent

func (p *PreviewPane) UpdateContent(instance *session.Instance) error

Updates the preview pane content with the tmux pane content

type Sidebar struct {
	// contains filtered or unexported fields
}

Sidebar is the left-most panel showing topics and search.

func NewSidebar

func NewSidebar() *Sidebar

func (*Sidebar) ActivateSearch

func (s *Sidebar) ActivateSearch()

func (*Sidebar) ClickItem

func (s *Sidebar) ClickItem(row int)

ClickItem selects a sidebar item by its rendered row offset (0-indexed from the first item). Section headers count as a row but are skipped for selection.

func (*Sidebar) DeactivateSearch

func (s *Sidebar) DeactivateSearch()

func (*Sidebar) Down

func (s *Sidebar) Down()

func (*Sidebar) GetSearchQuery

func (s *Sidebar) GetSearchQuery() string

func (*Sidebar) GetSelectedID

func (s *Sidebar) GetSelectedID() string

func (*Sidebar) GetSelectedIdx

func (s *Sidebar) GetSelectedIdx() int

GetSelectedIdx returns the index of the currently selected item in the sidebar.

func (*Sidebar) IsFocused

func (s *Sidebar) IsFocused() bool

func (*Sidebar) IsSearchActive

func (s *Sidebar) IsSearchActive() bool

func (*Sidebar) SelectFirst

func (s *Sidebar) SelectFirst()

SelectFirst selects the first non-section item (typically "All").

func (*Sidebar) SetFocused

func (s *Sidebar) SetFocused(focused bool)

func (*Sidebar) SetItems

func (s *Sidebar) SetItems(topicNames []string, instanceCountByTopic map[string]int, ungroupedCount int, sharedTopics map[string]bool, topicStatuses map[string]TopicStatus)

SetItems updates the sidebar items from the current topics. sharedTopics maps topic name → whether it has a shared worktree. topicStatuses maps topic name → running/notification status.

func (*Sidebar) SetRepoHovered

func (s *Sidebar) SetRepoHovered(hovered bool)

SetRepoHovered sets whether the mouse is hovering over the repo button.

func (*Sidebar) SetRepoName

func (s *Sidebar) SetRepoName(name string)

SetRepoName sets the current repo name displayed at the bottom of the sidebar.

func (*Sidebar) SetSearchQuery

func (s *Sidebar) SetSearchQuery(q string)

func (*Sidebar) SetSize

func (s *Sidebar) SetSize(width, height int)

func (*Sidebar) String

func (s *Sidebar) String() string

func (*Sidebar) Up

func (s *Sidebar) Up()

func (*Sidebar) UpdateMatchCounts

func (s *Sidebar) UpdateMatchCounts(matchesByTopic map[string]int, totalMatches int)

UpdateMatchCounts sets the search match counts for each topic item. Pass nil to clear search highlighting.

type SidebarItem

type SidebarItem struct {
	Name            string
	ID              string
	IsSection       bool
	Count           int
	MatchCount      int  // search match count (-1 = not searching)
	SharedWorktree  bool // true if this topic has a shared worktree
	HasRunning      bool // true if this topic has running instances
	HasNotification bool // true if this topic has recently-finished instances
}

SidebarItem represents a selectable item in the sidebar.

type SortMode

type SortMode int

SortMode determines how instances are ordered.

const (
	SortNewest SortMode = iota // Most recently updated first (default)
	SortOldest                 // Oldest first
	SortName                   // Alphabetical by title
	SortStatus                 // Grouped by status: running, ready, paused
)

type StatusFilter

type StatusFilter int

StatusFilter determines which instances are shown based on their status.

const (
	StatusFilterAll    StatusFilter = iota // Show all instances
	StatusFilterActive                     // Show only non-paused instances
)

type Tab

type Tab struct {
	Name   string
	Render func(width int, height int) string
}

type TabbedWindow

type TabbedWindow struct {
	// contains filtered or unexported fields
}

TabbedWindow has tabs at the top of a pane which can be selected. The tabs take up one rune of height.

func NewTabbedWindow

func NewTabbedWindow(preview *PreviewPane, diff *DiffPane, git *GitPane) *TabbedWindow

func (*TabbedWindow) ContentScrollDown

func (w *TabbedWindow) ContentScrollDown()

ContentScrollDown scrolls content without file navigation (for mouse wheel). No-op for git tab.

func (*TabbedWindow) ContentScrollUp

func (w *TabbedWindow) ContentScrollUp()

ContentScrollUp scrolls content without file navigation (for mouse wheel). No-op for git tab.

func (*TabbedWindow) GetActiveTab

func (w *TabbedWindow) GetActiveTab() int

GetActiveTab returns the currently active tab index.

func (*TabbedWindow) GetGitPane

func (w *TabbedWindow) GetGitPane() *GitPane

GetGitPane returns the git pane for external control.

func (*TabbedWindow) GetPreviewSize

func (w *TabbedWindow) GetPreviewSize() (width, height int)

func (*TabbedWindow) HandleTabClick

func (w *TabbedWindow) HandleTabClick(localX, localY int) bool

HandleTabClick checks if a click at the given local coordinates (relative to the tabbed window's top-left) hits a tab header. Returns true and switches tabs if a tab was clicked.

func (*TabbedWindow) IsFocusMode

func (w *TabbedWindow) IsFocusMode() bool

IsFocusMode returns whether the window is in focus/insert mode.

func (*TabbedWindow) IsInDiffTab

func (w *TabbedWindow) IsInDiffTab() bool

IsInDiffTab returns true if the diff tab is currently active

func (*TabbedWindow) IsInGitTab

func (w *TabbedWindow) IsInGitTab() bool

IsInGitTab returns true if the git tab is currently active

func (*TabbedWindow) IsPreviewInScrollMode

func (w *TabbedWindow) IsPreviewInScrollMode() bool

IsPreviewInScrollMode returns true if the preview pane is in scroll mode

func (*TabbedWindow) ResetPreviewToNormalMode

func (w *TabbedWindow) ResetPreviewToNormalMode(instance *session.Instance) error

ResetPreviewToNormalMode resets the preview pane to normal mode

func (*TabbedWindow) ScrollDown

func (w *TabbedWindow) ScrollDown()

ScrollDown scrolls content. In preview tab, scrolls the preview. In diff tab, navigates to the next file if files exist, otherwise scrolls. No-op for git tab (lazygit handles its own scrolling).

func (*TabbedWindow) ScrollUp

func (w *TabbedWindow) ScrollUp()

ScrollUp scrolls content. In preview tab, scrolls the preview. In diff tab, navigates to the previous file if files exist, otherwise scrolls. No-op for git tab (lazygit handles its own scrolling).

func (*TabbedWindow) SetActiveTab

func (w *TabbedWindow) SetActiveTab(tab int)

SetActiveTab sets the active tab by index.

func (*TabbedWindow) SetFocusMode

func (w *TabbedWindow) SetFocusMode(enabled bool)

SetFocusMode enables or disables the focus/insert mode visual indicator.

func (*TabbedWindow) SetGitContent

func (w *TabbedWindow) SetGitContent(content string)

SetGitContent caches the git pane content to avoid re-rendering when unchanged.

func (*TabbedWindow) SetInstance

func (w *TabbedWindow) SetInstance(instance *session.Instance)

func (*TabbedWindow) SetPreviewContent

func (w *TabbedWindow) SetPreviewContent(content string)

SetPreviewContent sets the preview pane content directly from a pre-rendered string. Used by the embedded terminal in focus mode to bypass tmux capture-pane.

func (*TabbedWindow) SetSize

func (w *TabbedWindow) SetSize(width, height int)

func (*TabbedWindow) String

func (w *TabbedWindow) String() string

func (*TabbedWindow) Toggle

func (w *TabbedWindow) Toggle()

func (*TabbedWindow) ToggleWithReset

func (w *TabbedWindow) ToggleWithReset(instance *session.Instance) error

ToggleWithReset toggles the tab and resets preview pane to normal mode

func (*TabbedWindow) UpdateDiff

func (w *TabbedWindow) UpdateDiff(instance *session.Instance)

func (*TabbedWindow) UpdatePreview

func (w *TabbedWindow) UpdatePreview(instance *session.Instance) error

UpdatePreview updates the content of the preview pane. instance may be nil.

type TopicStatus

type TopicStatus struct {
	HasRunning      bool
	HasNotification bool
}

TopicStatus holds status flags for a topic's instances.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL