on main help sign in
chore: bump bubbletea and ultraviolet to v2.03 and 73592393e1ad and fix

related layout issues

commit4a1298ecd1dff83e1e704ca6b65b5a18d86e0490 authorAyman Bagabas <ayman.bagabas@gmail.com> dateMon 13 Apr 2026, 11:14 (6 months ago) parentd9f857f
5 files changed+75−20
go.mod+2−2 go.sum+4−4 internal/ui/model/landing.go+7−1 internal/ui/model/sidebar.go+6−1 internal/ui/model/ui.go+56−12
go.mod+2−2
@@ -4,7 +4,7 @@ go 1.26.1
44
55require (
66 charm.land/bubbles/v2 v2.1.0
7− charm.land/bubbletea/v2 v2.0.2
7+ charm.land/bubbletea/v2 v2.0.3
88 charm.land/catwalk v0.35.3
99 charm.land/fang/v2 v2.0.1
1010 charm.land/fantasy v0.17.1
@@ -24,7 +24,7 @@ require (
2424 github.com/charlievieth/fastwalk v1.0.14
2525 github.com/charmbracelet/colorprofile v0.4.3
2626 github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266
27− github.com/charmbracelet/ultraviolet v0.0.0-20260205113103-524a6607adb8
27+ github.com/charmbracelet/ultraviolet v0.0.0-20260413133134-73592393e1ad
2828 github.com/charmbracelet/x/ansi v0.11.6
2929 github.com/charmbracelet/x/editor v0.2.0
3030 github.com/charmbracelet/x/etag v0.2.0
go.sum+4−4
@@ -1,7 +1,7 @@
11charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g=
22charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
3−charm.land/bubbletea/v2 v2.0.2 h1:4CRtRnuZOdFDTWSff9r8QFt/9+z6Emubz3aDMnf/dx0=
4−charm.land/bubbletea/v2 v2.0.2/go.mod h1:3LRff2U4WIYXy7MTxfbAQ+AdfM3D8Xuvz2wbsOD9OHQ=
3+charm.land/bubbletea/v2 v2.0.3 h1:l+n6zlO+WW/Jj9QV+od9ZmeOK4ITh0NuH1xP4VPEyeA=
4+charm.land/bubbletea/v2 v2.0.3/go.mod h1:yzdemvvo7UJrtPl//9g7/JdILzYw1oYH2FOrJfN/TXc=
55charm.land/catwalk v0.35.3 h1:tg3Vnz9V4kOQw9t+tQQFJyWxH4pZy2nblhSUaD9jH5o=
66charm.land/catwalk v0.35.3/go.mod h1:IvMXm7qMKvYuWWlN5A4dA0bTgYg4clG1GAeU9/NlY0w=
77charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY=
@@ -108,8 +108,8 @@ github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex
108108github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
109109github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZtyd1JyYy0h5adMm3tzpNyL857LWjuTRET6OhpY=
110110github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E=
111−github.com/charmbracelet/ultraviolet v0.0.0-20260205113103-524a6607adb8 h1:eyFRbAmexyt43hVfeyBofiGSEmJ7krjLOYt/9CF5NKA=
112−github.com/charmbracelet/ultraviolet v0.0.0-20260205113103-524a6607adb8/go.mod h1:SQpCTRNBtzJkwku5ye4S3HEuthAlGy2n9VXZnWkEW98=
111+github.com/charmbracelet/ultraviolet v0.0.0-20260413133134-73592393e1ad h1:kxhuAdAdSGSiAadbEjP7v06nCb17jXjjqF2QOX+0QiE=
112+github.com/charmbracelet/ultraviolet v0.0.0-20260413133134-73592393e1ad/go.mod h1:bAAz7dh/FTYfC+oiHavL4mX1tOIBZ0ZwYjSi3qE6ivM=
113113github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
114114github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
115115github.com/charmbracelet/x/editor v0.2.0 h1:7XLUKtaRaB8jN7bWU2p2UChiySyaAuIfYiIRg8gGWwk=
internal/ui/model/landing.go+7−1
@@ -1,6 +1,8 @@
11package model
22
33import (
4+ "image"
5+
46 "charm.land/lipgloss/v2"
57 "github.com/charmbracelet/crush/internal/ui/common"
68 "github.com/charmbracelet/crush/internal/workspace"
@@ -31,7 +33,11 @@ func (m *UI) landingView() string {
3133 parts = append(parts, "", m.modelInfo(width))
3234 infoSection := lipgloss.JoinVertical(lipgloss.Left, parts...)
3335
34− _, remainingHeightArea := layout.SplitVertical(m.layout.main, layout.Fixed(lipgloss.Height(infoSection)+1))
36+ var remainingHeightArea image.Rectangle
37+ layout.Vertical(
38+ layout.Len(lipgloss.Height(infoSection)+1),
39+ layout.Fill(1),
40+ ).Split(m.layout.main).Assign(new(image.Rectangle), &remainingHeightArea)
3541
3642 mcpLspSectionWidth := min(30, (width-1)/2)
3743
internal/ui/model/sidebar.go+6−1
@@ -3,6 +3,7 @@ package model
33import (
44 "cmp"
55 "fmt"
6+ "image"
67
78 "charm.land/lipgloss/v2"
89 "github.com/charmbracelet/crush/internal/ui/common"
@@ -136,7 +137,11 @@ func (m *UI) drawSidebar(scr uv.Screen, area uv.Rectangle) {
136137 blocks...,
137138 )
138139
139− _, remainingHeightArea := layout.SplitVertical(m.layout.sidebar, layout.Fixed(lipgloss.Height(sidebarHeader)))
140+ var remainingHeightArea image.Rectangle
141+ layout.Vertical(
142+ layout.Len(lipgloss.Height(sidebarHeader)),
143+ layout.Fill(1),
144+ ).Split(m.layout.sidebar).Assign(new(image.Rectangle), &remainingHeightArea)
140145 remainingHeight := remainingHeightArea.Dy() - 10
141146 maxFiles, maxLSPs, maxMCPs := getDynamicHeightLimits(remainingHeight)
142147
internal/ui/model/ui.go+56−12
@@ -2481,7 +2481,11 @@ func (m *UI) generateLayout(w, h int) uiLayout {
24812481 }
24822482
24832483 // Add app margins
2484− appRect, helpRect := layout.SplitVertical(area, layout.Fixed(area.Dy()-helpHeight))
2484+ var appRect, helpRect image.Rectangle
2485+ layout.Vertical(
2486+ layout.Len(area.Dy()-helpHeight),
2487+ layout.Fill(1),
2488+ ).Split(area).Assign(&appRect, &helpRect)
24852489 appRect.Min.Y += 1
24862490 appRect.Max.Y -= 1
24872491 helpRect.Min.Y -= 1
@@ -2510,7 +2514,11 @@ func (m *UI) generateLayout(w, h int) uiLayout {
25102514 // ------
25112515 // help
25122516
2513− headerRect, mainRect := layout.SplitVertical(appRect, layout.Fixed(landingHeaderHeight))
2517+ var headerRect, mainRect image.Rectangle
2518+ layout.Vertical(
2519+ layout.Len(landingHeaderHeight),
2520+ layout.Fill(1),
2521+ ).Split(appRect).Assign(&headerRect, &mainRect)
25142522 uiLayout.header = headerRect
25152523 uiLayout.main = mainRect
25162524
@@ -2524,8 +2532,16 @@ func (m *UI) generateLayout(w, h int) uiLayout {
25242532 // editor
25252533 // ------
25262534 // help
2527− headerRect, mainRect := layout.SplitVertical(appRect, layout.Fixed(landingHeaderHeight))
2528− mainRect, editorRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-editorHeight))
2535+ var headerRect, mainRect image.Rectangle
2536+ layout.Vertical(
2537+ layout.Len(landingHeaderHeight),
2538+ layout.Fill(1),
2539+ ).Split(appRect).Assign(&headerRect, &mainRect)
2540+ var editorRect image.Rectangle
2541+ layout.Vertical(
2542+ layout.Len(mainRect.Dy()-editorHeight),
2543+ layout.Fill(1),
2544+ ).Split(mainRect).Assign(&mainRect, &editorRect)
25292545 // Remove extra padding from editor (but keep it for header and main)
25302546 editorRect.Min.X -= 1
25312547 editorRect.Max.X += 1
@@ -2545,20 +2561,36 @@ func (m *UI) generateLayout(w, h int) uiLayout {
25452561 // ------
25462562 // help
25472563 const compactHeaderHeight = 1
2548− headerRect, mainRect := layout.SplitVertical(appRect, layout.Fixed(compactHeaderHeight))
2549− detailsHeight := min(sessionDetailsMaxHeight, area.Dy()-1) // One row for the header
2550− sessionDetailsArea, _ := layout.SplitVertical(appRect, layout.Fixed(detailsHeight))
2564+ var headerRect, mainRect image.Rectangle
2565+ layout.Vertical(
2566+ layout.Len(compactHeaderHeight),
2567+ layout.Fill(1),
2568+ ).Split(appRect).Assign(&headerRect, &mainRect)
2569+ detailsHeight := min(sessionDetailsMaxHeight, area.Dy()-1) // One row for the header
2570+ var sessionDetailsArea image.Rectangle
2571+ layout.Vertical(
2572+ layout.Len(detailsHeight),
2573+ layout.Fill(1),
2574+ ).Split(appRect).Assign(&sessionDetailsArea, new(image.Rectangle))
25512575 uiLayout.sessionDetails = sessionDetailsArea
25522576 uiLayout.sessionDetails.Min.Y += compactHeaderHeight // adjust for header
25532577 // Add one line gap between header and main content
25542578 mainRect.Min.Y += 1
2555− mainRect, editorRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-editorHeight))
2579+ var editorRect image.Rectangle
2580+ layout.Vertical(
2581+ layout.Len(mainRect.Dy()-editorHeight),
2582+ layout.Fill(1),
2583+ ).Split(mainRect).Assign(&mainRect, &editorRect)
25562584 mainRect.Max.X -= 1 // Add padding right
25572585 uiLayout.header = headerRect
25582586 pillsHeight := m.pillsAreaHeight()
25592587 if pillsHeight > 0 {
25602588 pillsHeight = min(pillsHeight, mainRect.Dy())
2561− chatRect, pillsRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-pillsHeight))
2589+ var chatRect, pillsRect image.Rectangle
2590+ layout.Vertical(
2591+ layout.Len(mainRect.Dy()-pillsHeight),
2592+ layout.Fill(1),
2593+ ).Split(mainRect).Assign(&chatRect, &pillsRect)
25622594 uiLayout.main = chatRect
25632595 uiLayout.pills = pillsRect
25642596 } else {
@@ -2577,16 +2609,28 @@ func (m *UI) generateLayout(w, h int) uiLayout {
25772609 // ----------
25782610 // help
25792611
2580− mainRect, sideRect := layout.SplitHorizontal(appRect, layout.Fixed(appRect.Dx()-sidebarWidth))
2612+ var mainRect, sideRect image.Rectangle
2613+ layout.Horizontal(
2614+ layout.Len(appRect.Dx()-sidebarWidth),
2615+ layout.Fill(1),
2616+ ).Split(appRect).Assign(&mainRect, &sideRect)
25812617 // Add padding left
25822618 sideRect.Min.X += 1
2583− mainRect, editorRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-editorHeight))
2619+ var editorRect image.Rectangle
2620+ layout.Vertical(
2621+ layout.Len(mainRect.Dy()-editorHeight),
2622+ layout.Fill(1),
2623+ ).Split(mainRect).Assign(&mainRect, &editorRect)
25842624 mainRect.Max.X -= 1 // Add padding right
25852625 uiLayout.sidebar = sideRect
25862626 pillsHeight := m.pillsAreaHeight()
25872627 if pillsHeight > 0 {
25882628 pillsHeight = min(pillsHeight, mainRect.Dy())
2589− chatRect, pillsRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-pillsHeight))
2629+ var chatRect, pillsRect image.Rectangle
2630+ layout.Vertical(
2631+ layout.Len(mainRect.Dy()-pillsHeight),
2632+ layout.Fill(1),
2633+ ).Split(mainRect).Assign(&chatRect, &pillsRect)
25902634 uiLayout.main = chatRect
25912635 uiLayout.pills = pillsRect
25922636 } else {