Skip to content

Commit bb567b8

Browse files
fix(ui): resolve footer visibility and layout issues
* Fix footer disappearing during theme changes or in specific modes (Palette, Help, Theme Menu) * Optimize footer keybinding hints to prevent layout wrapping * Add missing icons to the footer for UI consistency * Fix overlay modes incorrectly occupying full terminal height * Refactor component sizing to be handled dynamically in `renderMainUI` * Update version to 1.2.1 in `VERSION.txt`, `CHANGELOG.md`, and Lua API
1 parent 2273edd commit bb567b8

5 files changed

Lines changed: 54 additions & 53 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.2.1]
9+
10+
### Fixed
11+
12+
* **Footer Rendering**: Fixed an issue where the footer would disappear during theme changes or in specific application modes (Palette, Help, Theme Menu).
13+
* **Footer Layout**: Optimized footer keybinding hints to be more compact, preventing layout wrapping and ensuring visibility on standard terminal widths.
14+
* **UI Consistency**: Added missing icons to the footer across all modes for a more unified and polished user experience.
15+
* **Component Sizing**: Fixed a layout bug where certain overlay modes (Palette, Help, Theme Menu) incorrectly occupied the full terminal height, obscuring the header and footer.
16+
817
## [1.2.0]
918

1019
### Added

VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.2.0
1+
1.2.1

internal/app/model.go

Lines changed: 37 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -791,18 +791,7 @@ func (m *Model) View() string {
791791
return ""
792792
}
793793

794-
var content string
795-
796-
switch m.mode {
797-
case ModePalette:
798-
content = m.pal.View()
799-
case ModeHelp:
800-
content = m.hlp.View()
801-
case ModeThemeMenu:
802-
content = m.tm.View()
803-
default:
804-
content = m.renderMainUI()
805-
}
794+
content := m.renderMainUI()
806795

807796
// Final rendering pipeline: FillViewport guarantees that every cell in
808797
// the width×height viewport has the background color applied.
@@ -823,6 +812,17 @@ func (m *Model) renderMainUI() string {
823812
availableHeight = 0
824813
}
825814

