Diff
1diff --git a/ui/components/selector/selector.go b/ui/components/selector/selector.go
2index 4beea1fe3e6ca934688c680bcebdeceaf9af6a73..9c99755f506837eb7ac86ab83c2b3ad2871a1d5b 100644
3--- a/ui/components/selector/selector.go
4+++ b/ui/components/selector/selector.go
5@@ -143,6 +143,20 @@ func (s *Selector) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
6 s.Model.CursorUp()
7 case tea.MouseWheelDown:
8 s.Model.CursorDown()
9+ case tea.MouseLeft:
10+ curIdx := s.Model.Index()
11+ for i, item := range s.Model.Items() {
12+ item, _ := item.(IdentifiableItem)
13+ // Check each item to see if it's in bounds.
14+ if item != nil && s.common.Zone.Get(item.ID()).InBounds(msg) {
15+ if i == curIdx {
16+ cmds = append(cmds, s.selectCmd)
17+ } else {
18+ s.Model.Select(i)
19+ }
20+ break
21+ }
22+ }
23 }
24 case tea.KeyMsg:
25 filterState := s.Model.FilterState()
26diff --git a/ui/pages/repo/filesitem.go b/ui/pages/repo/filesitem.go
27index 1934b440ad5ab1bea0869403dfbdcaf226b3d87f..1d64cb8d13e1ed7ba3262159dfc6686d6bc00ba0 100644
28--- a/ui/pages/repo/filesitem.go
29+++ b/ui/pages/repo/filesitem.go
30@@ -146,10 +146,13 @@ func (d FileItemDelegate) Render(w io.Writer, m list.Model, index int, listItem
31 s.Selector.GetHorizontalFrameSize() -
32 s.Selector.GetWidth())
33 fmt.Fprint(w,
34- truncate.Render(fmt.Sprintf("%s%s%s",
35- modeStr,
36- size,
37- name,
38- )),
39+ d.common.Zone.Mark(
40+ i.ID(),
41+ truncate.Render(fmt.Sprintf("%s%s%s",
42+ modeStr,
43+ size,
44+ name,
45+ )),
46+ ),
47 )
48 }
49diff --git a/ui/pages/repo/logitem.go b/ui/pages/repo/logitem.go
50index 410a7e90e12013db11fc907820e6602d853d1758..b30c21d67f4b371c121b0007c5b93073811e078d 100644
51--- a/ui/pages/repo/logitem.go
52+++ b/ui/pages/repo/logitem.go
53@@ -137,13 +137,16 @@ func (d LogItemDelegate) Render(w io.Writer, m list.Model, index int, listItem l
54 who += styles.Desc.Render("on ") + styles.Keyword.Render(date)
55 who = common.TruncateString(who, m.Width()-horizontalFrameSize)
56 fmt.Fprint(w,
57- styles.Base.Render(
58- lipgloss.JoinVertical(lipgloss.Top,
59- truncate.String(fmt.Sprintf("%s%s",
60- title,
61- hash,
62- ), uint(m.Width()-horizontalFrameSize)),
63- who,
64+ d.common.Zone.Mark(
65+ i.ID(),
66+ styles.Base.Render(
67+ lipgloss.JoinVertical(lipgloss.Top,
68+ truncate.String(fmt.Sprintf("%s%s",
69+ title,
70+ hash,
71+ ), uint(m.Width()-horizontalFrameSize)),
72+ who,
73+ ),
74 ),
75 ),
76 )
77diff --git a/ui/pages/repo/refsitem.go b/ui/pages/repo/refsitem.go
78index cfae1a3d4aaf12e3293d20f818269d9b1f99a29e..ec378696f450278914c13eadf51f25b1b458a95e 100644
79--- a/ui/pages/repo/refsitem.go
80+++ b/ui/pages/repo/refsitem.go
81@@ -121,5 +121,10 @@ func (d RefItemDelegate) Render(w io.Writer, m list.Model, index int, listItem l
82 s.Normal.Item.GetMarginLeft()
83 ref = common.TruncateString(ref, refMaxWidth)
84 ref = st.Render(ref)
85- fmt.Fprint(w, selector, ref)
86+ fmt.Fprint(w,
87+ d.common.Zone.Mark(
88+ i.ID(),
89+ fmt.Sprint(selector, ref),
90+ ),
91+ )
92 }
93diff --git a/ui/pages/selection/item.go b/ui/pages/selection/item.go
94index 3db9edeb142ef0c3887a3aec3e0d6e9e97726666..97abe72c1669a702c352183db1118ce84adeb58c 100644
95--- a/ui/pages/selection/item.go
96+++ b/ui/pages/selection/item.go
97@@ -141,5 +141,9 @@ func (d ItemDelegate) Render(w io.Writer, m list.Model, index int, listItem list
98 cmd = styles.Command.Render("Copied!")
99 }
100 s.WriteString(cmd)
101- fmt.Fprint(w, styles.Base.Render(s.String()))
102+ fmt.Fprint(w,
103+ d.common.Zone.Mark(i.ID(),
104+ styles.Base.Render(s.String()),
105+ ),
106+ )
107 }
108diff --git a/ui/ui.go b/ui/ui.go
109index 2e0db8c8009d6d2048e76d2585216df9d6dcdc55..43ed760d82db723a7d3f6503774e91e3cd36a624 100644
110--- a/ui/ui.go
111+++ b/ui/ui.go
112@@ -186,6 +186,8 @@ func (ui *UI) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
113 case key.Matches(msg, ui.common.KeyMap.Help):
114 cmds = append(cmds, footer.ToggleFooterCmd)
115 case key.Matches(msg, ui.common.KeyMap.Quit):
116+ // Stop bubblezone background workers.
117+ ui.common.Zone.Close()
118 return ui, tea.Quit
119 case ui.activePage == repoPage && key.Matches(msg, ui.common.KeyMap.Back):
120 ui.activePage = selectionPage