common.go

 1package dialog
 2
 3import (
 4	"strings"
 5
 6	tea "charm.land/bubbletea/v2"
 7	"github.com/charmbracelet/crush/internal/ui/styles"
 8)
 9
10// InputCursor adjusts the cursor position for an input field within a dialog.
11func InputCursor(t *styles.Styles, cur *tea.Cursor) *tea.Cursor {
12	if cur != nil {
13		titleStyle := t.Dialog.Title
14		dialogStyle := t.Dialog.View
15		inputStyle := t.Dialog.InputPrompt
16		// Adjust cursor position to account for dialog layout
17		cur.X += inputStyle.GetBorderLeftSize() +
18			inputStyle.GetMarginLeft() +
19			inputStyle.GetPaddingLeft() +
20			dialogStyle.GetBorderLeftSize() +
21			dialogStyle.GetPaddingLeft() +
22			dialogStyle.GetMarginLeft()
23		cur.Y += titleStyle.GetVerticalFrameSize() +
24			inputStyle.GetBorderTopSize() +
25			inputStyle.GetMarginTop() +
26			inputStyle.GetPaddingTop() +
27			inputStyle.GetBorderBottomSize() +
28			inputStyle.GetMarginBottom() +
29			inputStyle.GetPaddingBottom() +
30			dialogStyle.GetPaddingTop() +
31			dialogStyle.GetMarginTop() +
32			dialogStyle.GetBorderTopSize()
33	}
34	return cur
35}
36
37// HeaderInputListHelpView generates a view for dialogs with a header, input,
38// list, and help sections.
39func HeaderInputListHelpView(t *styles.Styles, width, listHeight int, header, input, list, help string) string {
40	titleStyle := t.Dialog.Title
41	helpStyle := t.Dialog.HelpView
42	dialogStyle := t.Dialog.View.Width(width)
43	inputStyle := t.Dialog.InputPrompt
44	helpStyle = helpStyle.Width(width - dialogStyle.GetHorizontalFrameSize())
45	listStyle := t.Dialog.List.Height(listHeight)
46	listContent := listStyle.Render(list)
47
48	content := strings.Join([]string{
49		titleStyle.Render(header),
50		inputStyle.Render(input),
51		listContent,
52		helpStyle.Render(help),
53	}, "\n")
54
55	return dialogStyle.Render(content)
56}