815+
// Update sizes dynamically
816+
m.list.SetSize(m.width, availableHeight)
817+
m.det.SetSize(m.width, availableHeight)
818+
m.pal.SetSize(m.width, availableHeight)
819+
m.pm.SetSize(m.width, availableHeight)
820+
m.hlp.SetSize(m.width, availableHeight)
821+
m.tm.SetSize(m.width, availableHeight)
822+
if m.edit != nil {
823+
m.edit.SetSize(m.width, availableHeight)
824+
}
825+
826826
// Sync animation state to tasklist
827827
if m.animatingTaskID != "" {
828828
m.list.SetAnimation(m.animatingTaskID, m.animationStarted, m.animationDuration, m.animationReverse)
@@ -834,6 +834,12 @@ func (m *Model) renderMainUI() string {
834834
body = m.list.View()
835835
case ModeDetail:
836836
body = m.det.View()
837+
case ModePalette:
838+
body = m.pal.View()
839+
case ModeHelp:
840+
body = m.hlp.View()
841+
case ModeThemeMenu:
842+
body = m.tm.View()
837843
case ModePluginMenu:
838844
body = m.pm.View()
839845
case ModeTagFilter:
@@ -860,26 +866,7 @@ func (m *Model) renderMainUI() string {
860866
}
861867

862868
func (m *Model) rebuildComponentSizes() {
863-
// Calculate header height dynamically
864-
head := m.renderHeader()
865-
foot := m.renderFooter()
866-
hHeight := lipgloss.Height(head)
867-
fHeight := lipgloss.Height(foot)
868-
869-
avail := m.height - hHeight - fHeight
870-
if avail < 0 {
871-
avail = 0
872-
}
873-
874-
m.list.SetSize(m.width, avail)
875-
m.det.SetSize(m.width, avail)
876-
m.pal.SetSize(m.width, m.height)
877-
m.pm.SetSize(m.width, m.height)
878-
m.hlp.SetSize(m.width, m.height)
879-
m.tm.SetSize(m.width, m.height)
880-
if m.edit != nil {
881-
m.edit.SetSize(m.width, avail)
882-
}
869+
// Component sizing is now handled dynamically in renderMainUI
883870
}
884871

885872
// Add to Model struct:
@@ -962,41 +949,40 @@ func (m *Model) renderFooter() string {
962949
left := ""
963950
switch m.mode {
964951
case ModeConfirmDelete:
965-
left = m.s.BadgeDelete.Render(" DELETE? ") + " " + m.s.Muted.Render("y/enter confirm • n/esc cancel")
952+
left = m.s.BadgeDelete.Render(" DELETE? ") + " " + m.s.Muted.Render("y/enter "+styles.IconDone+"confirm • n/esc "+styles.IconClose+"cancel")
966953
case ModeConfirmQuit:
967-
left = m.s.BadgeQuit.Render(" QUIT? ") + " " + m.s.Muted.Render("y/enter confirm • n/esc cancel")
954+
left = m.s.BadgeQuit.Render(" QUIT? ") + " " + m.s.Muted.Render("y/enter "+styles.IconDone+"confirm • n/esc "+styles.IconClose+"cancel")
968955
case ModeTagFilter:
969-
left = " " + m.s.Muted.Render("enter apply • esc cancel • ctrl+u clear")
956+
left = " " + m.s.Muted.Render("enter "+styles.IconDone+"apply • esc "+styles.IconClose+"cancel • ctrl+u clear")
970957
case ModeDetail:
971958
left = " " + m.s.Muted.Render(
972-
fk(m.km.Back)+" 󰌍back • "+
973-
fk(m.km.EditTask)+" 󰏫edit • "+
974-
fk(m.km.Palette)+" "+styles.IconPalette+"palette • "+
959+
fk(m.km.Back)+" "+styles.IconBack+"back • "+
960+
fk(m.km.EditTask)+" "+styles.IconEdit+"edit • "+
961+
fk(m.km.Palette)+" "+styles.IconPalette+"pal • "+
975962
fk(m.km.Help)+" "+styles.IconHelp+"help • "+
976-
fk(m.km.Issues)+" "+styles.IconIssues+"issues • "+
977-
fk(m.km.Changelog)+" "+styles.IconChangelog+"changelog",
963+
fk(m.km.Issues)+" "+styles.IconIssues+"iss • "+
964+
fk(m.km.Changelog)+" "+styles.IconChangelog+"log",
978965
)
979966
case ModeEditor:
980-
left = " " + m.s.Muted.Render("ctrl+s "+styles.IconDone+"save • esc "+styles.IconError+"cancel • tab navigate")
967+
left = " " + m.s.Muted.Render("ctrl+s "+styles.IconDone+"save • esc "+styles.IconClose+"cls • tab nav")
981968
case ModePalette:
982-
left = " " + m.s.Muted.Render("enter select • esc/p close↑/↓ navigate")
969+
left = " " + m.s.Muted.Render("enter "+styles.IconEnter+"sel • esc/p "+styles.IconClose+"cls"+styles.IconUp+styles.IconDown+" nav")
983970
case ModeHelp:
984-
left = " " + m.s.Muted.Render("esc/q/"+fk(m.km.Help)+" close")
971+
left = " " + m.s.Muted.Render("esc/q/"+fk(m.km.Help)+" "+styles.IconClose+"cls")
985972
case ModeThemeMenu:
986-
left = " " + m.s.Muted.Render("enter select • esc/q/"+fk(m.km.CycleTheme)+" close↑/↓ navigate")
973+
left = " " + m.s.Muted.Render("enter "+styles.IconDone+"sel • esc/q/"+fk(m.km.CycleTheme)+" "+styles.IconClose+"cls"+styles.IconUp+styles.IconDown+" nav")
987974
case ModePluginMenu:
988-
left = " " + m.s.Muted.Render("enter detail • u uninstall • o open folder • r reload • p/"+fk(m.km.ManagePlugins)+" close↑/↓ navigate")
975+
left = " " + m.s.Muted.Render("enter det • u uninst • o open • r reload • p/"+fk(m.km.ManagePlugins)+" "+styles.IconClose+"cls"+styles.IconUp+styles.IconDown+" nav")
989976
default:
990977
left = " " + m.s.Muted.Render(
991-
fk(m.km.Palette)+" "+styles.IconPalette+"palette • "+
978+
fk(m.km.Palette)+" "+styles.IconPalette+"pal • "+
992979
fk(m.km.NewTask)+" "+styles.IconNew+"new • "+
993980
"f "+styles.IconTag+"tag • "+
994-
fk(m.km.ToggleStrike)+" "+styles.IconStrike+"strike • "+
995-
fk(m.km.DeleteTask)+" "+styles.IconDelete+"delete • "+
981+
fk(m.km.ToggleStrike)+" "+styles.IconStrike+"done • "+
982+
fk(m.km.DeleteTask)+" "+styles.IconDelete+"del • "+
996983
fk(m.km.Help)+" "+styles.IconHelp+"help • "+
997-
fk(m.km.Issues)+" "+styles.IconIssues+"issues • "+
998-
fk(m.km.Changelog)+" "+styles.IconChangelog+"changelog • "+
999-
"1-9 "+styles.IconView+"view",
984+
fk(m.km.Issues)+" "+styles.IconIssues+"iss • "+
985+
fk(m.km.Changelog)+" "+styles.IconChangelog+"log",
1000986
)
1001987
}
1002988

internal/lua/engine.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (e *Engine) SetupKairoAPI(L *lua.LState) {
5555
L.SetField(kairo, "notify", L.NewFunction(e.luaNotify))
5656

5757
// Meta
58-
L.SetField(kairo, "version", lua.LString("1.2.0"))
58+
L.SetField(kairo, "version", lua.LString("1.2.1"))
5959

6060
// Set as global
6161
L.SetGlobal("kairo", kairo)

internal/ui/styles/styles.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ const (
3636
IconStrike = "󱐌 "
3737
IconIssues = "󰋽 "
3838
IconChangelog = "󰠠 "
39+
IconBack = "󰌍 "
40+
IconEdit = "󰏫 "
41+
IconClose = "󰅖 "
42+
IconUp = "󰜝 "
43+
IconDown = "󰜲 "
44+
IconEnter = "󰌑 "
3945
)
4046

4147
// Design System Constants

0 commit comments

Comments
 (0)