You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/charmbracelet/bubbles/textarea"
|
|
"github.com/charmbracelet/bubbles/viewport"
|
|
)
|
|
|
|
func initialModel() model {
|
|
// detailed tree to showcase design
|
|
root := &TreeNode{
|
|
Label: "nextshell-mock-folder",
|
|
Expanded: true,
|
|
Children: []*TreeNode{
|
|
{
|
|
Label: "cmd",
|
|
Expanded: true,
|
|
Children: []*TreeNode{
|
|
{Label: "build"},
|
|
{Label: "deploy"},
|
|
{Label: "test"},
|
|
},
|
|
},
|
|
{
|
|
Label: "pkg",
|
|
Expanded: true,
|
|
Children: []*TreeNode{
|
|
{
|
|
Label: "http",
|
|
Expanded: true,
|
|
Children: []*TreeNode{
|
|
{Label: "client.go"},
|
|
{Label: "server.go"},
|
|
},
|
|
},
|
|
{
|
|
Label: "ui",
|
|
Expanded: true,
|
|
Children: []*TreeNode{
|
|
{Label: "main.go"},
|
|
{Label: "widgets.go"},
|
|
{Label: "styles.go"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
Label: "configs",
|
|
Children: []*TreeNode{
|
|
{Label: "dev.yaml"},
|
|
{Label: "prod.yaml"},
|
|
},
|
|
},
|
|
{Label: "README.md"},
|
|
{Label: "Makefile"},
|
|
},
|
|
}
|
|
|
|
// sample commands to showcase cards, various sizes
|
|
commands := []Command{
|
|
{
|
|
Input: "help",
|
|
Result: dedent(`
|
|
Available commands:
|
|
- help Show this message
|
|
- ls List files
|
|
- cat FILE Show file contents
|
|
- run TASK Run a task
|
|
|
|
Tip: Use 'ls -la' for details.`,
|
|
),
|
|
},
|
|
{
|
|
Input: "ls -la /home/alice/projects",
|
|
Result: dedent(`
|
|
total 96
|
|
drwxr-xr-x 12 alice alice 4096 Aug 22 21:00 .
|
|
drwxr-xr-x 3 alice alice 4096 Aug 10 09:10 ..
|
|
-rw-r--r-- 1 alice alice 220 Aug 1 12:00 README.md
|
|
drwxr-xr-x 4 alice alice 4096 Aug 22 20:58 src
|
|
drwxr-xr-x 3 alice alice 4096 Aug 22 20:55 pkg
|
|
drwxr-xr-x 5 alice alice 4096 Aug 22 20:59 ui
|
|
`),
|
|
},
|
|
{
|
|
Input: "cat src/ui/main.go",
|
|
Result: dedent(`
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
func main() {
|
|
fmt.Println("ui starting...")
|
|
// ...lots of code...
|
|
}`,
|
|
),
|
|
},
|
|
{
|
|
Input: "run test-suite --verbose",
|
|
Result: longMockOutput(60), // long output to show truncation and scrolling in card result
|
|
},
|
|
{
|
|
Input: "grep -R \"TODO\" .",
|
|
Result: dedent(`
|
|
src/ui/widgets.go:23:// TODO: refactor toolbar
|
|
pkg/http/server.go:78:// TODO: handle timeouts
|
|
README.md:4:<!-- TODO: add usage examples -->`,
|
|
),
|
|
},
|
|
}
|
|
|
|
v := viewport.New(90, 30)
|
|
|
|
t := textarea.New()
|
|
t.ShowLineNumbers = false
|
|
t.Prompt = "$ "
|
|
|
|
m := model{
|
|
treeRoot: root,
|
|
viewport: v,
|
|
commands: commands,
|
|
textarea: t,
|
|
}
|
|
|
|
// set viewport content with current commands
|
|
m.resize(120, 40) // initial reasonable size for demo; WindowSizeMsg will update on real terminal
|
|
m.viewport.SetContent(m.renderCommandsContent())
|
|
m.viewport.GotoBottom()
|
|
|
|
return m
|
|
}
|