on main help sign in
chore: bump bubbletea and ultraviolet to v2.03 and 73592393e1ad and fix
4a1298eAyman Bagabas
go.mod+2−2
@@ -4,7 +4,7 @@ go 1.26.1
4
4
5require (
5require (
6 charm.land/bubbles/v2 v2.1.0
6 charm.land/bubbles/v2 v2.1.0
7− charm.land/bubbletea/v2 v2.0.2
7+ charm.land/bubbletea/v2 v2.0.3
8 charm.land/catwalk v0.35.3
8 charm.land/catwalk v0.35.3
9 charm.land/fang/v2 v2.0.1
9 charm.land/fang/v2 v2.0.1
10 charm.land/fantasy v0.17.1
10 charm.land/fantasy v0.17.1
@@ -24,7 +24,7 @@ require (
24 github.com/charlievieth/fastwalk v1.0.14
24 github.com/charlievieth/fastwalk v1.0.14
25 github.com/charmbracelet/colorprofile v0.4.3
25 github.com/charmbracelet/colorprofile v0.4.3
26 github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266
26 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
28 github.com/charmbracelet/x/ansi v0.11.6
28 github.com/charmbracelet/x/ansi v0.11.6
29 github.com/charmbracelet/x/editor v0.2.0
29 github.com/charmbracelet/x/editor v0.2.0
30 github.com/charmbracelet/x/etag v0.2.0
30 github.com/charmbracelet/x/etag v0.2.0
go.sum+4−4
@@ -1,7 +1,7 @@
1charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g=
1charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g=
2charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
2charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
3−charm.land/bubbletea/v2 v2.0.2 h1:4CRtRnuZOdFDTWSff9r8QFt/9+z6Emubz3aDMnf/dx0=
3+charm.land/bubbletea/v2 v2.0.3 h1:l+n6zlO+WW/Jj9QV+od9ZmeOK4ITh0NuH1xP4VPEyeA=
4−charm.land/bubbletea/v2 v2.0.2/go.mod h1:3LRff2U4WIYXy7MTxfbAQ+AdfM3D8Xuvz2wbsOD9OHQ=
4+charm.land/bubbletea/v2 v2.0.3/go.mod h1:yzdemvvo7UJrtPl//9g7/JdILzYw1oYH2FOrJfN/TXc=
5charm.land/catwalk v0.35.3 h1:tg3Vnz9V4kOQw9t+tQQFJyWxH4pZy2nblhSUaD9jH5o=
5charm.land/catwalk v0.35.3 h1:tg3Vnz9V4kOQw9t+tQQFJyWxH4pZy2nblhSUaD9jH5o=
6charm.land/catwalk v0.35.3/go.mod h1:IvMXm7qMKvYuWWlN5A4dA0bTgYg4clG1GAeU9/NlY0w=
6charm.land/catwalk v0.35.3/go.mod h1:IvMXm7qMKvYuWWlN5A4dA0bTgYg4clG1GAeU9/NlY0w=
7charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY=
7charm.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
108github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
108github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
109github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZtyd1JyYy0h5adMm3tzpNyL857LWjuTRET6OhpY=
109github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZtyd1JyYy0h5adMm3tzpNyL857LWjuTRET6OhpY=
110github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E=
110github.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=
111+github.com/charmbracelet/ultraviolet v0.0.0-20260413133134-73592393e1ad h1:kxhuAdAdSGSiAadbEjP7v06nCb17jXjjqF2QOX+0QiE=
112−github.com/charmbracelet/ultraviolet v0.0.0-20260205113103-524a6607adb8/go.mod h1:SQpCTRNBtzJkwku5ye4S3HEuthAlGy2n9VXZnWkEW98=
112+github.com/charmbracelet/ultraviolet v0.0.0-20260413133134-73592393e1ad/go.mod h1:bAAz7dh/FTYfC+oiHavL4mX1tOIBZ0ZwYjSi3qE6ivM=
113github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
113github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
114github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
114github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
115github.com/charmbracelet/x/editor v0.2.0 h1:7XLUKtaRaB8jN7bWU2p2UChiySyaAuIfYiIRg8gGWwk=
115github.com/charmbracelet/x/editor v0.2.0 h1:7XLUKtaRaB8jN7bWU2p2UChiySyaAuIfYiIRg8gGWwk=
internal/ui/model/landing.go+7−1
@@ -1,6 +1,8 @@
1package model
1package model
2
2
3import (
3import (
4+ "image"
5+
4 "charm.land/lipgloss/v2"
6 "charm.land/lipgloss/v2"
5 "github.com/charmbracelet/crush/internal/ui/common"
7 "github.com/charmbracelet/crush/internal/ui/common"
6 "github.com/charmbracelet/crush/internal/workspace"
8 "github.com/charmbracelet/crush/internal/workspace"
@@ -31,7 +33,11 @@ func (m *UI) landingView() string {
31 parts = append(parts, "", m.modelInfo(width))
33 parts = append(parts, "", m.modelInfo(width))
32 infoSection := lipgloss.JoinVertical(lipgloss.Left, parts...)
34 infoSection := lipgloss.JoinVertical(lipgloss.Left, parts...)
33
35
36+ var remainingHeightArea image.Rectangle
37+ layout.Vertical(
34− _, remainingHeightArea := layout.SplitVertical(m.layout.main, layout.Fixed(lipgloss.Height(infoSection)+1))
38+ layout.Len(lipgloss.Height(infoSection)+1),
39+ layout.Fill(1),
40+ ).Split(m.layout.main).Assign(new(image.Rectangle), &remainingHeightArea)
35
41
36 mcpLspSectionWidth := min(30, (width-1)/2)
42 mcpLspSectionWidth := min(30, (width-1)/2)
37
43
internal/ui/model/sidebar.go+6−1
@@ -3,6 +3,7 @@ package model
3import (
3import (
4 "cmp"
4 "cmp"
5 "fmt"
5 "fmt"
6+ "image"
6
7
7 "charm.land/lipgloss/v2"
8 "charm.land/lipgloss/v2"
8 "github.com/charmbracelet/crush/internal/ui/common"
9 "github.com/charmbracelet/crush/internal/ui/common"
@@ -136,7 +137,11 @@ func (m *UI) drawSidebar(scr uv.Screen, area uv.Rectangle) {
136 blocks...,
137 blocks...,
137 )
138 )
138
139
140+ var remainingHeightArea image.Rectangle
141+ layout.Vertical(
139− _, remainingHeightArea := layout.SplitVertical(m.layout.sidebar, layout.Fixed(lipgloss.Height(sidebarHeader)))
142+ layout.Len(lipgloss.Height(sidebarHeader)),
143+ layout.Fill(1),
144+ ).Split(m.layout.sidebar).Assign(new(image.Rectangle), &remainingHeightArea)
140 remainingHeight := remainingHeightArea.Dy() - 10
145 remainingHeight := remainingHeightArea.Dy() - 10
141 maxFiles, maxLSPs, maxMCPs := getDynamicHeightLimits(remainingHeight)
146 maxFiles, maxLSPs, maxMCPs := getDynamicHeightLimits(remainingHeight)
142
147
internal/ui/model/ui.go+56−12
@@ -2481,7 +2481,11 @@ func (m *UI) generateLayout(w, h int) uiLayout {
2481 }
2481 }
2482
2482
2483 // Add app margins
2483 // Add app margins
2484+ var appRect, helpRect image.Rectangle
2485+ layout.Vertical(
2484− appRect, helpRect := layout.SplitVertical(area, layout.Fixed(area.Dy()-helpHeight))
2486+ layout.Len(area.Dy()-helpHeight),
2487+ layout.Fill(1),
2488+ ).Split(area).Assign(&appRect, &helpRect)
2485 appRect.Min.Y += 1
2489 appRect.Min.Y += 1
2486 appRect.Max.Y -= 1
2490 appRect.Max.Y -= 1
2487 helpRect.Min.Y -= 1
2491 helpRect.Min.Y -= 1
@@ -2510,7 +2514,11 @@ func (m *UI) generateLayout(w, h int) uiLayout {
2510 // ------
2514 // ------
2511 // help
2515 // help
2512
2516
2517+ var headerRect, mainRect image.Rectangle
2518+ layout.Vertical(
2513− headerRect, mainRect := layout.SplitVertical(appRect, layout.Fixed(landingHeaderHeight))
2519+ layout.Len(landingHeaderHeight),
2520+ layout.Fill(1),
2521+ ).Split(appRect).Assign(&headerRect, &mainRect)
2514 uiLayout.header = headerRect
2522 uiLayout.header = headerRect
2515 uiLayout.main = mainRect
2523 uiLayout.main = mainRect
2516
2524
@@ -2524,8 +2532,16 @@ func (m *UI) generateLayout(w, h int) uiLayout {
2524 // editor
2532 // editor
2525 // ------
2533 // ------
2526 // help
2534 // help
2535+ var headerRect, mainRect image.Rectangle
2536+ layout.Vertical(
2527− headerRect, mainRect := layout.SplitVertical(appRect, layout.Fixed(landingHeaderHeight))
2537+ layout.Len(landingHeaderHeight),
2538+ layout.Fill(1),
2539+ ).Split(appRect).Assign(&headerRect, &mainRect)
2540+ var editorRect image.Rectangle
2541+ layout.Vertical(
2528− mainRect, editorRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-editorHeight))
2542+ layout.Len(mainRect.Dy()-editorHeight),
2543+ layout.Fill(1),
2544+ ).Split(mainRect).Assign(&mainRect, &editorRect)
2529 // Remove extra padding from editor (but keep it for header and main)
2545 // Remove extra padding from editor (but keep it for header and main)
2530 editorRect.Min.X -= 1
2546 editorRect.Min.X -= 1
2531 editorRect.Max.X += 1
2547 editorRect.Max.X += 1
@@ -2545,20 +2561,36 @@ func (m *UI) generateLayout(w, h int) uiLayout {
2545 // ------
2561 // ------
2546 // help
2562 // help
2547 const compactHeaderHeight = 1
2563 const compactHeaderHeight = 1
2564+ var headerRect, mainRect image.Rectangle
2565+ layout.Vertical(
2548− headerRect, mainRect := layout.SplitVertical(appRect, layout.Fixed(compactHeaderHeight))
2566+ layout.Len(compactHeaderHeight),
2567+ layout.Fill(1),
2568+ ).Split(appRect).Assign(&headerRect, &mainRect)
2549− detailsHeight := min(sessionDetailsMaxHeight, area.Dy()-1) // One row for the header
2569+ detailsHeight := min(sessionDetailsMaxHeight, area.Dy()-1) // One row for the header
2550− sessionDetailsArea, _ := layout.SplitVertical(appRect, layout.Fixed(detailsHeight))
2570+ var sessionDetailsArea image.Rectangle
2571+ layout.Vertical(
2572+ layout.Len(detailsHeight),
2573+ layout.Fill(1),
2574+ ).Split(appRect).Assign(&sessionDetailsArea, new(image.Rectangle))
2551 uiLayout.sessionDetails = sessionDetailsArea
2575 uiLayout.sessionDetails = sessionDetailsArea
2552 uiLayout.sessionDetails.Min.Y += compactHeaderHeight // adjust for header
2576 uiLayout.sessionDetails.Min.Y += compactHeaderHeight // adjust for header
2553 // Add one line gap between header and main content
2577 // Add one line gap between header and main content
2554 mainRect.Min.Y += 1
2578 mainRect.Min.Y += 1
2579+ var editorRect image.Rectangle
2580+ layout.Vertical(
2555− mainRect, editorRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-editorHeight))
2581+ layout.Len(mainRect.Dy()-editorHeight),
2582+ layout.Fill(1),
2583+ ).Split(mainRect).Assign(&mainRect, &editorRect)
2556 mainRect.Max.X -= 1 // Add padding right
2584 mainRect.Max.X -= 1 // Add padding right
2557 uiLayout.header = headerRect
2585 uiLayout.header = headerRect
2558 pillsHeight := m.pillsAreaHeight()
2586 pillsHeight := m.pillsAreaHeight()
2559 if pillsHeight > 0 {
2587 if pillsHeight > 0 {
2560 pillsHeight = min(pillsHeight, mainRect.Dy())
2588 pillsHeight = min(pillsHeight, mainRect.Dy())
2589+ var chatRect, pillsRect image.Rectangle
2590+ layout.Vertical(
2561− chatRect, pillsRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-pillsHeight))
2591+ layout.Len(mainRect.Dy()-pillsHeight),
2592+ layout.Fill(1),
2593+ ).Split(mainRect).Assign(&chatRect, &pillsRect)
2562 uiLayout.main = chatRect
2594 uiLayout.main = chatRect
2563 uiLayout.pills = pillsRect
2595 uiLayout.pills = pillsRect
2564 } else {
2596 } else {
@@ -2577,16 +2609,28 @@ func (m *UI) generateLayout(w, h int) uiLayout {
2577 // ----------
2609 // ----------
2578 // help
2610 // help
2579
2611
2612+ var mainRect, sideRect image.Rectangle
2613+ layout.Horizontal(
2580− mainRect, sideRect := layout.SplitHorizontal(appRect, layout.Fixed(appRect.Dx()-sidebarWidth))
2614+ layout.Len(appRect.Dx()-sidebarWidth),
2615+ layout.Fill(1),
2616+ ).Split(appRect).Assign(&mainRect, &sideRect)
2581 // Add padding left
2617 // Add padding left
2582 sideRect.Min.X += 1
2618 sideRect.Min.X += 1
2619+ var editorRect image.Rectangle
2620+ layout.Vertical(
2583− mainRect, editorRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-editorHeight))
2621+ layout.Len(mainRect.Dy()-editorHeight),
2622+ layout.Fill(1),
2623+ ).Split(mainRect).Assign(&mainRect, &editorRect)
2584 mainRect.Max.X -= 1 // Add padding right
2624 mainRect.Max.X -= 1 // Add padding right
2585 uiLayout.sidebar = sideRect
2625 uiLayout.sidebar = sideRect
2586 pillsHeight := m.pillsAreaHeight()
2626 pillsHeight := m.pillsAreaHeight()
2587 if pillsHeight > 0 {
2627 if pillsHeight > 0 {
2588 pillsHeight = min(pillsHeight, mainRect.Dy())
2628 pillsHeight = min(pillsHeight, mainRect.Dy())
2629+ var chatRect, pillsRect image.Rectangle
2630+ layout.Vertical(
2589− chatRect, pillsRect := layout.SplitVertical(mainRect, layout.Fixed(mainRect.Dy()-pillsHeight))
2631+ layout.Len(mainRect.Dy()-pillsHeight),
2632+ layout.Fill(1),
2633+ ).Split(mainRect).Assign(&chatRect, &pillsRect)
2590 uiLayout.main = chatRect
2634 uiLayout.main = chatRect
2591 uiLayout.pills = pillsRect
2635 uiLayout.pills = pillsRect
2592 } else {
2636 } else {