Every colour was a 256-colour ANSI index hardcoded in styles.go, so changing the palette meant editing the styles themselves. This puts a semantic token set between the two: styles name roles, a theme supplies the colours. internal/theme holds the twelve tokens, the two built-ins (gruvbox-dark, the new default, and gruvbox-light) and the loader for user themes in ~/.config/terdut-tui/themes/. A user file may 'extends:' a built-in and override only what it cares about, and may shadow a built-in name to tweak it in place. Unknown keys, malformed colours and incomplete themes are refused with a message naming what went wrong. Colours are truecolor hex now: lipgloss downsamples for 256- and 16-colour terminals and honours NO_COLOR, so themes carry no fallbacks of their own. An ANSI index is still accepted for anyone who would rather follow their terminal's own palette. The 21 package-level style vars become a Styles struct on the Model, which is what rule 3 asked for all along; the four free functions in view.go take one as their first argument. The embedded bubbles components are restyled from the same tokens — otherwise a theme would leave a pink selected row and grey help text behind. Note that the table's Cell style deliberately keeps no foreground: bubbles renders cells before wrapping the row in Selected, so a colour there cuts the selection highlight short.
This commit is contained in:
@@ -28,12 +28,13 @@ non-destructive "not now" alternative.
|
||||
main.go CLI entry point: flags, config load, health check, start TUI
|
||||
internal/api/client.go REST API client — one method per endpoint
|
||||
internal/config/config.go Config loader (~/.config/terdut-tui/config.yaml)
|
||||
internal/theme/ Colour themes: semantic tokens, built-ins, user file loader
|
||||
internal/tui/ Bubbletea UI
|
||||
model.go Model struct, mode/section constants, Init(), tea.Cmd constructors
|
||||
update.go Update() — dispatch only, no API calls inline
|
||||
view.go View() — pure rendering
|
||||
keys.go keyMap (bubbles/key pattern)
|
||||
styles.go All lipgloss styles
|
||||
styles.go Styles struct — every lipgloss style, built from a theme
|
||||
internal/updater/updater.go Self-update via GitHub Releases
|
||||
```
|
||||
|
||||
@@ -43,6 +44,9 @@ internal/updater/updater.go Self-update via GitHub Releases
|
||||
2. **`View()` is pure** — no side effects, no state mutations.
|
||||
3. **All state in `Model`** — no globals.
|
||||
4. **All styles in `styles.go`** — never use lipgloss inline in `view.go`.
|
||||
Styles live on `Model.styles`, built once by `newStyles(theme.Theme)`; the
|
||||
handful of free functions in `view.go` take a `Styles` as their first
|
||||
argument. No colour literal appears outside `internal/theme`.
|
||||
|
||||
## Config
|
||||
|
||||
@@ -52,8 +56,13 @@ Location: `~/.config/terdut-tui/config.yaml`
|
||||
server_url: https://terdut.example.com
|
||||
api_key: <64-char hex key>
|
||||
refresh_interval: 30 # seconds, optional, default 30
|
||||
theme: gruvbox-dark # optional, default gruvbox-dark
|
||||
```
|
||||
|
||||
Built-in themes are `gruvbox-dark` and `gruvbox-light`; user themes are YAML
|
||||
files in `~/.config/terdut-tui/themes/`, optionally `extends:`-ing a built-in.
|
||||
See the README for the token list.
|
||||
|
||||
The API key is a one-time secret generated by terdut-server (`POST /api/users/{id}/api-keys`).
|
||||
|
||||
## Running
|
||||
|
||||
Reference in New Issue
Block a user