@@ -82,7 +82,7 @@ type UI struct {
8282 keyenh tea.KeyboardEnhancementsMsg
8383
8484 dialog *dialog.Overlay
85− help help.Model
85+ status *Status
8686
8787 // header is the last cached header logo
8888 header string
@@ -137,13 +137,14 @@ func New(com *common.Common) *UI {
137137 com: com,
138138 dialog: dialog.NewOverlay(),
139139 keyMap: DefaultKeyMap(),
140− help: help.New(),
141140 focus: uiFocusNone,
142141 state: uiConfigure,
143142 textarea: ta,
144143 chat: ch,
145144 }
146145
146+ status := NewStatus(com, ui)
147+
147148 // set onboarding state defaults
148149 ui.onboarding.yesInitializeSelected = true
149150
@@ -162,7 +163,7 @@ func New(com *common.Common) *UI {
162163 ui.setEditorPrompt(false)
163164 ui.randomizePlaceholders()
164165 ui.textarea.Placeholder = ui.readyPlaceholder
165− ui.help.Styles = com.Styles.Help
166+ ui.status = status
166167
167168 return ui
168169}
@@ -338,6 +339,15 @@ func (m *UI) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
338339 case openEditorMsg:
339340 m.textarea.SetValue(msg.Text)
340341 m.textarea.MoveToEnd()
342+ case uiutil.InfoMsg:
343+ m.status.SetInfoMsg(msg)
344+ ttl := msg.TTL
345+ if ttl <= 0 {
346+ ttl = DefaultStatusTTL
347+ }
348+ cmds = append(cmds, clearInfoMsgCmd(ttl))
349+ case uiutil.ClearStatusMsg:
350+ m.status.ClearInfoMsg()
341351 }
342352
343353 // This logic gets triggered on any message type, but should it?
@@ -480,7 +490,7 @@ func (m *UI) handleKeyPressMsg(msg tea.KeyPressMsg) tea.Cmd {
480490 handleGlobalKeys := func(msg tea.KeyPressMsg) bool {
481491 switch {
482492 case key.Matches(msg, m.keyMap.Help):
483− m.help.ShowAll = !m.help.ShowAll
493+ m.status.ToggleHelp()
484494 m.updateLayoutAndSize()
485495 return true
486496 case key.Matches(msg, m.keyMap.Commands):
@@ -569,7 +579,7 @@ func (m *UI) handleKeyPressMsg(msg tea.KeyPressMsg) tea.Cmd {
569579 cmds = append(cmds, uiutil.ReportError(err))
570580 }
571581 case dialog.ToggleHelpMsg:
572− m.help.ShowAll = !m.help.ShowAll
582+ m.status.ToggleHelp()
573583 m.dialog.CloseDialog(dialog.CommandsID)
574584 case dialog.QuitMsg:
575585 cmds = append(cmds, tea.Quit)
@@ -815,9 +825,8 @@ func (m *UI) Draw(scr uv.Screen, area uv.Rectangle) {
815825 editor.Draw(scr, layout.editor)
816826 }
817827
818− // Add help layer
819− help := uv.NewStyledString(m.help.View(m))
820− help.Draw(scr, layout.help)
828+ // Add status and help layer
829+ m.status.Draw(scr, layout.status)
821830
822831 // Debugging rendering (visually see when the tui rerenders)
823832 if os.Getenv("CRUSH_UI_DEBUG") == "true" {
@@ -1077,8 +1086,8 @@ func (m *UI) updateLayoutAndSize() {
10771086
10781087// updateSize updates the sizes of UI components based on the current layout.
10791088func (m *UI) updateSize() {
1080− // Set help width
1081− m.help.SetWidth(m.layout.help.Dx())
1089+ // Set status width
1090+ m.status.SetWidth(m.layout.status.Dx())
10821091
10831092 m.chat.SetSize(m.layout.main.Dx(), m.layout.main.Dy())
10841093 m.textarea.SetWidth(m.layout.editor.Dx())
@@ -1115,18 +1124,16 @@ func (m *UI) generateLayout(w, h int) layout {
11151124 headerHeight := 4
11161125
11171126 var helpKeyMap help.KeyMap = m
1118− if m.help.ShowAll {
1127+ if m.status.ShowingAll() {
11191128 for _, row := range helpKeyMap.FullHelp() {
11201129 helpHeight = max(helpHeight, len(row))
11211130 }
11221131 }
11231132
11241133 // Add app margins
1125− appRect := area
1134+ appRect, helpRect := uv.SplitVertical(area, uv.Fixed(area.Dy()-helpHeight))
11261135 appRect.Min.X += 1
1127− appRect.Min.Y += 1
11281136 appRect.Max.X -= 1
1129− appRect.Max.Y -= 1
11301137
11311138 if slices.Contains([]uiState{uiConfigure, uiInitialize, uiLanding}, m.state) {
11321139 // extra padding on left and right for these states
@@ -1134,11 +1141,9 @@ func (m *UI) generateLayout(w, h int) layout {
11341141 appRect.Max.X -= 1
11351142 }
11361143
1137− appRect, helpRect := uv.SplitVertical(appRect, uv.Fixed(appRect.Dy()-helpHeight))
1138−
11391144 layout := layout{
1140− area: area,
1141− help: helpRect,
1145+ area: area,
1146+ status: helpRect,
11421147 }
11431148
11441149 // Handle different app states
@@ -1242,8 +1247,8 @@ type layout struct {
12421247 // sidebar is the area for the sidebar.
12431248 sidebar uv.Rectangle
12441249
1245− // help is the area for the help view.
1246− help uv.Rectangle
1250+ // status is the area for the status view.
1251+ status uv.Rectangle
12471252}
12481253
12491254func (m *UI) openEditor(value string) tea.Cmd {