chore: change the layout package location

Kujtim Hoxha created

Change summary

internal/tui/components/chat/chat.go                |  2 
internal/tui/components/chat/editor/editor.go       |  8 --
internal/tui/components/chat/editor/keys.go         |  2 
internal/tui/components/chat/messages/messages.go   |  2 
internal/tui/components/chat/messages/tool.go       |  2 
internal/tui/components/chat/sidebar/sidebar.go     |  2 
internal/tui/components/completions/item.go         |  2 
internal/tui/components/completions/keys.go         |  2 
internal/tui/components/core/layout/container.go    | 12 +-
internal/tui/components/core/layout/layout.go       |  8 -
internal/tui/components/core/layout/split.go        | 21 +++---
internal/tui/components/core/list/keys.go           |  2 
internal/tui/components/core/list/list.go           |  2 
internal/tui/components/core/status/keys.go         |  2 
internal/tui/components/dialogs/commands/item.go    |  2 
internal/tui/components/dialogs/commands/keys.go    |  2 
internal/tui/components/dialogs/compact/keys.go     |  2 
internal/tui/components/dialogs/filepicker/keys.go  |  2 
internal/tui/components/dialogs/init/keys.go        |  2 
internal/tui/components/dialogs/keys.go             |  2 
internal/tui/components/dialogs/models/keys.go      |  2 
internal/tui/components/dialogs/permissions/keys.go |  2 
internal/tui/components/dialogs/quit/keys.go        |  2 
internal/tui/components/dialogs/quit/quit.go        |  6 -
internal/tui/components/dialogs/sessions/keys.go    |  2 
internal/tui/components/logs/details.go             |  8 --
internal/tui/components/logs/table.go               |  8 --
internal/tui/keys.go                                |  2 
internal/tui/page/chat/chat.go                      |  2 
internal/tui/page/chat/keys.go                      |  2 
internal/tui/page/logs/keys.go                      |  2 
internal/tui/page/logs/logs.go                      |  2 
internal/tui/tui.go                                 |  2 
todos.md                                            | 50 +++++++-------
34 files changed, 70 insertions(+), 103 deletions(-)

Detailed changes

internal/tui/components/chat/chat.go 🔗

@@ -12,7 +12,7 @@ import (
 	"github.com/charmbracelet/crush/internal/session"
 	"github.com/charmbracelet/crush/internal/tui/components/chat/messages"
 	"github.com/charmbracelet/crush/internal/tui/components/core/list"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"
 )

internal/tui/components/chat/editor/editor.go 🔗

