diff options
| author | Priyansh <[email protected]> | 2025-08-27 14:35:54 +0530 |
|---|---|---|
| committer | Priyansh <[email protected]> | 2025-08-27 14:35:54 +0530 |
| commit | 7e779464a09a78544ec4c59c59581718e90cb1e2 (patch) | |
| tree | 8df25421d4022ce27e0651246e3b66be1baf7bd3 | |
| parent | b169c473c0aae8921470cffa58437ee6ad9aca9d (diff) | |
| download | nectar-7e779464a09a78544ec4c59c59581718e90cb1e2.tar.xz nectar-7e779464a09a78544ec4c59c59581718e90cb1e2.zip | |
setup initial stuff along with multiple screens
| -rw-r--r-- | Makefile | 33 | ||||
| -rw-r--r-- | go.mod | 31 | ||||
| -rw-r--r-- | go.sum | 49 | ||||
| -rw-r--r-- | nectar/main.go | 17 | ||||
| -rw-r--r-- | screens/aux.go | 47 | ||||
| -rw-r--r-- | screens/root.go | 30 | ||||
| -rw-r--r-- | screens/screens.go | 59 | ||||
| -rw-r--r-- | screens/types.go | 6 |
8 files changed, 272 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..aeba359 --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ +BINARY_NAME=nectar +BUILD_PATH=bin/$(BINARY_NAME) +MAIN_PATH=$(BINARY_NAME)/main.go + +.PHONY: setup clean build run dev all + +setup: + @echo "Setting up environment..." + @go mod download + @echo "Environment setup complete." + +clean: + @echo "Cleaning up..." + @rm -rf bin + @echo "Cleanup complete." + +build: + @echo "Building..." + @go build -o $(BUILD_PATH) $(MAIN_PATH) || true + @echo "Build complete." + +run: + @if [ ! -f $(BUILD_PATH) ]; then echo "Binary not found. Building binary..."; $(MAKE) -s build; fi + @echo "Running..." + @$(BUILD_PATH) || true + +dev: + @echo "Running in development mode..." + @go run $(MAIN_PATH) || true + +all: setup clean build run + +.SILENT:
\ No newline at end of file @@ -0,0 +1,31 @@ +module nectar + +go 1.24.5 + +require ( + github.com/charmbracelet/bubbles v0.21.0 + github.com/charmbracelet/bubbletea v1.3.6 + golang.org/x/term v0.34.0 +) + +require ( + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect + github.com/charmbracelet/lipgloss v1.1.0 // indirect + github.com/charmbracelet/x/ansi v0.9.3 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/termenv v0.16.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/text v0.3.8 // indirect +) @@ -0,0 +1,49 @@ +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= +github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= +github.com/charmbracelet/bubbletea v1.3.6 h1:VkHIxPJQeDt0aFJIsVxw8BQdh/F/L2KKZGsK6et5taU= +github.com/charmbracelet/bubbletea v1.3.6/go.mod h1:oQD9VCRQFF8KplacJLo28/jofOI2ToOfGYeFgBBxHOc= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh6GXd0= +github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= +golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= diff --git a/nectar/main.go b/nectar/main.go new file mode 100644 index 0000000..50363a9 --- /dev/null +++ b/nectar/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "fmt" + "nectar/screens" + "os" + + tea "github.com/charmbracelet/bubbletea" +) + +func main() { + program := tea.NewProgram(screens.Start(), tea.WithAltScreen()) + if _, err := program.Run(); err != nil { + fmt.Println("Error running program:", err) + os.Exit(1) + } +} diff --git a/screens/aux.go b/screens/aux.go new file mode 100644 index 0000000..b283d5e --- /dev/null +++ b/screens/aux.go @@ -0,0 +1,47 @@ +package screens + +import ( + "fmt" + + "github.com/charmbracelet/bubbles/spinner" + tea "github.com/charmbracelet/bubbletea" +) + +func _aux() tea.Model { + s := spinner.New() + s.Spinner = spinner.Dot + return &auxScreen{ + spinner: s, + } +} + +type auxScreen struct { + spinner spinner.Model +} + +func (a *auxScreen) Init() tea.Cmd { + return a.spinner.Tick +} + +func (a *auxScreen) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c", "q": + return a, tea.Quit + case "r": + return a, switchScreen(_root()) + default: + return a, nil + } + default: + var cmd tea.Cmd + a.spinner, cmd = a.spinner.Update(msg) + return a, cmd + } +} + +func (a *auxScreen) View() string { + str := fmt.Sprintf("%s Loading forever... Press 'r' to return to root or 'q' to quit.\n\n", a.spinner.View()) + return str +} diff --git a/screens/root.go b/screens/root.go new file mode 100644 index 0000000..10d0b62 --- /dev/null +++ b/screens/root.go @@ -0,0 +1,30 @@ +package screens + +import tea "github.com/charmbracelet/bubbletea" + +type rootScreen struct{} + +func _root() tea.Model { + return &rootScreen{} +} + +func (r *rootScreen) Init() tea.Cmd { + return nil +} + +func (r *rootScreen) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c", "q": + return r, tea.Quit + case "a": + return r, switchScreen(_aux()) + } + } + return r, nil +} + +func (r *rootScreen) View() string { + return "Welcome to Nectar!\nPress Ctrl+C to exit. Press 'a' to go to the auxiliary screen." +} diff --git a/screens/screens.go b/screens/screens.go new file mode 100644 index 0000000..77197ca --- /dev/null +++ b/screens/screens.go @@ -0,0 +1,59 @@ +package screens + +import ( + "os" + + tea "github.com/charmbracelet/bubbletea" + "golang.org/x/term" +) + +type SwitchMsg struct { + Screen tea.Model +} + +type ScreenManager struct { + currentScreen tea.Model +} + +var globals Globals + +func (sm *ScreenManager) Init() tea.Cmd { + return sm.currentScreen.Init() +} + +func (sm *ScreenManager) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch m := msg.(type) { + case tea.WindowSizeMsg: + globals.width, globals.height = m.Width, m.Height + return sm, nil + case SwitchMsg: + sm.currentScreen = m.Screen + return sm, sm.currentScreen.Init() + } + + updatedScreen, cmd := sm.currentScreen.Update(msg) + sm.currentScreen = updatedScreen + return sm, cmd +} + +func (sm *ScreenManager) View() string { + return sm.currentScreen.View() +} + +func switchScreen(screen tea.Model) tea.Cmd { + return func() tea.Msg { + return SwitchMsg{Screen: screen} + } +} + +func Start() tea.Model { + width, height, err := term.GetSize(int(os.Stdout.Fd())) + if err != nil { + width = 80 + height = 24 + } + + globals = Globals{width: width, height: height} + + return &ScreenManager{currentScreen: _root()} +} diff --git a/screens/types.go b/screens/types.go new file mode 100644 index 0000000..1d89809 --- /dev/null +++ b/screens/types.go @@ -0,0 +1,6 @@ +package screens + +type Globals struct { + width int + height int +} |
