diff --git a/internal/tui/exp/list/list.go b/internal/tui/exp/list/list.go new file mode 100644 index 0000000000000000000000000000000000000000..6a34c93f8e6cc116f6ae05d9720b06faf5dad0a9 --- /dev/null +++ b/internal/tui/exp/list/list.go @@ -0,0 +1,89 @@ +package list + +import ( + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/crush/internal/tui/components/core/layout" + "github.com/charmbracelet/crush/internal/tui/util" +) + +type Item interface { + util.Model + layout.Sizeable +} + +type List interface { + util.Model +} + +type list struct { + width, height int + gap int + + items []Item + + renderedView string + + // Filter options + filterable bool + filterPlaceholder string +} + +type listOption func(*list) + +// WithFilterable enables filtering on the list. +func WithFilterable(placeholder string) listOption { + return func(l *list) { + l.filterable = true + l.filterPlaceholder = placeholder + } +} + +// WithItems sets the initial items for the list. +func WithItems(items ...Item) listOption { + return func(l *list) { + l.items = items + } +} + +// WithSize sets the size of the list. +func WithSize(width, height int) listOption { + return func(l *list) { + l.width = width + l.height = height + } +} + +// WithGap sets the gap between items in the list. +func WithGap(gap int) listOption { + return func(l *list) { + l.gap = gap + } +} + +func New(opts ...listOption) List { + list := &list{ + items: make([]Item, 0), + } + for _, opt := range opts { + opt(list) + } + return list +} + +// Init implements List. +func (l *list) Init() tea.Cmd { + if l.height <= 0 || l.width <= 0 { + return nil + } + return nil +} + +// Update implements List. +func (l *list) Update(tea.Msg) (tea.Model, tea.Cmd) { + panic("unimplemented") +} + +// View implements List. +func (l *list) View() tea.View { + panic("unimplemented") +}