@@ -21,7 +21,6 @@ import (
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs"
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs/filepicker"
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs/quit"
-	"github.com/charmbracelet/crush/internal/tui/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"
@@ -327,13 +326,6 @@ func (m *editorCmp) attachmentsContent() string {
 	return content
 }
 
-func (m *editorCmp) BindingKeys() []key.Binding {
-	bindings := []key.Binding{}
-	bindings = append(bindings, layout.KeyMapToSlice(m.keyMap)...)
-	bindings = append(bindings, layout.KeyMapToSlice(DeleteKeyMaps)...)
-	return bindings
-}
-
 func (m *editorCmp) SetPosition(x, y int) tea.Cmd {
 	m.x = x
 	m.y = y

internal/tui/components/chat/editor/keys.go 🔗

@@ -2,7 +2,7 @@ package editor
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type EditorKeyMap struct {

internal/tui/components/chat/messages/messages.go 🔗

@@ -14,7 +14,7 @@ import (
 	"github.com/charmbracelet/crush/internal/message"
 	"github.com/charmbracelet/crush/internal/tui/components/anim"
 	"github.com/charmbracelet/crush/internal/tui/components/core"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 )

internal/tui/components/chat/messages/tool.go 🔗

@@ -7,7 +7,7 @@ import (
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/message"
 	"github.com/charmbracelet/crush/internal/tui/components/anim"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"

internal/tui/components/chat/sidebar/sidebar.go 🔗

@@ -11,7 +11,7 @@ import (
 	"github.com/charmbracelet/crush/internal/tui/components/chat"
 	"github.com/charmbracelet/crush/internal/tui/components/core"
 	"github.com/charmbracelet/crush/internal/tui/components/logo"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/crush/internal/version"

internal/tui/components/completions/item.go 🔗

@@ -5,7 +5,7 @@ import (
 
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/components/core/list"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"

internal/tui/components/completions/keys.go 🔗

@@ -2,7 +2,7 @@ package completions
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/layout/container.go → internal/tui/components/core/layout/container.go 🔗

@@ -1,7 +1,7 @@
 package layout
 
 import (
-	"github.com/charmbracelet/bubbles/v2/key"
+	"github.com/charmbracelet/bubbles/v2/help"
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
@@ -11,7 +11,7 @@ import (
 type Container interface {
 	util.Model
 	Sizeable
-	Bindings
+	Help
 	Positionable
 	Focusable
 }
@@ -157,11 +157,11 @@ func (c *container) SetPosition(x, y int) tea.Cmd {
 	return nil
 }
 
-func (c *container) BindingKeys() []key.Binding {
-	if b, ok := c.content.(Bindings); ok {
-		return b.BindingKeys()
+func (c *container) Help() help.KeyMap {
+	if b, ok := c.content.(Help); ok {
+		return b.Help()
 	}
-	return []key.Binding{}
+	return nil
 }
 
 // Blur implements Container.

internal/tui/layout/layout.go → internal/tui/components/core/layout/layout.go 🔗

@@ -19,18 +19,14 @@ type Sizeable interface {
 	GetSize() (int, int)
 }
 
-type Bindings interface {
-	BindingKeys() []key.Binding
+type Help interface {
+	Help() help.KeyMap
 }
 
 type Positionable interface {
 	SetPosition(x, y int) tea.Cmd
 }
 
-type Help interface {
-	Help() help.KeyMap
-}
-
 func KeyMapToSlice(t any) (bindings []key.Binding) {
 	typ := reflect.TypeOf(t)
 	if typ.Kind() != reflect.Struct {

internal/tui/layout/split.go → internal/tui/components/core/layout/split.go 🔗

@@ -1,7 +1,7 @@
 package layout
 
 import (
-	"github.com/charmbracelet/bubbles/v2/key"
+	"github.com/charmbracelet/bubbles/v2/help"
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
@@ -19,7 +19,7 @@ const (
 type SplitPaneLayout interface {
 	util.Model
 	Sizeable
-	Bindings
+	Help
 	SetLeftPanel(panel Container) tea.Cmd
 	SetRightPanel(panel Container) tea.Cmd
 	SetBottomPanel(panel Container) tea.Cmd
@@ -269,24 +269,23 @@ func (s *splitPaneLayout) ClearBottomPanel() tea.Cmd {
 	return nil
 }
 
-func (s *splitPaneLayout) BindingKeys() []key.Binding {
-	keys := []key.Binding{}
+func (s *splitPaneLayout) Help() help.KeyMap {
 	if s.leftPanel != nil {
-		if b, ok := s.leftPanel.(Bindings); ok {
-			keys = append(keys, b.BindingKeys()...)
+		if b, ok := s.leftPanel.(Help); ok && s.leftPanel.IsFocused() {
+			return b.Help()
 		}
 	}
 	if s.rightPanel != nil {
-		if b, ok := s.rightPanel.(Bindings); ok {
-			keys = append(keys, b.BindingKeys()...)
+		if b, ok := s.rightPanel.(Help); ok && s.rightPanel.IsFocused() {
+			return b.Help()
 		}
 	}
 	if s.bottomPanel != nil {
-		if b, ok := s.bottomPanel.(Bindings); ok {
-			keys = append(keys, b.BindingKeys()...)
+		if b, ok := s.bottomPanel.(Help); ok && s.bottomPanel.IsFocused() {
+			return b.Help()
 		}
 	}
-	return keys
+	return nil
 }
 
 func (s *splitPaneLayout) FocusPanel(panel LayoutPanel) tea.Cmd {

internal/tui/components/core/list/keys.go 🔗

@@ -2,7 +2,7 @@ package list
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/components/core/list/list.go 🔗

@@ -11,7 +11,7 @@ import (
 	"github.com/charmbracelet/bubbles/v2/textinput"
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/components/anim"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"

internal/tui/components/core/status/keys.go 🔗

@@ -2,7 +2,7 @@ package status
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/components/dialogs/commands/item.go 🔗

@@ -4,7 +4,7 @@ import (
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/components/core"
 	"github.com/charmbracelet/crush/internal/tui/components/core/list"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/x/ansi"

internal/tui/components/dialogs/commands/keys.go 🔗

@@ -2,7 +2,7 @@ package commands
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type CommandsDialogKeyMap struct {

internal/tui/components/dialogs/compact/keys.go 🔗

@@ -2,7 +2,7 @@ package compact
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 // KeyMap defines the key bindings for the compact dialog.

internal/tui/components/dialogs/filepicker/keys.go 🔗

@@ -2,7 +2,7 @@ package filepicker
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 // KeyMap defines keyboard bindings for dialog management.

internal/tui/components/dialogs/init/keys.go 🔗

@@ -2,7 +2,7 @@ package init
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/components/dialogs/keys.go 🔗

@@ -2,7 +2,7 @@ package dialogs
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 // KeyMap defines keyboard bindings for dialog management.

internal/tui/components/dialogs/models/keys.go 🔗

@@ -2,7 +2,7 @@ package models
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/components/dialogs/permissions/keys.go 🔗

@@ -2,7 +2,7 @@ package permissions
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/components/dialogs/quit/keys.go 🔗

@@ -2,7 +2,7 @@ package quit
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 // KeyMap defines the keyboard bindings for the quit dialog.

internal/tui/components/dialogs/quit/quit.go 🔗

@@ -4,7 +4,6 @@ import (
 	"github.com/charmbracelet/bubbles/v2/key"
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs"
-	"github.com/charmbracelet/crush/internal/tui/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"
@@ -18,7 +17,6 @@ const (
 // QuitDialog represents a confirmation dialog for quitting the application.
 type QuitDialog interface {
 	dialogs.DialogModel
-	layout.Bindings
 }
 
 type quitDialogCmp struct {
@@ -107,10 +105,6 @@ func (q *quitDialogCmp) View() tea.View {
 	)
 }
 
-func (q *quitDialogCmp) BindingKeys() []key.Binding {
-	return layout.KeyMapToSlice(q.keymap)
-}
-
 func (q *quitDialogCmp) Position() (int, int) {
 	row := q.wHeight / 2
 	row -= 7 / 2

internal/tui/components/dialogs/sessions/keys.go 🔗

@@ -2,7 +2,7 @@ package sessions
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/components/logs/details.go 🔗

@@ -5,11 +5,10 @@ import (
 	"strings"
 	"time"
 
-	"github.com/charmbracelet/bubbles/v2/key"
 	"github.com/charmbracelet/bubbles/v2/viewport"
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/logging"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"
@@ -18,7 +17,6 @@ import (
 type DetailComponent interface {
 	util.Model
 	layout.Sizeable
-	layout.Bindings
 }
 
 type detailCmp struct {
@@ -172,10 +170,6 @@ func (i *detailCmp) SetSize(width int, height int) tea.Cmd {
 	return nil
 }
 
-func (i *detailCmp) BindingKeys() []key.Binding {
-	return layout.KeyMapToSlice(i.viewport.KeyMap)
-}
-
 func NewLogsDetails() DetailComponent {
 	return &detailCmp{
 		viewport: viewport.New(),

internal/tui/components/logs/table.go 🔗

@@ -5,12 +5,11 @@ import (
 	"slices"
 	"strings"
 
-	"github.com/charmbracelet/bubbles/v2/key"
 	"github.com/charmbracelet/bubbles/v2/table"
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/logging"
 	"github.com/charmbracelet/crush/internal/pubsub"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"
@@ -19,7 +18,6 @@ import (
 type TableComponent interface {
 	util.Model
 	layout.Sizeable
-	layout.Bindings
 }
 
 type tableCmp struct {
@@ -136,10 +134,6 @@ func (i *tableCmp) SetSize(width int, height int) tea.Cmd {
 	return nil
 }
 
-func (i *tableCmp) BindingKeys() []key.Binding {
-	return layout.KeyMapToSlice(i.table.KeyMap)
-}
-
 func (i *tableCmp) setRows() {
 	rows := []table.Row{}
 

internal/tui/keys.go 🔗

@@ -2,7 +2,7 @@ package tui
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/page/chat/chat.go 🔗

@@ -14,7 +14,7 @@ import (
 	"github.com/charmbracelet/crush/internal/tui/components/chat/editor"
 	"github.com/charmbracelet/crush/internal/tui/components/chat/sidebar"
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs/commands"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/page"
 	"github.com/charmbracelet/crush/internal/tui/util"
 )

internal/tui/page/chat/keys.go 🔗

@@ -2,7 +2,7 @@ package chat
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/page/logs/keys.go 🔗

@@ -2,7 +2,7 @@ package logs
 
 import (
 	"github.com/charmbracelet/bubbles/v2/key"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 )
 
 type KeyMap struct {

internal/tui/page/logs/logs.go 🔗

@@ -5,7 +5,7 @@ import (
 	tea "github.com/charmbracelet/bubbletea/v2"
 	"github.com/charmbracelet/crush/internal/tui/components/core"
 	logsComponents "github.com/charmbracelet/crush/internal/tui/components/logs"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/page"
 	"github.com/charmbracelet/crush/internal/tui/page/chat"
 	"github.com/charmbracelet/crush/internal/tui/styles"

internal/tui/tui.go 🔗

@@ -24,7 +24,7 @@ import (
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs/permissions"
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs/quit"
 	"github.com/charmbracelet/crush/internal/tui/components/dialogs/sessions"
-	"github.com/charmbracelet/crush/internal/tui/layout"
+	"github.com/charmbracelet/crush/internal/tui/components/core/layout"
 	"github.com/charmbracelet/crush/internal/tui/page"
 	"github.com/charmbracelet/crush/internal/tui/page/chat"
 	"github.com/charmbracelet/crush/internal/tui/page/logs"

todos.md 🔗

@@ -1,29 +1,27 @@
-# Chat Page
-
-## Landing page
-
-- [x] Implement the logo landing page
-- [x] Add cwd improved
-- [x] Implement Active LSPs
-- [x] Implement Active MCPs
-
-## Dialogs
-
-- [x] Cleanup Commands
-- [x] Sessions dialog
-- [x] Models
-- [x] Move sessions and model dialog to the commands
-- [x] Add sessions shortuct
-- [ ] Add all posible actions to the commands
-
-## Investigate
+## TODOs before release
 
+- [~] Implement help
+  - [ ] Show full help
+  - [ ] Make help dependent on the focused pane and page
 - [ ] Events when tool error
-- [ ] Fancy Spinner
-
-## Messages
-
 - [ ] Fix issue with numbers (padding)
-- [ ] Run tools in parallel and add the responses in parallel
-- [ ] Handle parallel permission calls
-- [ ] Weird behavior sometimes the message does not update
+- [ ] Fancy Spinner
+- [ ] Add all possible actions to the commands
+- [ ] Parallel tool calls and permissions
+  - [ ] Run the tools in parallel and add results in parallel
+  - [ ] Show multiple permissions dialogs
+- [ ] Investigate messages issues
+  - [ ] Weird behavior sometimes the message does not update
+  - [ ] Message length (I saw the message go beyond the correct length when there are errors)
+  - [ ] Address UX issues
+- [ ] Implement current model in the sidebar
+- [ ] Implement changed files
+- [ ] Implement responsive mode
+- [ ] Revisit the core list component
+  - [ ] This component has become super complex we might need to fix this.
+- [ ] General cleanup and documentation
+- [ ] Update the readme
+
+## Maybe
+
+- [ ] Revisit the provider/model/configs