diff options
| author | Dax Raad <[email protected]> | 2025-05-30 20:47:56 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-05-30 20:48:36 -0400 |
| commit | f3da73553c45f17e04b1e77cb13eb0fca714d1bd (patch) | |
| tree | a24317a19e1ab2a89da50db669dc6894f15d00d1 /packages/tui/pkg | |
| parent | 9a26b3058ffc1023e5c7e54b6d571c903d15888e (diff) | |
| download | opencode-f3da73553c45f17e04b1e77cb13eb0fca714d1bd.tar.gz opencode-f3da73553c45f17e04b1e77cb13eb0fca714d1bd.zip | |
sync
Diffstat (limited to 'packages/tui/pkg')
| -rw-r--r-- | packages/tui/pkg/client/.gitignore | 2 | ||||
| -rw-r--r-- | packages/tui/pkg/client/client.go | 4 | ||||
| -rw-r--r-- | packages/tui/pkg/client/event.go | 53 | ||||
| -rw-r--r-- | packages/tui/pkg/tui/theme/opencode.go | 276 |
4 files changed, 335 insertions, 0 deletions
diff --git a/packages/tui/pkg/client/.gitignore b/packages/tui/pkg/client/.gitignore new file mode 100644 index 000000000..c56971e89 --- /dev/null +++ b/packages/tui/pkg/client/.gitignore @@ -0,0 +1,2 @@ +gen +generated-*.go diff --git a/packages/tui/pkg/client/client.go b/packages/tui/pkg/client/client.go new file mode 100644 index 000000000..bf2d5038e --- /dev/null +++ b/packages/tui/pkg/client/client.go @@ -0,0 +1,4 @@ +package client + +//go:generate bun run ../../js/src/index.ts generate +//go:generate go tool github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --package=client --generate=types,client,models -o generated-client.go ./gen/openapi.json diff --git a/packages/tui/pkg/client/event.go b/packages/tui/pkg/client/event.go new file mode 100644 index 000000000..f5aab2d26 --- /dev/null +++ b/packages/tui/pkg/client/event.go @@ -0,0 +1,53 @@ +package client + +import ( + "bufio" + "context" + "encoding/json" + "net/http" + "strings" +) + +func (c *Client) Event(ctx context.Context) (<-chan any, error) { + events := make(chan any) + req, err := http.NewRequestWithContext(ctx, "GET", c.Server+"event", nil) + if err != nil { + return nil, err + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + + go func() { + defer close(events) + defer resp.Body.Close() + + scanner := bufio.NewScanner(resp.Body) + for scanner.Scan() { + line := scanner.Text() + if strings.HasPrefix(line, "data: ") { + data := strings.TrimPrefix(line, "data: ") + + var event Event + if err := json.Unmarshal([]byte(data), &event); err != nil { + continue + } + + val, err := event.ValueByDiscriminator() + if err != nil { + continue + } + + select { + case events <- val: + case <-ctx.Done(): + return + } + } + } + }() + + return events, nil +} diff --git a/packages/tui/pkg/tui/theme/opencode.go b/packages/tui/pkg/tui/theme/opencode.go new file mode 100644 index 000000000..7ee6f15e5 --- /dev/null +++ b/packages/tui/pkg/tui/theme/opencode.go @@ -0,0 +1,276 @@ +package theme + +import ( + "github.com/charmbracelet/lipgloss" +) + +// OpenCodeTheme implements the Theme interface with OpenCode brand colors. +// It provides both dark and light variants. +type OpenCodeTheme struct { + BaseTheme +} + +// NewOpenCodeTheme creates a new instance of the OpenCode theme. +func NewOpenCodeTheme() *OpenCodeTheme { + // OpenCode color palette + // Dark mode colors + darkBackground := "#212121" + darkCurrentLine := "#252525" + darkSelection := "#303030" + darkForeground := "#e0e0e0" + darkComment := "#6a6a6a" + darkPrimary := "#fab283" // Primary orange/gold + darkSecondary := "#5c9cf5" // Secondary blue + darkAccent := "#9d7cd8" // Accent purple + darkRed := "#e06c75" // Error red + darkOrange := "#f5a742" // Warning orange + darkGreen := "#7fd88f" // Success green + darkCyan := "#56b6c2" // Info cyan + darkYellow := "#e5c07b" // Emphasized text + darkBorder := "#4b4c5c" // Border color + + // Light mode colors + lightBackground := "#f8f8f8" + lightCurrentLine := "#f0f0f0" + lightSelection := "#e5e5e6" + lightForeground := "#2a2a2a" + lightComment := "#8a8a8a" + lightPrimary := "#3b7dd8" // Primary blue + lightSecondary := "#7b5bb6" // Secondary purple + lightAccent := "#d68c27" // Accent orange/gold + lightRed := "#d1383d" // Error red + lightOrange := "#d68c27" // Warning orange + lightGreen := "#3d9a57" // Success green + lightCyan := "#318795" // Info cyan + lightYellow := "#b0851f" // Emphasized text + lightBorder := "#d3d3d3" // Border color + + theme := &OpenCodeTheme{} + + // Base colors + theme.PrimaryColor = lipgloss.AdaptiveColor{ + Dark: darkPrimary, + Light: lightPrimary, + } + theme.SecondaryColor = lipgloss.AdaptiveColor{ + Dark: darkSecondary, + Light: lightSecondary, + } + theme.AccentColor = lipgloss.AdaptiveColor{ + Dark: darkAccent, + Light: lightAccent, + } + + // Status colors + theme.ErrorColor = lipgloss.AdaptiveColor{ + Dark: darkRed, + Light: lightRed, + } + theme.WarningColor = lipgloss.AdaptiveColor{ + Dark: darkOrange, + Light: lightOrange, + } + theme.SuccessColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.InfoColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + + // Text colors + theme.TextColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + theme.TextMutedColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.TextEmphasizedColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + + // Background colors + theme.BackgroundColor = lipgloss.AdaptiveColor{ + Dark: darkBackground, + Light: lightBackground, + } + theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{ + Dark: darkCurrentLine, + Light: lightCurrentLine, + } + theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{ + Dark: "#121212", // Slightly darker than background + Light: "#ffffff", // Slightly lighter than background + } + + // Border colors + theme.BorderNormalColor = lipgloss.AdaptiveColor{ + Dark: darkBorder, + Light: lightBorder, + } + theme.BorderFocusedColor = lipgloss.AdaptiveColor{ + Dark: darkPrimary, + Light: lightPrimary, + } + theme.BorderDimColor = lipgloss.AdaptiveColor{ + Dark: darkSelection, + Light: lightSelection, + } + + // Diff view colors + theme.DiffAddedColor = lipgloss.AdaptiveColor{ + Dark: "#478247", + Light: "#2E7D32", + } + theme.DiffRemovedColor = lipgloss.AdaptiveColor{ + Dark: "#7C4444", + Light: "#C62828", + } + theme.DiffContextColor = lipgloss.AdaptiveColor{ + Dark: "#a0a0a0", + Light: "#757575", + } + theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{ + Dark: "#a0a0a0", + Light: "#757575", + } + theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{ + Dark: "#DAFADA", + Light: "#A5D6A7", + } + theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{ + Dark: "#FADADD", + Light: "#EF9A9A", + } + theme.DiffAddedBgColor = lipgloss.AdaptiveColor{ + Dark: "#303A30", + Light: "#E8F5E9", + } + theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{ + Dark: "#3A3030", + Light: "#FFEBEE", + } + theme.DiffContextBgColor = lipgloss.AdaptiveColor{ + Dark: darkBackground, + Light: lightBackground, + } + theme.DiffLineNumberColor = lipgloss.AdaptiveColor{ + Dark: "#888888", + Light: "#9E9E9E", + } + theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{ + Dark: "#293229", + Light: "#C8E6C9", + } + theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{ + Dark: "#332929", + Light: "#FFCDD2", + } + + // Markdown colors + theme.MarkdownTextColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{ + Dark: darkSecondary, + Light: lightSecondary, + } + theme.MarkdownLinkColor = lipgloss.AdaptiveColor{ + Dark: darkPrimary, + Light: lightPrimary, + } + theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.MarkdownCodeColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + theme.MarkdownEmphColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + theme.MarkdownStrongColor = lipgloss.AdaptiveColor{ + Dark: darkAccent, + Light: lightAccent, + } + theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.MarkdownListItemColor = lipgloss.AdaptiveColor{ + Dark: darkPrimary, + Light: lightPrimary, + } + theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.MarkdownImageColor = lipgloss.AdaptiveColor{ + Dark: darkPrimary, + Light: lightPrimary, + } + theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + + // Syntax highlighting colors + theme.SyntaxCommentColor = lipgloss.AdaptiveColor{ + Dark: darkComment, + Light: lightComment, + } + theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{ + Dark: darkSecondary, + Light: lightSecondary, + } + theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{ + Dark: darkPrimary, + Light: lightPrimary, + } + theme.SyntaxVariableColor = lipgloss.AdaptiveColor{ + Dark: darkRed, + Light: lightRed, + } + theme.SyntaxStringColor = lipgloss.AdaptiveColor{ + Dark: darkGreen, + Light: lightGreen, + } + theme.SyntaxNumberColor = lipgloss.AdaptiveColor{ + Dark: darkAccent, + Light: lightAccent, + } + theme.SyntaxTypeColor = lipgloss.AdaptiveColor{ + Dark: darkYellow, + Light: lightYellow, + } + theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{ + Dark: darkCyan, + Light: lightCyan, + } + theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{ + Dark: darkForeground, + Light: lightForeground, + } + + return theme +} + +func init() { + // Register the OpenCode theme with the theme manager + RegisterTheme("opencode", NewOpenCodeTheme()) +} |
