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}