aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPriyansh <[email protected]>2025-08-27 14:35:54 +0530
committerPriyansh <[email protected]>2025-08-27 14:35:54 +0530
commit7e779464a09a78544ec4c59c59581718e90cb1e2 (patch)
tree8df25421d4022ce27e0651246e3b66be1baf7bd3
parentb169c473c0aae8921470cffa58437ee6ad9aca9d (diff)
downloadnectar-7e779464a09a78544ec4c59c59581718e90cb1e2.tar.xz
nectar-7e779464a09a78544ec4c59c59581718e90cb1e2.zip
setup initial stuff along with multiple screens
-rw-r--r--Makefile33
-rw-r--r--go.mod31
-rw-r--r--go.sum49
-rw-r--r--nectar/main.go17
-rw-r--r--screens/aux.go47
-rw-r--r--screens/root.go30
-rw-r--r--screens/screens.go59
-rw-r--r--screens/types.go6
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
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..73da89b
--- /dev/null
+++ b/go.mod
@@ -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
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..c74fadb
--- /dev/null
+++ b/go.sum
@@ -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
+}