Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ type app struct {
}

func newApp() tea.Model {
theme := style.DefaultTheme()
theme := myTheme() // define your own style.Theme

leftStyle := lipgloss.NewStyle().
PaddingRight(2).
Expand Down
2 changes: 1 addition & 1 deletion doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
// Create panels that implement [tea.Model], then pass them to [shell.New]:
//
// s := shell.New(shell.Config{
// Theme: style.DefaultTheme(),
// Theme: myTheme,
// LeftPanel: &myLeftPanel{},
// MainPanel: &myMainPanel{},
// Keybinds: tuishell.GlobalKeys(false),
Expand Down
6 changes: 3 additions & 3 deletions docs/shell.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type Config struct {
| Option | Default |
|--------|---------|
| `LeftPanelWidth` | 30 |
| `MainFrameStyle` | `style.MainFrameStyle(theme)` — normal border with `theme.Border` color |
| `MainFrameStyle` | Normal border with `theme.Border` color |
| `RightPanel` | `nil` (no right panel) |
| `AppIcon` | `""` (empty statusline label) |
| `DevMode` | `false` |
Expand All @@ -34,7 +34,7 @@ type Config struct {

```go
s := shell.New(shell.Config{
Theme: style.DefaultTheme(),
Theme: myTheme,
LeftPanel: &myLeftPanel{},
MainPanel: &myMainPanel{},
Keybinds: tuishell.GlobalKeys(false),
Expand All @@ -45,7 +45,7 @@ s := shell.New(shell.Config{
## Full Example

```go
theme := style.DefaultTheme()
theme := myTheme()

leftStyle := lipgloss.NewStyle().
PaddingRight(2).
Expand Down
37 changes: 4 additions & 33 deletions docs/theming.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,27 +45,15 @@ type Theme struct {
}
```

## Default Theme
## Creating a Theme

`style.DefaultTheme()` returns a violet-based theme (used by mrglab):

```go
theme := style.DefaultTheme()
// Primary: Violet[300] (#a78bfa)
// Success: Green[300]
// Danger: Red[300]
// etc.
```

## Custom Theme

Create your own theme by defining all 30 tokens:
Define all 30 tokens to create your theme:

```go
import "charm.land/lipgloss/v2"

jiraTheme := style.Theme{
Primary: lipgloss.Color("#0052CC"), // Jira blue
myTheme := style.Theme{
Primary: lipgloss.Color("#0052CC"),
PrimaryBright: lipgloss.Color("#2684FF"),
PrimaryFg: lipgloss.Color("#FFFFFF"),
PrimaryDim: lipgloss.Color("#0747A6"),
Expand Down Expand Up @@ -100,23 +88,6 @@ jiraTheme := style.Theme{
}
```

## Color Palettes

tuishell provides Tailwind-style color palettes for convenience:

```go
import "github.com/felipeospina21/tuishell/style"

style.Blue[400] // "#60a5fa"
style.Red[500] // "#ef4444"
style.Green[300] // "#86efac"
style.Yellow[400] // "#facc15"
style.Violet[600] // "#7c3aed"
style.Orange[400] // "#fb923c"
```

Each palette has shades: `50`, `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`.

## Using Theme in Components

Pass the theme when creating the shell:
Expand Down
2 changes: 1 addition & 1 deletion hub/hub.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ var backKey = key.NewBinding(

// New creates a hub model from the given app entries.
func New(apps []AppEntry) Model {
theme := style.DefaultTheme()
theme := defaultTheme()

items := make([]list.Item, len(apps))
for i, a := range apps {
Expand Down
43 changes: 43 additions & 0 deletions hub/theme.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package hub

import (
"charm.land/lipgloss/v2"
"github.com/felipeospina21/tuishell/style"
)

func defaultTheme() style.Theme {
return style.Theme{
Primary: lipgloss.Color("#b8a6ff"),
PrimaryBright: lipgloss.Color("#9673ff"),
PrimaryFg: lipgloss.Color("#f2f0ff"),
PrimaryDim: lipgloss.Color("#4c01d6"),

Info: lipgloss.Color("#3ac4d9"),
InfoBright: lipgloss.Color("#1ca7be"),
Success: lipgloss.Color("#6beaaf"),
SuccessBright: lipgloss.Color("#3ad994"),
Danger: lipgloss.Color("#f9a8a8"),
DangerBright: lipgloss.Color("#f47575"),
Warning: lipgloss.Color("#ffe043"),
WarningBright: lipgloss.Color("#ffcc14"),
Caution: lipgloss.Color("#ff8237"),

Text: lipgloss.Color("#C4C4C4"),
TextInverse: lipgloss.Color("#111"),
TextDimmed: lipgloss.Color("#777777"),
Muted: lipgloss.Color("#999999"),
Dim: lipgloss.Color("#444444"),
Border: lipgloss.Color("#3f4145"),
ModalBorder: lipgloss.Color("#666666"),
SurfaceDim: lipgloss.Color("#1e1e24"),
SelectionBorder: lipgloss.Color("#AD58B4"),

StatusText: lipgloss.Color("#FFFDF5"),
StatusNormal: lipgloss.Color("#6914ff"),
StatusLoading: lipgloss.Color("#1A7A94"),
StatusError: lipgloss.Color("#CE3060"),
StatusDev: lipgloss.Color("#4E8212"),
StatusAccent1: lipgloss.Color("#A550DF"),
StatusAccent2: lipgloss.Color("#6124DF"),
}
}
6 changes: 4 additions & 2 deletions layout.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@ type LayoutConfig struct {
StatuslineLines int
}

// DefaultLayoutConfig returns a config using the default theme.
// DefaultLayoutConfig returns a config using the given theme.
func DefaultLayoutConfig(t style.Theme) LayoutConfig {
return LayoutConfig{
MainFrameStyle: style.MainFrameStyle(t),
MainFrameStyle: lipgloss.NewStyle().
Border(lipgloss.NormalBorder()).
BorderForeground(t.Border),
StatusBarStyle: lipgloss.NewStyle().Margin(0, 0),
LeftPanelStyle: lipgloss.NewStyle(),
RightPanelStyle: lipgloss.NewStyle(),
Expand Down
2 changes: 1 addition & 1 deletion popover/examples/confirm/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type model struct {
}

func newModel() model {
t := style.DefaultTheme()
t := defaultTheme()
return model{theme: t, confirm: popover.NewConfirm(t)}
}

Expand Down
43 changes: 43 additions & 0 deletions popover/examples/confirm/theme.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package main

import (
"charm.land/lipgloss/v2"
"github.com/felipeospina21/tuishell/style"
)

func defaultTheme() style.Theme {
return style.Theme{
Primary: lipgloss.Color("#b8a6ff"),
PrimaryBright: lipgloss.Color("#9673ff"),
PrimaryFg: lipgloss.Color("#f2f0ff"),
PrimaryDim: lipgloss.Color("#4c01d6"),

Info: lipgloss.Color("#3ac4d9"),
InfoBright: lipgloss.Color("#1ca7be"),
Success: lipgloss.Color("#6beaaf"),
SuccessBright: lipgloss.Color("#3ad994"),
Danger: lipgloss.Color("#f9a8a8"),
DangerBright: lipgloss.Color("#f47575"),
Warning: lipgloss.Color("#ffe043"),
WarningBright: lipgloss.Color("#ffcc14"),
Caution: lipgloss.Color("#ff8237"),

Text: lipgloss.Color("#C4C4C4"),
TextInverse: lipgloss.Color("#111"),
TextDimmed: lipgloss.Color("#777777"),
Muted: lipgloss.Color("#999999"),
Dim: lipgloss.Color("#444444"),
Border: lipgloss.Color("#3f4145"),
ModalBorder: lipgloss.Color("#666666"),
SurfaceDim: lipgloss.Color("#1e1e24"),
SelectionBorder: lipgloss.Color("#AD58B4"),

StatusText: lipgloss.Color("#FFFDF5"),
StatusNormal: lipgloss.Color("#6914ff"),
StatusLoading: lipgloss.Color("#1A7A94"),
StatusError: lipgloss.Color("#CE3060"),
StatusDev: lipgloss.Color("#4E8212"),
StatusAccent1: lipgloss.Color("#A550DF"),
StatusAccent2: lipgloss.Color("#6124DF"),
}
}
2 changes: 1 addition & 1 deletion popover/examples/input/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type model struct {
}

func newModel() model {
t := style.DefaultTheme()
t := defaultTheme()
return model{theme: t, input: popover.NewInput(t)}
}

Expand Down
43 changes: 43 additions & 0 deletions popover/examples/input/theme.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package main

import (
"charm.land/lipgloss/v2"
"github.com/felipeospina21/tuishell/style"
)

func defaultTheme() style.Theme {
return style.Theme{
Primary: lipgloss.Color("#b8a6ff"),
PrimaryBright: lipgloss.Color("#9673ff"),
PrimaryFg: lipgloss.Color("#f2f0ff"),
PrimaryDim: lipgloss.Color("#4c01d6"),

Info: lipgloss.Color("#3ac4d9"),
InfoBright: lipgloss.Color("#1ca7be"),
Success: lipgloss.Color("#6beaaf"),
SuccessBright: lipgloss.Color("#3ad994"),
Danger: lipgloss.Color("#f9a8a8"),
DangerBright: lipgloss.Color("#f47575"),
Warning: lipgloss.Color("#ffe043"),
WarningBright: lipgloss.Color("#ffcc14"),
Caution: lipgloss.Color("#ff8237"),

Text: lipgloss.Color("#C4C4C4"),
TextInverse: lipgloss.Color("#111"),
TextDimmed: lipgloss.Color("#777777"),
Muted: lipgloss.Color("#999999"),
Dim: lipgloss.Color("#444444"),
Border: lipgloss.Color("#3f4145"),
ModalBorder: lipgloss.Color("#666666"),
SurfaceDim: lipgloss.Color("#1e1e24"),
SelectionBorder: lipgloss.Color("#AD58B4"),

StatusText: lipgloss.Color("#FFFDF5"),
StatusNormal: lipgloss.Color("#6914ff"),
StatusLoading: lipgloss.Color("#1A7A94"),
StatusError: lipgloss.Color("#CE3060"),
StatusDev: lipgloss.Color("#4E8212"),
StatusAccent1: lipgloss.Color("#A550DF"),
StatusAccent2: lipgloss.Color("#6124DF"),
}
}
2 changes: 1 addition & 1 deletion popover/examples/list/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type model struct {
}

func newModel() model {
t := style.DefaultTheme()
t := defaultTheme()
return model{theme: t, list: popover.NewList(t)}
}

Expand Down
43 changes: 43 additions & 0 deletions popover/examples/list/theme.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package main

import (
"charm.land/lipgloss/v2"
"github.com/felipeospina21/tuishell/style"
)

func defaultTheme() style.Theme {
return style.Theme{
Primary: lipgloss.Color("#b8a6ff"),
PrimaryBright: lipgloss.Color("#9673ff"),
PrimaryFg: lipgloss.Color("#f2f0ff"),
PrimaryDim: lipgloss.Color("#4c01d6"),

Info: lipgloss.Color("#3ac4d9"),
InfoBright: lipgloss.Color("#1ca7be"),
Success: lipgloss.Color("#6beaaf"),
SuccessBright: lipgloss.Color("#3ad994"),
Danger: lipgloss.Color("#f9a8a8"),
DangerBright: lipgloss.Color("#f47575"),
Warning: lipgloss.Color("#ffe043"),
WarningBright: lipgloss.Color("#ffcc14"),
Caution: lipgloss.Color("#ff8237"),

Text: lipgloss.Color("#C4C4C4"),
TextInverse: lipgloss.Color("#111"),
TextDimmed: lipgloss.Color("#777777"),
Muted: lipgloss.Color("#999999"),
Dim: lipgloss.Color("#444444"),
Border: lipgloss.Color("#3f4145"),
ModalBorder: lipgloss.Color("#666666"),
SurfaceDim: lipgloss.Color("#1e1e24"),
SelectionBorder: lipgloss.Color("#AD58B4"),

StatusText: lipgloss.Color("#FFFDF5"),
StatusNormal: lipgloss.Color("#6914ff"),
StatusLoading: lipgloss.Color("#1A7A94"),
StatusError: lipgloss.Color("#CE3060"),
StatusDev: lipgloss.Color("#4E8212"),
StatusAccent1: lipgloss.Color("#A550DF"),
StatusAccent2: lipgloss.Color("#6124DF"),
}
}
3 changes: 1 addition & 2 deletions shell/example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@ import (
"charm.land/lipgloss/v2"
"github.com/felipeospina21/tuishell"
"github.com/felipeospina21/tuishell/shell"
"github.com/felipeospina21/tuishell/style"
"github.com/felipeospina21/tuishell/table"
)

var theme = style.DefaultTheme()
var theme = defaultTheme()

func main() {
p := tea.NewProgram(newApp())
Expand Down
43 changes: 43 additions & 0 deletions shell/example/theme.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package main

import (
"charm.land/lipgloss/v2"
"github.com/felipeospina21/tuishell/style"
)

func defaultTheme() style.Theme {
return style.Theme{
Primary: lipgloss.Color("#b8a6ff"),
PrimaryBright: lipgloss.Color("#9673ff"),
PrimaryFg: lipgloss.Color("#f2f0ff"),
PrimaryDim: lipgloss.Color("#4c01d6"),

Info: lipgloss.Color("#3ac4d9"),
InfoBright: lipgloss.Color("#1ca7be"),
Success: lipgloss.Color("#6beaaf"),
SuccessBright: lipgloss.Color("#3ad994"),
Danger: lipgloss.Color("#f9a8a8"),
DangerBright: lipgloss.Color("#f47575"),
Warning: lipgloss.Color("#ffe043"),
WarningBright: lipgloss.Color("#ffcc14"),
Caution: lipgloss.Color("#ff8237"),

Text: lipgloss.Color("#C4C4C4"),
TextInverse: lipgloss.Color("#111"),
TextDimmed: lipgloss.Color("#777777"),
Muted: lipgloss.Color("#999999"),
Dim: lipgloss.Color("#444444"),
Border: lipgloss.Color("#3f4145"),
ModalBorder: lipgloss.Color("#666666"),
SurfaceDim: lipgloss.Color("#1e1e24"),
SelectionBorder: lipgloss.Color("#AD58B4"),

StatusText: lipgloss.Color("#FFFDF5"),
StatusNormal: lipgloss.Color("#6914ff"),
StatusLoading: lipgloss.Color("#1A7A94"),
StatusError: lipgloss.Color("#CE3060"),
StatusDev: lipgloss.Color("#4E8212"),
StatusAccent1: lipgloss.Color("#A550DF"),
StatusAccent2: lipgloss.Color("#6124DF"),
}
}
4 changes: 3 additions & 1 deletion shell/shell.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ func New(cfg Config) Model {
cfg.LeftPanelWidth = 30
}
if cfg.MainFrameStyle.GetWidth() == 0 {
cfg.MainFrameStyle = style.MainFrameStyle(t)
cfg.MainFrameStyle = lipgloss.NewStyle().
Border(lipgloss.NormalBorder()).
BorderForeground(t.Border)
}

ctx := tuishell.AppContext{FocusedPanel: tuishell.LeftPanel, DevMode: cfg.DevMode}
Expand Down
Loading
Loading