- commit
- 6b311561cb5430a4a618e8ab875f89d80bb776c8
- parent
- d925a68ea742bf6a2a75b2667f60620600769943
- author
- Dami <dami.etoile@gmail.com>
@@ -29,48 +29,46 @@ just tidy # go mod tidy
2929 3030 **Always run `just fmt` and `just lint` before committing.**3131 32+Enabled linters (`.golangci.yml`): errcheck, gofumpt (extra-rules), gosimple, govet, ineffassign, misspell (US locale), staticcheck, unused.33+3234 ---3335 3436 ## Project Structure3537 ```3638 puzzletea/37-├── main.go # Minimal entry point: wires cmd package39+├── main.go # Entry point: wires cmd package3840 ├── app/ # Root TUI model (Elm architecture)39-│ ├── model.go # GameCategories registry, model struct, constructors40-│ ├── update.go # Update loop, keyboard/event handling, state transitions41-│ ├── view.go # View rendering for each screen state42-│ ├── keys.go # Root-level keybinding definitions43-│ ├── spawn.go # Async game spawning, save/load, unique name generation44-│ └── debug.go # Debug overlay rendering (glamour markdown)41+│ ├── model.go, update.go, view.go, keys.go, spawn.go, debug.go4542 ├── cmd/ # CLI commands (Cobra)46-│ └── cmd.go # rootCmd, newCmd, continueCmd, listCmd47-├── stats/ # Stats & progression system48-│ ├── stats.go # XP/level math, streaks, card data + rendering49-│ └── stats_test.go # Tests for XP, levels, streaks, cards50-├── game/ # Plugin interfaces (Gamer, Mode, Spawner), cursor, keys, style51-├── store/ # SQLite persistence (GameRecord, CRUD, stats queries)52-├── ui/ # Shared UI: menu list, table, panel, styles, MenuItem53-├── daily/ # Daily puzzle seeding, RNG, mode selection54-├── resolve/ # CLI argument resolution (category/mode name matching)55-├── namegen/ # Adjective-noun name generator43+│ ├── root.go, new.go, continue.go, list.go44+├── config/ # Persistent JSON config (~/.puzzletea/config.json)45+├── theme/ # Color theming (WCAG-compliant palettes, contrast utils)46+├── stats/ # XP/level math, streaks, card rendering47+├── game/ # Plugin interfaces, cursor, keys, style, border helpers48+├── store/ # SQLite persistence (~/.puzzletea/puzzletea.db)49+├── ui/ # Shared UI: menu list, main menu, table, panel, styles50+├── daily/ # Daily puzzle seeding, RNG, mode selection51+├── resolve/ # CLI argument resolution (category/mode name matching)52+├── namegen/ # Adjective-noun name generator5653 ├── hashiwokakero/, hitori/, lightsout/, nonogram/5754 ├── shikaku/, sudoku/, takuzu/, wordsearch/ # Puzzle game packages58-├── plan/ # Design/planning documents59-└── vhs/ # GIF preview tapes55+└── vhs/ # VHS tape files for GIF previews6056 ```6157 6258 Each puzzle package follows a consistent file structure:6359 - **Capitalized**: `Model.go`, `Gamemode.go`, `Export.go`64-- **Lowercase**: `grid.go`, `keys.go`, `style.go`, `generator.go`, `<game>_test.go`60+- **Lowercase**: `grid.go`, `keys.go`, `style.go`, `generator.go`, `mouse.go`, `<game>_test.go`61+- **Docs**: `help.md` (embedded via `//go:embed`), `README.md`6562 6663 ---6764 6865 ## Code Style Guidelines6966 7067 ### Formatting71-- Use `gofumpt` (stricter than gofmt) -- run `just fmt`68+- Use `gofumpt` (stricter than gofmt, extra-rules enabled) -- run `just fmt`7269 - No comments required unless explaining non-obvious logic7370 - Keep lines under ~100 characters71+- US English spelling enforced by misspell linter7472 7573 ### Imports7674 Two groups separated by a blank line: stdlib, then everything else (internal + external sorted together). When there are many internal imports, a third group separating internal from external is acceptable.@@ -80,11 +78,12 @@ import (
8078 "fmt"8179 8280 "github.com/FelineStateMachine/puzzletea/game"83- "github.com/charmbracelet/bubbles/key"84- tea "github.com/charmbracelet/bubbletea"85- "github.com/charmbracelet/lipgloss"81+ "charm.land/bubbles/v2/key"82+ tea "charm.land/bubbletea/v2"83+ "charm.land/lipgloss/v2"8684 )8785 ```86+Note: always alias bubbletea as `tea`.8887 8988 ### Naming Conventions9089 - **Types**: PascalCase (`Model`, `NonogramMode`, `Entry`)@@ -94,17 +93,25 @@ import (
9493 - **Interfaces**: PascalCase (`Gamer`, `Spawner`, `Mode`)9594 9695 ### Type Declarations97-Prefer grouped type aliases: `type ( grid [][]rune; state string )`96+Prefer grouped type blocks: `type ( grid [][]rune; state string )`9897 9998 ### Interface Compliance100-Use compile-time checks: `var _ game.Gamer = Model{}`, `var _ game.Spawner = NonogramMode{}`99+Use compile-time checks in grouped var blocks:100+```go101+var (102+ _ game.Mode = NonogramMode{}103+ _ game.Spawner = NonogramMode{}104+ _ game.SeededSpawner = NonogramMode{}105+)106+```101107 102108 ### Error Handling103109 - Return descriptive errors: `errors.New("puzzle width does not support row tomography definition")`104110 - Check errors immediately; use `fmt.Errorf` with `%w` only when wrapping adds context111+- No assertion libraries in tests -- use `t.Errorf` / `t.Fatalf` only105112 106113 ### Styling107-Use `lipgloss.AdaptiveColor` with ANSI 256 palette numbers. Avoid hex colors.114+Use the `theme` package for colors (`theme.Current().Accent`, etc.) and `game/style.go` shared accessors (`CursorFG()`, `CursorBG()`, `ConflictFG()`). Use `compat.AdaptiveColor` from `charm.land/lipgloss/v2/compat` for adaptive light/dark colors.108115 109116 ---110117 @@ -135,10 +142,12 @@ type SeededSpawner interface {
135142 }136143 ```137144 145+Every mode type embeds `game.BaseMode` via `game.NewBaseMode(title, description)`.146+138147 ### Puzzle Package Exports139-Every puzzle package exports `Modes`, `DailyModes` (`[]list.Item`), `HelpContent` (`string`), `NewMode(...)`, `New(...)`, `ImportModel([]byte) (*Model, error)`, and `DefaultKeyMap`.148+Every puzzle package exports: `Modes`, `DailyModes` (`[]list.Item`), `HelpContent` (`string`, from `//go:embed help.md`), `NewMode(...)`, `New(...)`, `ImportModel([]byte) (*Model, error)`, and `DefaultKeyMap`.140149 141-Each package registers itself via `init()`:150+Each package registers itself via `init()` in `Gamemode.go`:142151 ```go143152 func init() {144153 game.Register("Nonogram", func(data []byte) (game.Gamer, error) {@@ -156,6 +165,7 @@ func init() {
156165 // --- generateTomography (P0) --- // P0 = critical157166 // --- Grid serialization (P1) --- // P1 = important158167 // --- generateRandomState (P2) --- // P2 = generators/slow168+// --- TitleBarView (P3) --- // P3 = low-priority UI159169 ```160170 161171 ### Table-Driven Tests with Subtests@@ -5,6 +5,7 @@ package app
55 import (66 "time"77 8+ "github.com/FelineStateMachine/puzzletea/config"89 "github.com/FelineStateMachine/puzzletea/game"910 "github.com/FelineStateMachine/puzzletea/hashiwokakero"1011 "github.com/FelineStateMachine/puzzletea/hitori"@@ -15,12 +16,14 @@ import (
1516 "github.com/FelineStateMachine/puzzletea/store"1617 "github.com/FelineStateMachine/puzzletea/sudoku"1718 "github.com/FelineStateMachine/puzzletea/takuzu"19+ "github.com/FelineStateMachine/puzzletea/theme"1820 "github.com/FelineStateMachine/puzzletea/ui"1921 "github.com/FelineStateMachine/puzzletea/wordsearch"2022 2123 "charm.land/bubbles/v2/list"2224 "charm.land/bubbles/v2/spinner"2325 "charm.land/bubbles/v2/table"26+ "charm.land/bubbles/v2/textinput"2427 "charm.land/bubbles/v2/viewport"2528 tea "charm.land/bubbletea/v2"2629 "charm.land/lipgloss/v2"@@ -40,16 +43,29 @@ var GameCategories = []list.Item{
4043 }4144 4245 var mainMenuItems = []ui.MenuItem{46+ {ItemTitle: "Play", Desc: "start or continue a puzzle"},47+ {ItemTitle: "Stats", Desc: "your progress"},48+ {ItemTitle: "Options", Desc: "configure and learn"},49+ {ItemTitle: "Quit", Desc: "exit puzzletea"},50+}51+52+var playMenuItems = []ui.MenuItem{4353 {ItemTitle: "Daily Puzzle", Desc: time.Now().Format("Jan _2 06")},4454 {ItemTitle: "Generate", Desc: "a new puzzle"},45- {ItemTitle: "Continue", Desc: "a saved puzzle"},46- {ItemTitle: "Stats", Desc: "your progress"},55+ {ItemTitle: "Continue", Desc: "a previously played puzzle"},56+ {ItemTitle: "Enter Seed", Desc: "for a set puzzle"},57+}58+59+var optionsMenuItems = []ui.MenuItem{60+ {ItemTitle: "Theme", Desc: "change colors"},4761 {ItemTitle: "Guides", Desc: "learn the rules"},48- {ItemTitle: "Quit", Desc: "exit puzzletea"},4962 }5063 5164 const (5265 mainMenuView = iota66+ playMenuView67+ optionsMenuView68+ seedInputView5369 gameSelectView5470 modeSelectView5571 generatingView@@ -58,12 +74,15 @@ const (
5874 helpSelectView5975 helpDetailView6076 statsView77+ themeSelectView6178 )6279 6380 type model struct {6481 state int6582 6683 mainMenu ui.MainMenu84+ playMenu ui.MainMenu85+ optionsMenu ui.MainMenu6786 gameSelectList list.Model6887 modeSelectList list.Model6988 selectedCategory game.Category@@ -95,6 +114,13 @@ type model struct {
95114 dailyGameType string // e.g. "Nonogram"96115 dailyModeTitle string // e.g. "Standard"97116 117+ // Seed input state118+ seedInput textinput.Model119+ seedPending bool // true while generating a seeded puzzle120+ seedName string // pre-computed seed-derived name121+ seedGameType string // game type from rendezvous hashing122+ seedModeTitle string // mode title from rendezvous hashing123+98124 // Help page state99125 helpSelectList list.Model100126 helpCategory game.Category@@ -106,42 +132,53 @@ type model struct {
106132 statsCards []stats.Card107133 statsProfile stats.ProfileBanner108134 statsViewport viewport.Model135+136+ // Theme picker state137+ themeList list.Model138+ previousTheme string // for revert on Esc139+140+ // Config141+ cfg *config.Config142+}143+144+func newSpinner() spinner.Model {145+ p := theme.Current()146+ sp := spinner.New()147+ sp.Spinner = spinner.Dot148+ sp.Style = lipgloss.NewStyle().Foreground(p.Accent)149+ return sp109150 }110151 111152 // InitialModel creates the root TUI model for the main menu.112-func InitialModel(s *store.Store) model {153+func InitialModel(s *store.Store, cfg *config.Config) model {113154 r := initDebugRenderer()114155 l := ui.InitList(GameCategories, "Select Category")115156 mm := ui.NewMainMenu(mainMenuItems)116- sp := spinner.New()117- sp.Spinner = spinner.Dot118- sp.Style = lipgloss.NewStyle().Foreground(ui.MenuAccent)119157 return model{120158 state: mainMenuView,121159 debugRenderer: r,122160 gameSelectList: l,123161 mainMenu: mm,124- spinner: sp,162+ spinner: newSpinner(),125163 store: s,164+ cfg: cfg,126165 }127166 }128167 129168 // InitialModelWithGame creates a model that starts directly in gameView,130169 // bypassing the menu. Used by CLI flags (--new, --continue).131-func InitialModelWithGame(s *store.Store, g game.Gamer, activeGameID int64, completionSaved bool) model {170+func InitialModelWithGame(s *store.Store, cfg *config.Config, g game.Gamer, activeGameID int64, completionSaved bool) model {132171 r := initDebugRenderer()133172 l := ui.InitList(GameCategories, "Select Category")134173 mm := ui.NewMainMenu(mainMenuItems)135- sp := spinner.New()136- sp.Spinner = spinner.Dot137- sp.Style = lipgloss.NewStyle().Foreground(ui.MenuAccent)138174 return model{139175 state: gameView,140176 debugRenderer: r,141177 gameSelectList: l,142178 mainMenu: mm,143- spinner: sp,179+ spinner: newSpinner(),144180 store: s,181+ cfg: cfg,145182 game: g,146183 activeGameID: activeGameID,147184 completionSaved: completionSaved,@@ -33,7 +33,9 @@ func spawnSeededCmd(spawner game.SeededSpawner, rng *rand.Rand) tea.Cmd {
3333 func (m model) handleSpawnComplete(msg game.SpawnCompleteMsg) (tea.Model, tea.Cmd) {3434 m.generating = false3535 isDaily := m.dailyPending36+ isSeed := m.seedPending3637 m.dailyPending = false38+ m.seedPending = false3739 3840 // If the user navigated away while generating, discard the result.3941 if m.state != generatingView {@@ -42,8 +44,8 @@ func (m model) handleSpawnComplete(msg game.SpawnCompleteMsg) (tea.Model, tea.Cm
4244 4345 if msg.Err != nil {4446 log.Printf("failed to spawn game: %v", msg.Err)45- if isDaily {46- m.state = mainMenuView47+ if isDaily || isSeed {48+ m.state = playMenuView4749 } else {4850 m.state = modeSelectView4951 }@@ -56,6 +58,11 @@ func (m model) handleSpawnComplete(msg game.SpawnCompleteMsg) (tea.Model, tea.Cm
5658 gameType = m.dailyGameType5759 modeTitle = m.dailyModeTitle5860 m.game = msg.Game.SetTitle(name)61+ } else if isSeed {62+ name = m.seedName63+ gameType = m.seedGameType64+ modeTitle = m.seedModeTitle65+ m.game = msg.Game.SetTitle(name)5966 } else {6067 name = GenerateUniqueName(m.store)6168 gameType = m.selectedCategory.Name@@ -2,15 +2,22 @@ package app
22 33 import (44 "log"5+ "strings"56 "time"67 8+ "github.com/FelineStateMachine/puzzletea/config"79 "github.com/FelineStateMachine/puzzletea/daily"810 "github.com/FelineStateMachine/puzzletea/game"11+ "github.com/FelineStateMachine/puzzletea/namegen"12+ "github.com/FelineStateMachine/puzzletea/resolve"913 "github.com/FelineStateMachine/puzzletea/stats"1014 "github.com/FelineStateMachine/puzzletea/store"15+ "github.com/FelineStateMachine/puzzletea/theme"1116 "github.com/FelineStateMachine/puzzletea/ui"1217 1318 "charm.land/bubbles/v2/key"19+ "charm.land/bubbles/v2/list"20+ "charm.land/bubbles/v2/textinput"1421 "charm.land/bubbles/v2/viewport"1522 tea "charm.land/bubbletea/v2"1623 "github.com/charmbracelet/glamour"@@ -28,6 +35,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
2835 m.height = msg.Height2936 menuW := min(m.width, 64)3037 m.gameSelectList.SetSize(menuW, min(m.height, ui.ListHeight(m.gameSelectList)))38+ if m.state == seedInputView {39+ m.seedInput.SetWidth(min(m.width, 48))40+ }3141 if m.state == modeSelectView {3242 m.modeSelectList.SetSize(menuW, min(m.height, ui.ListHeight(m.modeSelectList)))3343 }@@ -43,6 +53,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
4353 m.helpViewport.SetWidth(m.width)4454 m.helpViewport.SetHeight(m.height - 2)4555 }56+ if m.state == themeSelectView {57+ const maxVisibleItems = 858+ listW := min(menuW, theme.MaxNameLen+4)59+ m.themeList.SetSize(listW, min(m.height, maxVisibleItems*3))60+ }4661 if m.state == statsView {4762 cw := stats.ContentWidth(m.width)4863 m.statsViewport.SetWidth(cw)@@ -56,9 +71,10 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
5671 if m.state == generatingView {5772 switch {5873 case key.Matches(msg, rootKeys.Escape):59- if m.dailyPending {74+ if m.dailyPending || m.seedPending {6075 m.dailyPending = false61- m.state = mainMenuView76+ m.seedPending = false77+ m.state = playMenuView6278 } else {6379 m.state = modeSelectView6480 }@@ -106,6 +122,26 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
106122 m.mainMenu.CursorDown()107123 }108124 }125+ case playMenuView:126+ if msg, ok := msg.(tea.KeyPressMsg); ok {127+ switch msg.String() {128+ case "up", "k":129+ m.playMenu.CursorUp()130+ case "down", "j":131+ m.playMenu.CursorDown()132+ }133+ }134+ case optionsMenuView:135+ if msg, ok := msg.(tea.KeyPressMsg); ok {136+ switch msg.String() {137+ case "up", "k":138+ m.optionsMenu.CursorUp()139+ case "down", "j":140+ m.optionsMenu.CursorDown()141+ }142+ }143+ case seedInputView:144+ m.seedInput, cmd = m.seedInput.Update(msg)109145 case generatingView:110146 m.spinner, cmd = m.spinner.Update(msg)111147 case gameView:@@ -133,6 +169,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
133169 m.helpViewport, cmd = m.helpViewport.Update(msg)134170 case statsView:135171 m.statsViewport, cmd = m.statsViewport.Update(msg)172+ case themeSelectView:173+ prev := m.themeList.Index()174+ m.themeList, cmd = m.themeList.Update(msg)175+ // Live preview: apply theme when cursor moves.176+ if m.themeList.Index() != prev {177+ if item, ok := m.themeList.SelectedItem().(ui.MenuItem); ok {178+ _ = theme.Apply(item.ItemTitle)179+ ui.UpdateThemeListStyles(&m.themeList)180+ }181+ }136182 }137183 138184 return m, cmd@@ -142,6 +188,12 @@ func (m model) handleEnter() (tea.Model, tea.Cmd) {
142188 switch m.state {143189 case mainMenuView:144190 return m.handleMainMenuEnter()191+ case playMenuView:192+ return m.handlePlayMenuEnter()193+ case optionsMenuView:194+ return m.handleOptionsMenuEnter()195+ case seedInputView:196+ return m.handleSeedConfirm()145197 case gameSelectView:146198 return m.handleGameSelectEnter()147199 case modeSelectView:@@ -150,6 +202,8 @@ func (m model) handleEnter() (tea.Model, tea.Cmd) {
150202 return m.handleContinueEnter()151203 case helpSelectView:152204 return m.handleHelpSelectEnter()205+ case themeSelectView:206+ return m.handleThemeConfirm()153207 }154208 return m, nil155209 }@@ -157,6 +211,23 @@ func (m model) handleEnter() (tea.Model, tea.Cmd) {
157211 func (m model) handleMainMenuEnter() (tea.Model, tea.Cmd) {158212 item := m.mainMenu.Selected()159213 switch item.Title() {214+ case "Play":215+ m.playMenu = ui.NewMainMenu(playMenuItems)216+ m.state = playMenuView217+ case "Stats":218+ return m.handleStatsEnter()219+ case "Options":220+ m.optionsMenu = ui.NewMainMenu(optionsMenuItems)221+ m.state = optionsMenuView222+ case "Quit":223+ return m, tea.Quit224+ }225+ return m, nil226+}227+228+func (m model) handlePlayMenuEnter() (tea.Model, tea.Cmd) {229+ item := m.playMenu.Selected()230+ switch item.Title() {160231 case "Daily Puzzle":161232 return m.handleDailyPuzzle()162233 case "Generate":@@ -164,18 +235,99 @@ func (m model) handleMainMenuEnter() (tea.Model, tea.Cmd) {
164235 case "Continue":165236 m.continueTable, m.continueGames = ui.InitContinueTable(m.store, m.height)166237 m.state = continueView167- case "Stats":168- return m.handleStatsEnter()238+ case "Enter Seed":239+ ti := textinput.New()240+ ti.Placeholder = "any word or phrase"241+ ti.CharLimit = 64242+ ti.SetWidth(min(m.width, 48))243+ m.seedInput = ti244+ m.state = seedInputView245+ return m, m.seedInput.Focus()246+ }247+ return m, nil248+}249+250+func (m model) handleOptionsMenuEnter() (tea.Model, tea.Cmd) {251+ item := m.optionsMenu.Selected()252+ switch item.Title() {253+ case "Theme":254+ return m.handleThemeEnter()169255 case "Guides":170256 m.helpSelectList = ui.InitList(GameCategories, "How to Play")171257 m.helpSelectList.SetSize(min(m.width, 64), min(m.height, ui.ListHeight(m.helpSelectList)))172258 m.state = helpSelectView173- case "Quit":174- return m, tea.Quit175259 }176260 return m, nil177261 }178262 263+func (m model) handleSeedConfirm() (tea.Model, tea.Cmd) {264+ seed := strings.TrimSpace(m.seedInput.Value())265+ if seed == "" {266+ return m, nil267+ }268+269+ // Prevent seeded puzzles from mimicking daily puzzle names by270+ // silently lowercasing a "Daily" prefix so titles never start271+ // with the real daily prefix "Daily ".272+ if strings.HasPrefix(strings.ToLower(seed), "daily") {273+ seed = strings.ToLower(seed[:len("daily")]) + seed[len("daily"):]274+ }275+276+ // Deterministic name from seed, using an independent sub-RNG so277+ // namegen changes don't affect mode selection or puzzle content.278+ nameRNG := resolve.RNGFromString("name:" + seed)279+ name := seed + " - " + namegen.GenerateSeeded(nameRNG)280+281+ // Check if a game with this seed-derived name already exists.282+ rec, err := m.store.GetDailyGame(name)283+ if err != nil {284+ log.Printf("failed to check seeded game: %v", err)285+ return m, nil286+ }287+288+ if rec != nil {289+ // Seed game exists — resume it.290+ importFn, ok := game.Registry[rec.GameType]291+ if !ok {292+ log.Printf("unknown game type for seeded game: %s", rec.GameType)293+ return m, nil294+ }295+ g, err := importFn([]byte(rec.SaveState))296+ if err != nil {297+ log.Printf("failed to import seeded game: %v", err)298+ return m, nil299+ }300+ m.game = g.SetTitle(rec.Name)301+ m.game, _ = m.game.Update(game.HelpToggleMsg{Show: m.showFullHelp})302+ m.game, _ = m.game.Update(tea.WindowSizeMsg{Width: m.width, Height: m.height})303+ m.activeGameID = rec.ID304+ m.state = gameView305+ m.completionSaved = rec.Status == store.StatusCompleted306+307+ // Resume abandoned seeded games by resetting their status.308+ if rec.Status == store.StatusAbandoned {309+ _ = m.store.UpdateStatus(rec.ID, store.StatusInProgress)310+ }311+ return m, nil312+ }313+314+ // No existing game — generate a new seeded puzzle.315+ spawner, gameType, modeTitle, err := resolve.SeededMode(seed, GameCategories)316+ if err != nil {317+ log.Printf("failed to select seeded mode: %v", err)318+ return m, nil319+ }320+321+ rng := resolve.RNGFromString(seed)322+ m.seedPending = true323+ m.seedName = name324+ m.seedGameType = gameType325+ m.seedModeTitle = modeTitle326+ m.state = generatingView327+ m.generating = true328+ return m, tea.Batch(m.spinner.Tick, spawnSeededCmd(spawner, rng))329+}330+179331 func (m model) handleDailyPuzzle() (tea.Model, tea.Cmd) {180332 today := time.Now()181333 name := daily.Name(today)@@ -307,19 +459,92 @@ func (m model) handleHelpSelectEnter() (tea.Model, tea.Cmd) {
307459 308460 func (m model) handleEscape() (tea.Model, tea.Cmd) {309461 switch m.state {462+ case playMenuView:463+ m.state = mainMenuView464+ case optionsMenuView:465+ m.state = mainMenuView466+ case seedInputView:467+ m.state = playMenuView310468 case generatingView:311469 m.state = modeSelectView312470 case modeSelectView:313471 m.state = gameSelectView314472 case gameSelectView, continueView:315- m.state = mainMenuView473+ m.state = playMenuView316474 case helpDetailView:317475 m.state = helpSelectView318476 case helpSelectView:319- m.state = mainMenuView477+ m.state = optionsMenuView320478 case statsView:321479 m.state = mainMenuView480+ case themeSelectView:481+ // Revert to the previously saved theme.482+ _ = theme.Apply(m.previousTheme)483+ m.state = optionsMenuView484+ }485+ return m, nil486+}487+488+func (m model) handleThemeEnter() (tea.Model, tea.Cmd) {489+ m.previousTheme = m.cfg.Theme490+491+ names := theme.ThemeNames()492+ items := make([]list.Item, len(names))493+ for i, n := range names {494+ desc := "dark theme"495+ if n == theme.DefaultThemeName {496+ desc = "built-in earth-tone palette"497+ } else if t := theme.LookupTheme(n); t != nil && !t.Meta.IsDark {498+ desc = "light theme"499+ }500+ items[i] = ui.MenuItem{ItemTitle: n, Desc: desc}501+ }502+503+ // Cap list height to show ~8 items (like the continue table).504+ // Default delegate: height=2, spacing=1 → 3 lines per item.505+ const maxVisibleItems = 8506+ listH := min(m.height, maxVisibleItems*3)507+ listW := min(m.width, theme.MaxNameLen+4)508+509+ m.themeList = ui.InitThemeList(items, listW, listH)510+511+ // Position cursor on the currently active theme.512+ for i, item := range items {513+ if mi, ok := item.(ui.MenuItem); ok && mi.ItemTitle == m.previousTheme {514+ m.themeList.Select(i)515+ break516+ }517+ }518+ // If current theme is default (empty string), select index 0.519+ if m.previousTheme == "" {520+ m.themeList.Select(0)322521 }522+523+ m.state = themeSelectView524+ return m, nil525+}526+527+func (m model) handleThemeConfirm() (tea.Model, tea.Cmd) {528+ item, ok := m.themeList.SelectedItem().(ui.MenuItem)529+ if !ok {530+ return m, nil531+ }532+533+ themeName := item.ItemTitle534+ if themeName == theme.DefaultThemeName {535+ themeName = ""536+ }537+538+ // Apply the theme (already live-previewed, but ensure it's set).539+ _ = theme.Apply(item.ItemTitle)540+541+ // Persist the selection.542+ m.cfg.Theme = themeName543+ if err := m.cfg.Save(config.DefaultPath()); err != nil {544+ log.Printf("failed to save config: %v", err)545+ }546+547+ m.state = mainMenuView323548 return m, nil324549 }325550 @@ -4,6 +4,7 @@ import (
44 "fmt"55 66 "github.com/FelineStateMachine/puzzletea/stats"7+ "github.com/FelineStateMachine/puzzletea/theme"78 "github.com/FelineStateMachine/puzzletea/ui"89 910 tea "charm.land/bubbletea/v2"@@ -16,6 +17,17 @@ func (m model) View() tea.View {
1617 switch m.state {1718 case mainMenuView:1819 content = ui.CenterView(m.width, m.height, m.mainMenu.View())20+ case playMenuView:21+ content = ui.CenterView(m.width, m.height, m.playMenu.ViewAsPanel("Play"))22+ case optionsMenuView:23+ content = ui.CenterView(m.width, m.height, m.optionsMenu.ViewAsPanel("Options"))24+ case seedInputView:25+ panel := ui.Panel(26+ "Enter Seed",27+ m.seedInput.View(),28+ "enter confirm • esc back",29+ )30+ content = ui.CenterView(m.width, m.height, panel)1931 case gameSelectView:2032 panel := ui.Panel(2133 "Select Category",@@ -32,7 +44,7 @@ func (m model) View() tea.View {
3244 content = ui.CenterView(m.width, m.height, panel)3345 case generatingView:3446 s := m.spinner.View() + " Generating puzzle..."35- box := ui.GeneratingFrame.Render(s)47+ box := ui.GeneratingFrame().Render(s)3648 content = ui.CenterView(m.width, m.height, box)3749 case continueView:3850 var s string@@ -62,7 +74,7 @@ func (m model) View() tea.View {
6274 centered := gameView6375 if m.debug {6476 debugInfo := lipgloss.NewStyle().MaxWidth(m.width).Render(65- ui.DebugStyle.Render(m.debuginfo),77+ ui.DebugStyle().Render(m.debuginfo),6678 )6779 centered = lipgloss.JoinVertical(lipgloss.Center, gameView, debugInfo)6880 }@@ -82,6 +94,8 @@ func (m model) View() tea.View {
8294 "↑/↓ scroll • esc back",8395 )8496 content = ui.CenterView(m.width, m.height, panel)97+ case themeSelectView:98+ content = m.themeSelectViewContent()8599 case statsView:86100 var statsBody string87101 if len(m.statsCards) == 0 {@@ -116,3 +130,46 @@ func (m model) View() tea.View {
116130 }117131 return v118132 }133+134+// themeSelectViewContent renders the theme picker as a side-by-side layout:135+// theme list on the left, color preview panel on the right.136+func (m model) themeSelectViewContent() string {137+ p := theme.Current()138+139+ // Determine selected theme name for the preview.140+ themeName := theme.DefaultThemeName141+ if item, ok := m.themeList.SelectedItem().(ui.MenuItem); ok {142+ themeName = item.ItemTitle143+ }144+145+ // Compute available inner height for the panel content.146+ // Panel chrome: border (2) + padding (2) + title (1) + blank (1) + footer (1) + blank (1) = 8147+ const panelChrome = 8148+ innerH := m.height - panelChrome149+ if innerH < 10 {150+ innerH = 10151+ }152+153+ // Left side: theme list.154+ listView := m.themeList.View()155+156+ // Right side: color preview.157+ previewBorder := lipgloss.NewStyle().158+ Border(lipgloss.RoundedBorder()).159+ BorderForeground(p.Border).160+ Padding(1, 2)161+162+ preview := theme.PreviewPanel(themeName, innerH-4)163+ previewBox := previewBorder.Render(preview)164+165+ // Join side by side with a gap.166+ spacer := " "167+ body := lipgloss.JoinHorizontal(lipgloss.Top, listView, spacer, previewBox)168+169+ panel := ui.Panel(170+ "Select Theme",171+ body,172+ "↑/↓ navigate • / filter • enter select • esc back",173+ )174+ return ui.CenterView(m.width, m.height, panel)175+}@@ -4,6 +4,7 @@ import (
44 "fmt"55 66 "github.com/FelineStateMachine/puzzletea/app"7+ "github.com/FelineStateMachine/puzzletea/config"78 "github.com/FelineStateMachine/puzzletea/game"89 "github.com/FelineStateMachine/puzzletea/stats"910 "github.com/FelineStateMachine/puzzletea/store"@@ -18,12 +19,13 @@ var continueCmd = &cobra.Command{
1819 Long: "Resume a previously saved game using its unique name.\nUse 'puzzletea list' to see available saved games.",1920 Args: cobra.ExactArgs(1),2021 RunE: func(cmd *cobra.Command, args []string) error {21- return continueGame(args[0])22+ cfg := loadConfig()23+ return continueGame(args[0], cfg)2224 },2325 }2426 2527 // continueGame looks up a saved game by name and launches the TUI.26-func continueGame(name string) error {28+func continueGame(name string, cfg *config.Config) error {2729 s, err := store.Open(store.DefaultDBPath())2830 if err != nil {2931 return err@@ -52,7 +54,7 @@ func continueGame(name string) error {
5254 g = g.SetTitle(rec.Name)5355 5456 completed := rec.Status == store.StatusCompleted55- m := app.InitialModelWithGame(s, g, rec.ID, completed)57+ m := app.InitialModelWithGame(s, cfg, g, rec.ID, completed)5658 p := tea.NewProgram(m)5759 _, err = p.Run()5860 return err@@ -6,6 +6,7 @@ import (
66 "strings"77 88 "github.com/FelineStateMachine/puzzletea/app"9+ "github.com/FelineStateMachine/puzzletea/config"910 "github.com/FelineStateMachine/puzzletea/game"1011 "github.com/FelineStateMachine/puzzletea/namegen"1112 "github.com/FelineStateMachine/puzzletea/resolve"@@ -26,11 +27,13 @@ var newCmd = &cobra.Command{
2627 strings.Join(resolve.CategoryNames(app.GameCategories), "\n ")),2728 Args: cobra.RangeArgs(0, 2),2829 RunE: func(cmd *cobra.Command, args []string) error {30+ cfg := loadConfig()31+2932 if flagSetSeed != "" {3033 if len(args) > 0 {3134 return fmt.Errorf("cannot specify game/mode arguments with --set-seed; the seed determines the puzzle type")3235 }33- return launchSeededGame(flagSetSeed)36+ return launchSeededGame(flagSetSeed, cfg)3437 }3538 if len(args) == 0 {3639 return fmt.Errorf("requires at least 1 arg(s), only received 0")@@ -40,7 +43,7 @@ var newCmd = &cobra.Command{
4043 if len(args) > 1 {4144 modeArg = args[1]4245 }43- return launchNewGame(gameArg, modeArg)46+ return launchNewGame(gameArg, modeArg, cfg)4447 },4548 }4649 @@ -49,7 +52,7 @@ func init() {
4952 }5053 5154 // launchNewGame resolves the game/mode, spawns a new game, and launches the TUI.52-func launchNewGame(gameArg, modeArg string) error {55+func launchNewGame(gameArg, modeArg string, cfg *config.Config) error {5356 cat, err := resolve.Category(gameArg, app.GameCategories)5457 if err != nil {5558 return err@@ -93,7 +96,7 @@ func launchNewGame(gameArg, modeArg string) error {
9396 log.Printf("failed to create game record: %v", err)9497 }9598 96- m := app.InitialModelWithGame(s, g, rec.ID, false)99+ m := app.InitialModelWithGame(s, cfg, g, rec.ID, false)97100 p := tea.NewProgram(m)98101 _, err = p.Run()99102 return err@@ -106,7 +109,14 @@ func launchNewGame(gameArg, modeArg string) error {
106109 // Name generation and mode selection each use independent hashing so that107110 // changes to namegen word lists or mode lists don't cascade. The shared108111 // RNG is reserved purely for puzzle content generation.109-func launchSeededGame(seed string) error {112+func launchSeededGame(seed string, cfg *config.Config) error {113+ // Prevent seeded puzzles from mimicking daily puzzle names by114+ // silently lowercasing a "Daily" prefix so titles never start115+ // with the real daily prefix "Daily ".116+ if strings.HasPrefix(strings.ToLower(seed), "daily") {117+ seed = strings.ToLower(seed[:len("daily")]) + seed[len("daily"):]118+ }119+110120 // Name uses its own sub-RNG so namegen changes can't affect mode111121 // selection or puzzle generation.112122 nameRNG := resolve.RNGFromString("name:" + seed)@@ -140,7 +150,7 @@ func launchSeededGame(seed string) error {
140150 _ = s.UpdateStatus(rec.ID, store.StatusInProgress)141151 }142152 143- m := app.InitialModelWithGame(s, g, rec.ID, completed)153+ m := app.InitialModelWithGame(s, cfg, g, rec.ID, completed)144154 p := tea.NewProgram(m)145155 _, err = p.Run()146156 return err@@ -177,7 +187,7 @@ func launchSeededGame(seed string) error {
177187 log.Printf("failed to create game record: %v", err)178188 }179189 180- m := app.InitialModelWithGame(s, g, rec.ID, false)190+ m := app.InitialModelWithGame(s, cfg, g, rec.ID, false)181191 p := tea.NewProgram(m)182192 _, err = p.Run()183193 return err@@ -3,11 +3,14 @@ package cmd
33 44 import (55 "fmt"6+ "log"67 "strings"78 89 "github.com/FelineStateMachine/puzzletea/app"10+ "github.com/FelineStateMachine/puzzletea/config"911 "github.com/FelineStateMachine/puzzletea/stats"1012 "github.com/FelineStateMachine/puzzletea/store"13+ "github.com/FelineStateMachine/puzzletea/theme"1114 1215 tea "charm.land/bubbletea/v2"1316 "github.com/spf13/cobra"@@ -21,6 +24,7 @@ var Version = "dev"
2124 var (2225 flagNew string2326 flagContinue string27+ flagTheme string2428 // flagSetSeed is declared in new.go and shared across root and new commands.2529 )2630 @@ -31,11 +35,13 @@ var RootCmd = &cobra.Command{
3135 Short: "A terminal-based puzzle game framework",3236 Long: "PuzzleTea is a terminal-based puzzle game framework featuring Nonogram, Sudoku, Word Search, Hashiwokakero, and Lights Out.",3337 RunE: func(cmd *cobra.Command, args []string) error {38+ cfg := loadConfig()39+3440 if flagSetSeed != "" {3541 if flagNew != "" || flagContinue != "" {3642 return fmt.Errorf("--set-seed cannot be combined with --new or --continue")3743 }38- return launchSeededGame(flagSetSeed)44+ return launchSeededGame(flagSetSeed, cfg)3945 }4046 if flagNew != "" {4147 parts := strings.SplitN(flagNew, ":", 2)@@ -44,10 +50,10 @@ var RootCmd = &cobra.Command{
4450 if len(parts) > 1 {4551 modeArg = parts[1]4652 }47- return launchNewGame(gameArg, modeArg)53+ return launchNewGame(gameArg, modeArg, cfg)4854 }4955 if flagContinue != "" {50- return continueGame(flagContinue)56+ return continueGame(flagContinue, cfg)5157 }5258 // Default: launch TUI menu.5359 s, err := store.Open(store.DefaultDBPath())@@ -56,7 +62,7 @@ var RootCmd = &cobra.Command{
5662 }5763 defer s.Close()5864 stats.InitModeXP(app.GameCategories)59- p := tea.NewProgram(app.InitialModel(s))65+ p := tea.NewProgram(app.InitialModel(s, cfg))6066 _, err = p.Run()6167 return err6268 },@@ -66,6 +72,26 @@ func init() {
6672 RootCmd.Flags().StringVar(&flagNew, "new", "", "start a new game (game:mode)")6773 RootCmd.Flags().StringVar(&flagContinue, "continue", "", "resume a saved game by name")6874 RootCmd.Flags().StringVar(&flagSetSeed, "set-seed", "", "seed string for deterministic puzzle selection and generation")75+ RootCmd.PersistentFlags().StringVar(&flagTheme, "theme", "", "color theme name (overrides config)")6976 7077 RootCmd.AddCommand(newCmd, continueCmd, listCmd)7178 }79+80+// loadConfig reads the config file and applies the active theme. The --theme81+// flag takes precedence over the persisted setting.82+func loadConfig() *config.Config {83+ cfg, err := config.Load(config.DefaultPath())84+ if err != nil {85+ log.Printf("warning: %v (using defaults)", err)86+ cfg = config.Default()87+ }88+89+ themeName := cfg.Theme90+ if flagTheme != "" {91+ themeName = flagTheme92+ }93+ if err := theme.Apply(themeName); err != nil {94+ log.Printf("warning: %v (using default theme)", err)95+ }96+ return cfg97+}@@ -0,0 +1,67 @@
1+// Package config provides persistent application configuration for PuzzleTea.2+// Settings are stored as JSON in ~/.puzzletea/config.json alongside the game3+// history database.4+package config5+6+import (7+ "encoding/json"8+ "errors"9+ "fmt"10+ "os"11+ "path/filepath"12+)13+14+// Config holds all user-configurable settings.15+type Config struct {16+ Theme string `json:"theme,omitempty"` // theme name; empty = default17+}18+19+// Default returns a Config with all settings at their zero values (the20+// built-in defaults).21+func Default() *Config {22+ return &Config{}23+}24+25+// DefaultPath returns ~/.puzzletea/config.json.26+func DefaultPath() string {27+ home, _ := os.UserHomeDir()28+ return filepath.Join(home, ".puzzletea", "config.json")29+}30+31+// Load reads and parses a config file. If the file does not exist, a default32+// Config is returned with no error. Parse errors are returned so callers can33+// log a warning, but the application should still start with defaults.34+func Load(path string) (*Config, error) {35+ data, err := os.ReadFile(path)36+ if err != nil {37+ if errors.Is(err, os.ErrNotExist) {38+ return Default(), nil39+ }40+ return Default(), fmt.Errorf("reading config: %w", err)41+ }42+43+ cfg := Default()44+ if err := json.Unmarshal(data, cfg); err != nil {45+ return Default(), fmt.Errorf("parsing config: %w", err)46+ }47+ return cfg, nil48+}49+50+// Save writes the config to disk, creating the parent directory if needed.51+func (c *Config) Save(path string) error {52+ dir := filepath.Dir(path)53+ if err := os.MkdirAll(dir, 0o755); err != nil {54+ return fmt.Errorf("creating config directory: %w", err)55+ }56+57+ data, err := json.MarshalIndent(c, "", " ")58+ if err != nil {59+ return fmt.Errorf("marshaling config: %w", err)60+ }61+ data = append(data, '\n')62+63+ if err := os.WriteFile(path, data, 0o644); err != nil {64+ return fmt.Errorf("writing config: %w", err)65+ }66+ return nil67+}@@ -0,0 +1,75 @@
1+package config2+3+import (4+ "os"5+ "path/filepath"6+ "testing"7+)8+9+// --- Load / Save round-trip (P0) ---10+11+func TestLoadMissingFile(t *testing.T) {12+ cfg, err := Load("/tmp/puzzletea-test-nonexistent/config.json")13+ if err != nil {14+ t.Fatalf("expected no error for missing file, got: %v", err)15+ }16+ if cfg.Theme != "" {17+ t.Errorf("expected empty theme for default config, got %q", cfg.Theme)18+ }19+}20+21+func TestSaveAndLoad(t *testing.T) {22+ dir := t.TempDir()23+ path := filepath.Join(dir, "config.json")24+25+ cfg := &Config{Theme: "Dracula"}26+ if err := cfg.Save(path); err != nil {27+ t.Fatalf("Save failed: %v", err)28+ }29+30+ loaded, err := Load(path)31+ if err != nil {32+ t.Fatalf("Load failed: %v", err)33+ }34+ if loaded.Theme != "Dracula" {35+ t.Errorf("expected theme Dracula, got %q", loaded.Theme)36+ }37+}38+39+func TestSaveCreatesDirectory(t *testing.T) {40+ dir := t.TempDir()41+ path := filepath.Join(dir, "nested", "deep", "config.json")42+43+ cfg := &Config{Theme: "Monokai Pro"}44+ if err := cfg.Save(path); err != nil {45+ t.Fatalf("Save failed: %v", err)46+ }47+48+ if _, err := os.Stat(path); err != nil {49+ t.Fatalf("expected config file to exist: %v", err)50+ }51+}52+53+func TestLoadInvalidJSON(t *testing.T) {54+ dir := t.TempDir()55+ path := filepath.Join(dir, "config.json")56+ if err := os.WriteFile(path, []byte("{invalid"), 0o644); err != nil {57+ t.Fatal(err)58+ }59+60+ cfg, err := Load(path)61+ if err == nil {62+ t.Fatal("expected error for invalid JSON")63+ }64+ // Should still return a usable default.65+ if cfg.Theme != "" {66+ t.Errorf("expected default theme on error, got %q", cfg.Theme)67+ }68+}69+70+func TestDefaultConfig(t *testing.T) {71+ cfg := Default()72+ if cfg.Theme != "" {73+ t.Errorf("expected empty theme, got %q", cfg.Theme)74+ }75+}@@ -1,18 +1,32 @@
11 package game22 33 import (4+ "image/color"5+46 "charm.land/lipgloss/v2"5- "charm.land/lipgloss/v2/compat"7+ "github.com/FelineStateMachine/puzzletea/theme"68 )79 810 // GridBorderColors holds the color configuration for a grid border with911 // crosshair and solved-state highlighting.1012 type GridBorderColors struct {11- BorderFG compat.AdaptiveColor12- BackgroundBG compat.AdaptiveColor13- CrosshairBG compat.AdaptiveColor14- SolvedBorderFG compat.AdaptiveColor15- SolvedBG compat.AdaptiveColor13+ BorderFG color.Color14+ BackgroundBG color.Color15+ CrosshairBG color.Color16+ SolvedBorderFG color.Color17+ SolvedBG color.Color18+}19+20+// DefaultBorderColors returns border colors from the active theme.21+func DefaultBorderColors() GridBorderColors {22+ p := theme.Current()23+ return GridBorderColors{24+ BorderFG: p.Border,25+ BackgroundBG: p.BG,26+ CrosshairBG: p.Surface,27+ SolvedBorderFG: p.SuccessBorder,28+ SolvedBG: p.Success,29+ }1630 }1731 1832 // BorderChar renders a single border character with optional crosshair highlighting.@@ -2,68 +2,79 @@ package game
22 33 import (44 "fmt"5+ "image/color"56 "strings"67 78 "charm.land/lipgloss/v2"8- "charm.land/lipgloss/v2/compat"9+ "github.com/FelineStateMachine/puzzletea/theme"910 )1011 11-// Shared cursor color tokens, used both in style construction and for12-// composite styling where a cursor color is applied on top of another style.13-var (14- CursorFG = compat.AdaptiveColor{Light: lipgloss.Color("255"), Dark: lipgloss.Color("235")}15- CursorBG = compat.AdaptiveColor{Light: lipgloss.Color("130"), Dark: lipgloss.Color("173")}16- CursorWarmBG = compat.AdaptiveColor{Light: lipgloss.Color("130"), Dark: lipgloss.Color("214")}17- ConflictFG = compat.AdaptiveColor{Light: lipgloss.Color("160"), Dark: lipgloss.Color("167")}18- ConflictBG = compat.AdaptiveColor{Light: lipgloss.Color("224"), Dark: lipgloss.Color("52")}19-)12+// Shared cursor / conflict color accessors. Puzzle packages that compose13+// styles on top of the cursor colors read these at render time.2014 21-var (22- titleStyle = lipgloss.NewStyle().23- Bold(true).24- Foreground(compat.AdaptiveColor{Light: lipgloss.Color("255"), Dark: lipgloss.Color("255")}).25- Background(CursorBG).26- Padding(0, 1)15+func CursorFG() color.Color { return theme.Current().AccentText }16+func CursorBG() color.Color { return theme.Current().Accent }17+func CursorWarmFG() color.Color { return theme.Current().WarmText }18+func CursorWarmBG() color.Color { return theme.Current().Warm }19+func ConflictFG() color.Color { return theme.Current().Error }20+func ConflictBG() color.Color { return theme.Current().ErrorBG }2721 28- solvedBadgeStyle = lipgloss.NewStyle().29- Bold(true).30- Foreground(compat.AdaptiveColor{Light: lipgloss.Color("28"), Dark: lipgloss.Color("78")})22+// CursorStyle highlights the cursor position with an accent background.23+// Used by lightsout, sudoku, wordsearch.24+func CursorStyle() lipgloss.Style {25+ return lipgloss.NewStyle().26+ Bold(true).27+ Foreground(CursorFG()).28+ Background(CursorBG())29+}3130 32- // CursorStyle highlights the cursor position with an accent background.33- // Used by lightsout, sudoku, wordsearch.34- CursorStyle = lipgloss.NewStyle().35- Bold(true).36- Foreground(CursorFG).37- Background(CursorBG)31+// CursorWarmStyle highlights the cursor with a warmer background.32+// Used by hitori, takuzu, nonogram.33+func CursorWarmStyle() lipgloss.Style {34+ return lipgloss.NewStyle().35+ Bold(true).36+ Foreground(CursorWarmFG()).37+ Background(CursorWarmBG())38+}3839 39- // CursorWarmStyle highlights the cursor with a warmer background.40- // Used by hitori, takuzu, nonogram.41- CursorWarmStyle = lipgloss.NewStyle().42- Bold(true).43- Foreground(CursorFG).44- Background(CursorWarmBG)40+// CursorSolvedStyle highlights the cursor position on a solved grid.41+// Shared across all puzzle types.42+func CursorSolvedStyle() lipgloss.Style {43+ return lipgloss.NewStyle().44+ Bold(true).45+ Foreground(CursorFG()).46+ Background(theme.Current().Success)47+}4548 46- // CursorSolvedStyle highlights the cursor position on a solved grid.47- // Shared across all puzzle types.48- CursorSolvedStyle = lipgloss.NewStyle().49- Bold(true).50- Foreground(CursorFG).51- Background(compat.AdaptiveColor{Light: lipgloss.Color("28"), Dark: lipgloss.Color("28")})49+// StatusBarStyle returns the shared style for the status/help bar below each puzzle grid.50+func StatusBarStyle() lipgloss.Style {51+ return lipgloss.NewStyle().52+ Foreground(theme.Current().TextDim).53+ MarginTop(1)54+}5255 53- // StatusBarStyle is the shared style for the status/help bar below each puzzle grid.54- StatusBarStyle = lipgloss.NewStyle().55- Foreground(compat.AdaptiveColor{Light: lipgloss.Color("244"), Dark: lipgloss.Color("244")}).56- MarginTop(1)57-)56+func titleStyle() lipgloss.Style {57+ return lipgloss.NewStyle().58+ Bold(true).59+ Foreground(theme.Current().AccentText).60+ Background(CursorBG()).61+ Padding(0, 1)62+}63+64+func solvedBadgeStyle() lipgloss.Style {65+ return lipgloss.NewStyle().66+ Bold(true).67+ Foreground(theme.Current().SuccessBorder)68+}5869 5970 // TitleBarView renders a title bar with the game name, mode name, and optional solved badge.6071 func TitleBarView(gameName, modeName string, solved bool) string {61- title := titleStyle.Render(gameName + " - " + modeName)72+ title := titleStyle().Render(gameName + " - " + modeName)6273 if solved {63- badge := solvedBadgeStyle.Render(" SOLVED")74+ badge := solvedBadgeStyle().Render(" SOLVED")6475 return title + badge + "\nctrl+n to play again"6576 }66- return title + "\n"77+ return lipgloss.NewStyle().PaddingBottom(1).Render(title)6778 }6879 6980 // DebugHeader returns the markdown heading and property table header for debug info.@@ -7,6 +7,7 @@ import (
77 "charm.land/lipgloss/v2"88 "charm.land/lipgloss/v2/compat"99 "github.com/FelineStateMachine/puzzletea/game"10+ "github.com/FelineStateMachine/puzzletea/theme"1011 )1112 1213 const cellWidth = 3@@ -19,15 +20,13 @@ var (
1920 colorSatisfiedBg = compat.AdaptiveColor{Dark: lipgloss.Color("194"), Light: lipgloss.Color("236")}2021 colorOverFg = compat.AdaptiveColor{Dark: lipgloss.Color("160"), Light: lipgloss.Color("167")}2122 colorOverBg = compat.AdaptiveColor{Dark: lipgloss.Color("224"), Light: lipgloss.Color("52")}22- colorSelectedFg = compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("235")}23- colorSelectedBg = compat.AdaptiveColor{Dark: lipgloss.Color("172"), Light: lipgloss.Color("179")}2423 colorAdjacentBg = compat.AdaptiveColor{Dark: lipgloss.Color("223"), Light: lipgloss.Color("58")}25- colorBridge = compat.AdaptiveColor{Dark: lipgloss.Color("137"), Light: lipgloss.Color("137")}24+ colorBridge = compat.AdaptiveColor{Dark: lipgloss.Color("180"), Light: lipgloss.Color("95")}2625 colorBridgeSolved = compat.AdaptiveColor{Dark: lipgloss.Color("22"), Light: lipgloss.Color("149")}2726 colorEmptyDot = compat.AdaptiveColor{Dark: lipgloss.Color("252"), Light: lipgloss.Color("239")}2827 colorEmptySolved = compat.AdaptiveColor{Dark: lipgloss.Color("151"), Light: lipgloss.Color("107")}2928 colorInfoSatisfied = compat.AdaptiveColor{Dark: lipgloss.Color("22"), Light: lipgloss.Color("149")}30- colorInfoText = compat.AdaptiveColor{Dark: lipgloss.Color("137"), Light: lipgloss.Color("137")}29+ colorInfoText = compat.AdaptiveColor{Dark: lipgloss.Color("180"), Light: lipgloss.Color("95")}3130 )3231 3332 var (@@ -48,13 +47,10 @@ var (
4847 Background(colorOverBg).4948 Bold(true)5049 51- islandCursorStyle = game.CursorStyle52- islandCursorSolvedStyle = game.CursorSolvedStyle50+ // islandCursorStyle and islandCursorSolvedStyle resolved at render51+ // time via game.CursorStyle() and game.CursorSolvedStyle().5352 54- islandSelectedStyle = baseStyle.55- Foreground(colorSelectedFg).56- Background(colorSelectedBg).57- Bold(true)53+ // islandSelectedStyle resolved at render time via islandSelectedStyle().5854 5955 islandAdjacentStyle = baseStyle.6056 Foreground(colorIslandFg).@@ -87,6 +83,16 @@ var (
8783 BorderForeground(colorBridgeSolved)8884 )8985 86+// islandSelectedStyle returns the style for a selected island, using the87+// current theme's Highlight color for the background.88+func islandSelectedStyle() lipgloss.Style {89+ bg := theme.Current().Highlight90+ return baseStyle.91+ Foreground(theme.TextOnBG(bg)).92+ Background(bg).93+ Bold(true)94+}95+9096 // isHighlightedNeighbor returns true if islandID is directly connectable9197 // to the cursor (or selected) island in any cardinal direction.9298 func isHighlightedNeighbor(m Model, islandID int) bool {@@ -230,13 +236,13 @@ func islandView(m Model, islandID int, solved bool) string {
230236 current := m.puzzle.BridgeCount(islandID)231237 232238 if solved && m.cursorIsland == islandID {233- style = islandCursorSolvedStyle239+ style = game.CursorSolvedStyle()234240 } else if solved {235241 style = islandSatisfiedStyle236242 } else if m.selectedIsland != nil && *m.selectedIsland == islandID {237- style = islandSelectedStyle243+ style = islandSelectedStyle()238244 } else if m.cursorIsland == islandID {239- style = islandCursorStyle245+ style = game.CursorStyle()240246 } else if current == isl.Required {241247 style = islandSatisfiedStyle242248 } else if current > isl.Required {@@ -276,14 +282,14 @@ func bridgeVView(count int, solved bool) string {
276282 func statusBarView(selected, showFullHelp bool) string {277283 if selected {278284 if showFullHelp {279- return game.StatusBarStyle.Render("arrows/wasd: build bridge enter/space/esc: cancel ctrl+n: menu ctrl+r: reset ctrl+h: help")285+ return game.StatusBarStyle().Render("arrows/wasd: build bridge enter/space/esc: cancel ctrl+n: menu ctrl+r: reset ctrl+h: help")280286 }281- return game.StatusBarStyle.Render("arrows/wasd: build bridge enter/space/esc: cancel")287+ return game.StatusBarStyle().Render("arrows/wasd: build bridge enter/space/esc: cancel")282288 }283289 if showFullHelp {284- return game.StatusBarStyle.Render("arrows/wasd: move enter/space: select island ctrl+n: menu ctrl+r: reset ctrl+h: help")290+ return game.StatusBarStyle().Render("arrows/wasd: move enter/space: select island ctrl+n: menu ctrl+r: reset ctrl+h: help")285291 }286- return game.StatusBarStyle.Render("arrows/wasd: move enter/space: select island")292+ return game.StatusBarStyle().Render("arrows/wasd: move enter/space: select island")287293 }288294 289295 func infoView(p *Puzzle) string {@@ -25,7 +25,7 @@ var (
2525 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("25"), Dark: lipgloss.Color("75")}).2626 Background(backgroundColor)2727 28- cursorSolvedStyle = game.CursorSolvedStyle28+ // cursorSolvedStyle resolved at render time via game.CursorSolvedStyle().2929 3030 crosshairBG = compat.AdaptiveColor{Light: lipgloss.Color("254"), Dark: lipgloss.Color("237")}3131 solvedBG = compat.AdaptiveColor{Light: lipgloss.Color("151"), Dark: lipgloss.Color("22")}@@ -53,18 +53,18 @@ func cellView(num rune, mark cellMark, isCursor, inCursorRow, inCursorCol, solve
5353 5454 // Priority: cursor+solved > cursor > conflict > crosshair > solved > base.5555 if isCursor && solved {56- s = cursorSolvedStyle56+ s = game.CursorSolvedStyle()5757 } else if isCursor {58- s = s.Background(game.CursorWarmBG).Bold(true)58+ s = s.Background(game.CursorWarmBG()).Bold(true)5959 if mark != circled {60- s = s.Foreground(game.CursorFG)60+ s = s.Foreground(game.CursorWarmFG())6161 }6262 } else if solved {6363 s = s.Background(solvedBG)6464 } else if conflict {65- s = s.Background(game.ConflictBG)65+ s = s.Background(game.ConflictBG())6666 if mark != circled {67- s = s.Foreground(game.ConflictFG)67+ s = s.Foreground(game.ConflictFG())6868 }6969 } else if inCursorRow || inCursorCol {7070 s = s.Background(crosshairBG)@@ -113,7 +113,7 @@ func gridView(numbers grid, marks [][]cellMark, c game.Cursor, solved bool, conf
113113 114114 func statusBarView(showFullHelp bool) string {115115 if showFullHelp {116- return game.StatusBarStyle.Render("arrows/wasd: move x: shade z: circle bkspc: clear ctrl+n: menu ctrl+r: reset ctrl+h: help")116+ return game.StatusBarStyle().Render("arrows/wasd: move x: shade z: circle bkspc: clear ctrl+n: menu ctrl+r: reset ctrl+h: help")117117 }118- return game.StatusBarStyle.Render("x: shade z: circle bkspc: clear")118+ return game.StatusBarStyle().Render("x: shade z: circle bkspc: clear")119119 }@@ -63,8 +63,8 @@ var (
6363 styleOff = baseStyle.6464 Background(colorOff)6565 66- cursorStyle = game.CursorStyle67- cursorSolvedStyle = game.CursorSolvedStyle66+ // cursorStyle and cursorSolvedStyle resolved at render time67+ // via game.CursorStyle() and game.CursorSolvedStyle().6868 6969 solvedStyle = baseStyle.7070 Background(compat.AdaptiveColor{Light: lipgloss.Color("151"), Dark: lipgloss.Color("22")})@@ -92,11 +92,11 @@ func cellView(isOn, isCursor, solved bool) string {
9292 }9393 9494 if isCursor && solved {95- s = cursorSolvedStyle95+ s = game.CursorSolvedStyle()9696 } else if solved {9797 s = solvedStyle9898 } else if isCursor {99- s = cursorStyle99+ s = game.CursorStyle()100100 }101101 102102 content := strings.Repeat(" ", cellWidth)@@ -123,7 +123,7 @@ func gridView(g [][]bool, c game.Cursor, solved bool) string {
123123 124124 func statusBarView(showFullHelp bool) string {125125 if showFullHelp {126- return game.StatusBarStyle.Render("arrows/wasd: move enter/space/click: toggle ctrl+n: menu ctrl+r: reset ctrl+h: help")126+ return game.StatusBarStyle().Render("arrows/wasd: move enter/space/click: toggle ctrl+n: menu ctrl+r: reset ctrl+h: help")127127 }128- return game.StatusBarStyle.Render("enter/space/click: toggle")128+ return game.StatusBarStyle().Render("enter/space/click: toggle")129129 }@@ -25,8 +25,8 @@ var (
2525 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("250"), Dark: lipgloss.Color("240")}).2626 Background(backgroundColor)2727 28- cursorStyle = game.CursorWarmStyle29- cursorSolvedStyle = game.CursorSolvedStyle28+ // cursorStyle and cursorSolvedStyle are resolved at render time29+ // via game.CursorWarmStyle() and game.CursorSolvedStyle().3030 3131 crosshairBG = compat.AdaptiveColor{Light: lipgloss.Color("254"), Dark: lipgloss.Color("237")}3232 crosshairFilledBG = compat.AdaptiveColor{Light: lipgloss.Color("223"), Dark: lipgloss.Color("100")}@@ -231,9 +231,9 @@ func tileView(val rune, isCursor, inCursorRow, inCursorCol, solved bool) string
231231 }232232 233233 if isCursor && solved {234- s = cursorSolvedStyle234+ s = game.CursorSolvedStyle()235235 } else if isCursor {236- s = cursorStyle236+ s = game.CursorWarmStyle()237237 } else if solved {238238 s = s.Background(solvedBG)239239 } else if inCursorRow || inCursorCol {@@ -254,9 +254,9 @@ func tileView(val rune, isCursor, inCursorRow, inCursorCol, solved bool) string
254254 255255 func statusBarView(showFullHelp bool) string {256256 if showFullHelp {257- return game.StatusBarStyle.Render("arrows/wasd: move z: fill (hold+move) x: mark (hold+move) bkspc: clear LMB: fill RMB: mark ctrl+n: menu ctrl+r: reset ctrl+h: help")257+ return game.StatusBarStyle().Render("arrows/wasd: move z: fill (hold+move) x: mark (hold+move) bkspc: clear LMB: fill RMB: mark ctrl+n: menu ctrl+r: reset ctrl+h: help")258258 }259- return game.StatusBarStyle.Render("z: fill x: mark bkspc: clear mouse: click/drag")259+ return game.StatusBarStyle().Render("z: fill x: mark bkspc: clear mouse: click/drag")260260 }261261 262262 func intSliceEqual(a, b []int) bool {@@ -38,13 +38,16 @@ func ImportModel(data []byte) (*Model, error) {
3838 return nil, fmt.Errorf("failed to unmarshal shikaku save: %w", err)3939 }4040 41+ p := Puzzle{42+ Width: s.Width,43+ Height: s.Height,44+ Clues: s.Clues,45+ Rectangles: s.Rectangles,46+ }47+ p.autoPlaceSingles()48+4149 return &Model{42- puzzle: Puzzle{43- Width: s.Width,44- Height: s.Height,45- Clues: s.Clues,46- Rectangles: s.Rectangles,47- },50+ puzzle: p,4851 cursor: game.Cursor{X: 0, Y: 0},4952 keys: DefaultKeyMap,5053 modeTitle: s.ModeTitle,@@ -60,6 +60,7 @@ type Model struct {
6060 6161 // New creates a new Shikaku game model.6262 func New(mode ShikakuMode, puzzle Puzzle) game.Gamer {63+ puzzle.autoPlaceSingles()6364 return Model{6465 puzzle: puzzle,6566 cursor: game.Cursor{X: 0, Y: 0},@@ -336,6 +337,9 @@ func (m Model) View() string {
336337 solved := m.puzzle.IsSolved()337338 title := game.TitleBarView("Shikaku", m.modeTitle, solved)338339 grid := gridView(m, solved)340+ if solved {341+ return lipgloss.JoinVertical(lipgloss.Center, title, grid)342+ }339343 info := infoView(&m.puzzle)340344 status := statusBarView(m.selectedClue != nil, m.showFullHelp)341345 return lipgloss.JoinVertical(lipgloss.Center, title, grid, info, status)@@ -352,6 +356,7 @@ func (m Model) IsSolved() bool {
352356 353357 func (m Model) Reset() game.Gamer {354358 m.puzzle.Rectangles = nil359+ m.puzzle.autoPlaceSingles()355360 m.cursor = game.Cursor{}356361 m.selectedClue = nil357362 m.mouseDragAnchor = nil@@ -131,6 +131,23 @@ func (p *Puzzle) CluesInRect(r Rectangle) []*Clue {
131131 return result132132 }133133 134+// autoPlaceSingles places 1x1 rectangles for all clues with Value == 1135+// that don't already have a rectangle. These clues have only one possible136+// placement, so requiring manual input is unnecessary busywork.137+func (p *Puzzle) autoPlaceSingles() {138+ for _, c := range p.Clues {139+ if c.Value == 1 && p.FindRectangleForClue(c.ID) == nil {140+ p.SetRectangle(Rectangle{141+ ClueID: c.ID,142+ X: c.X,143+ Y: c.Y,144+ W: 1,145+ H: 1,146+ })147+ }148+ }149+}150+134151 // IsSolved reports whether the puzzle is complete:135152 // every cell is covered exactly once and each rectangle contains136153 // exactly one clue whose value equals the rectangle's area.@@ -2,34 +2,21 @@ package shikaku
22 33 import (44 "fmt"5+ "image/color"56 "strings"67 78 "charm.land/lipgloss/v2"89 "charm.land/lipgloss/v2/compat"910 "github.com/FelineStateMachine/puzzletea/game"11+ "github.com/FelineStateMachine/puzzletea/theme"1012 )1113 1214 const cellWidth = 31315 14-// 16-color palette for placed rectangles (ANSI 256).15-var rectColors = []compat.AdaptiveColor{16- {Dark: lipgloss.Color("60"), Light: lipgloss.Color("60")}, // muted purple17- {Dark: lipgloss.Color("66"), Light: lipgloss.Color("66")}, // teal18- {Dark: lipgloss.Color("95"), Light: lipgloss.Color("95")}, // mauve19- {Dark: lipgloss.Color("130"), Light: lipgloss.Color("130")}, // brown/amber20- {Dark: lipgloss.Color("71"), Light: lipgloss.Color("71")}, // olive green21- {Dark: lipgloss.Color("132"), Light: lipgloss.Color("132")}, // dusty rose22- {Dark: lipgloss.Color("37"), Light: lipgloss.Color("37")}, // cyan23- {Dark: lipgloss.Color("136"), Light: lipgloss.Color("136")}, // dark gold24- {Dark: lipgloss.Color("97"), Light: lipgloss.Color("97")}, // plum25- {Dark: lipgloss.Color("29"), Light: lipgloss.Color("29")}, // forest green26- {Dark: lipgloss.Color("167"), Light: lipgloss.Color("167")}, // salmon27- {Dark: lipgloss.Color("68"), Light: lipgloss.Color("68")}, // steel blue28- {Dark: lipgloss.Color("94"), Light: lipgloss.Color("94")}, // rust29- {Dark: lipgloss.Color("139"), Light: lipgloss.Color("139")}, // lavender30- {Dark: lipgloss.Color("28"), Light: lipgloss.Color("28")}, // deep green31- {Dark: lipgloss.Color("133"), Light: lipgloss.Color("133")}, // orchid32-}16+// rectColors returns the current theme's chromatic ANSI colors for17+// rectangle backgrounds. Colors follow the active palette, so they18+// adapt automatically when the user switches themes.19+func rectColors() []color.Color { return theme.Current().CardColors() }3320 3421 var (3522 baseStyle = lipgloss.NewStyle()@@ -38,8 +25,7 @@ var (
3825 clueColor = compat.AdaptiveColor{Dark: lipgloss.Color("230"), Light: lipgloss.Color("236")}3926 clueBgColor = compat.AdaptiveColor{Dark: lipgloss.Color("238"), Light: lipgloss.Color("254")}4027 41- cursorBgColor = compat.AdaptiveColor{Dark: lipgloss.Color("214"), Light: lipgloss.Color("173")}42- cursorFgColor = compat.AdaptiveColor{Dark: lipgloss.Color("235"), Light: lipgloss.Color("255")}28+ // Cursor colors resolved at render time via game.CursorStyle().4329 4430 previewGoodBg = compat.AdaptiveColor{Dark: lipgloss.Color("28"), Light: lipgloss.Color("157")}4531 previewBadBg = compat.AdaptiveColor{Dark: lipgloss.Color("124"), Light: lipgloss.Color("217")}@@ -48,10 +34,8 @@ var (
4834 solvedBorder = compat.AdaptiveColor{Dark: lipgloss.Color("149"), Light: lipgloss.Color("22")}4935 borderColor = compat.AdaptiveColor{Dark: lipgloss.Color("240"), Light: lipgloss.Color("250")}5036 51- selectedClueBg = compat.AdaptiveColor{Dark: lipgloss.Color("172"), Light: lipgloss.Color("179")}52-5337 infoSatisfied = compat.AdaptiveColor{Dark: lipgloss.Color("22"), Light: lipgloss.Color("149")}54- infoText = compat.AdaptiveColor{Dark: lipgloss.Color("137"), Light: lipgloss.Color("137")}38+ infoText = compat.AdaptiveColor{Dark: lipgloss.Color("180"), Light: lipgloss.Color("95")}5539 5640 gridBorderStyle = lipgloss.NewStyle().5741 Border(lipgloss.RoundedBorder()).@@ -120,12 +104,13 @@ func cellView(m Model, x, y int, solved bool, preview *Rectangle, previewClue *C
120104 s = baseStyle.Foreground(clueColor).Background(clueBgColor).Bold(true)121105 }122106 123- // Rectangle background color.107+ // Rectangle background color (from current theme palette).108+ colors := rectColors()124109 if owner >= 0 {125- colorIdx := owner % len(rectColors)126- s = s.Background(rectColors[colorIdx]).Foreground(compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("255")})110+ bg := colors[owner%len(colors)]111+ s = s.Background(bg).Foreground(theme.TextOnBG(bg))127112 if clue != nil {128- s = s.Foreground(compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("255")}).Bold(true)113+ s = s.Bold(true)129114 }130115 }131116 @@ -136,30 +121,31 @@ func cellView(m Model, x, y int, solved bool, preview *Rectangle, previewClue *C
136121 preview.Area() == previewClue.Value &&137122 !m.puzzle.Overlaps(*preview, previewClue.ID)138123 if good {139- s = s.Background(previewGoodBg).Foreground(compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("255")})124+ s = s.Background(previewGoodBg).Foreground(theme.TextOnBG(previewGoodBg))140125 } else {141- s = s.Background(previewBadBg).Foreground(compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("255")})126+ s = s.Background(previewBadBg).Foreground(theme.TextOnBG(previewBadBg))142127 }143128 }144129 145130 // Selected clue highlight.146131 if m.selectedClue != nil && clue != nil && clue.ID == *m.selectedClue && !inPreview {147- s = s.Background(selectedClueBg).Foreground(compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("235")}).Bold(true)132+ bg := theme.Current().Highlight133+ s = s.Background(bg).Foreground(theme.TextOnBG(bg)).Bold(true)148134 }149135 150136 // Solved styling.151137 if solved {152138 if owner >= 0 {153- colorIdx := owner % len(rectColors)154- s = s.Background(rectColors[colorIdx]).Foreground(compat.AdaptiveColor{Dark: lipgloss.Color("255"), Light: lipgloss.Color("255")})139+ bg := colors[owner%len(colors)]140+ s = s.Background(bg).Foreground(theme.TextOnBG(bg))155141 } else {156142 s = s.Background(solvedBg)157143 }158144 if isCursor {159- s = game.CursorSolvedStyle145+ s = game.CursorSolvedStyle()160146 }161147 } else if isCursor {162- s = s.Background(cursorBgColor).Foreground(cursorFgColor).Bold(true)148+ s = game.CursorStyle()163149 }164150 165151 return s.Width(cellWidth).AlignHorizontal(lipgloss.Center).Render(display)@@ -189,12 +175,12 @@ func infoView(p *Puzzle) string {
189175 func statusBarView(selected, showFullHelp bool) string {190176 if selected {191177 if showFullHelp {192- return game.StatusBarStyle.Render("arrows: expand shift+arrows: shrink enter: confirm esc: cancel bkspc: delete mouse: drag rect ctrl+n: menu ctrl+r: reset ctrl+h: help")178+ return game.StatusBarStyle().Render("arrows: expand shift+arrows: shrink enter: confirm esc: cancel bkspc: delete mouse: drag rect ctrl+n: menu ctrl+r: reset ctrl+h: help")193179 }194- return game.StatusBarStyle.Render("arrows: expand shift+arrows: shrink enter: confirm esc: cancel mouse: drag")180+ return game.StatusBarStyle().Render("arrows: expand shift+arrows: shrink enter: confirm esc: cancel mouse: drag")195181 }196182 if showFullHelp {197- return game.StatusBarStyle.Render("arrows/wasd: move enter/space: select clue bkspc: delete mouse: click clue & drag ctrl+n: menu ctrl+r: reset ctrl+h: help")183+ return game.StatusBarStyle().Render("arrows/wasd: move enter/space: select clue bkspc: delete mouse: click clue & drag ctrl+n: menu ctrl+r: reset ctrl+h: help")198184 }199- return game.StatusBarStyle.Render("enter/space: select clue bkspc: delete mouse: click & drag")185+ return game.StatusBarStyle().Render("enter/space: select clue bkspc: delete mouse: click & drag")200186 }@@ -2,6 +2,7 @@ package stats
22 33 import (44 "fmt"5+ "image/color"56 "math"67 "slices"78 "strings"@@ -10,7 +11,7 @@ import (
1011 "github.com/FelineStateMachine/puzzletea/daily"1112 "github.com/FelineStateMachine/puzzletea/game"1213 "github.com/FelineStateMachine/puzzletea/store"13- "github.com/FelineStateMachine/puzzletea/ui"14+ "github.com/FelineStateMachine/puzzletea/theme"1415 1516 "charm.land/bubbles/v2/list"1617 "charm.land/lipgloss/v2"@@ -269,47 +270,66 @@ func ViewportHeight(availableHeight int) int {
269270 return max(h, minRows)270271 }271272 272-var (273- cardFrame = lipgloss.NewStyle().274- Border(lipgloss.RoundedBorder()).275- BorderForeground(ui.MenuDim).276- Padding(0, 1).277- Width(CardInnerWidth + 4) // +4 for border + padding273+func cardFrameStyle() lipgloss.Style {274+ return lipgloss.NewStyle().275+ Border(lipgloss.RoundedBorder()).276+ BorderForeground(theme.Current().Border).277+ Padding(0, 1).278+ Width(CardInnerWidth + 4) // +4 for border + padding279+}278280 279- cardTitle = lipgloss.NewStyle().280- Bold(true).281- Foreground(ui.MenuAccent)281+func cardTitleStyle(fg color.Color) lipgloss.Style {282+ return lipgloss.NewStyle().283+ Bold(true).284+ Foreground(fg)285+}282286 283- statLabel = lipgloss.NewStyle().284- Foreground(ui.MenuTextDim)287+func statLabelStyle() lipgloss.Style {288+ return lipgloss.NewStyle().289+ Foreground(theme.Current().TextDim)290+}285291 286- statValue = lipgloss.NewStyle().287- Foreground(ui.MenuAccent).288- Bold(true)292+func statValueStyle() lipgloss.Style {293+ return lipgloss.NewStyle().294+ Foreground(theme.Current().Accent).295+ Bold(true)296+}289297 290- xpBarFilled = lipgloss.NewStyle().291- Foreground(ui.MenuAccent)298+func xpBarFilledStyle() lipgloss.Style {299+ return lipgloss.NewStyle().300+ Foreground(theme.Current().Accent)301+}292302 293- xpBarEmpty = lipgloss.NewStyle().294- Foreground(ui.MenuDim)303+func xpBarEmptyStyle() lipgloss.Style {304+ return lipgloss.NewStyle().305+ Foreground(theme.Current().Border)306+}295307 296- xpFraction = lipgloss.NewStyle().297- Foreground(ui.MenuText)308+func xpFractionStyle() lipgloss.Style {309+ return lipgloss.NewStyle().310+ Foreground(theme.Current().FG)311+}298312 299- bannerRule = lipgloss.NewStyle().300- Foreground(ui.MenuDim)313+func bannerRuleStyle() lipgloss.Style {314+ return lipgloss.NewStyle().315+ Foreground(theme.Current().Border)316+}301317 302- bannerLabel = lipgloss.NewStyle().303- Foreground(ui.MenuText)318+func bannerLabelStyle() lipgloss.Style {319+ return lipgloss.NewStyle().320+ Foreground(theme.Current().FG)321+}304322 305- bannerValue = lipgloss.NewStyle().306- Foreground(ui.MenuAccent).307- Bold(true)308-)323+func bannerValueStyle() lipgloss.Style {324+ return lipgloss.NewStyle().325+ Foreground(theme.Current().Accent).326+ Bold(true)327+}309328 310-// RenderCard renders a single stats card.311-func RenderCard(c Card) string {312- title := cardTitle.Render(329+// RenderCard renders a single stats card. The titleColor determines330+// the foreground color used for the category name heading.331+func RenderCard(c Card, titleColor color.Color) string {332+ title := cardTitleStyle(titleColor).Render(313333 fmt.Sprintf("%s \u2014 LVL %d", strings.ToUpper(c.GameType), c.Level),314334 )315335 @@ -324,12 +344,12 @@ func RenderCard(c Card) string {
324344 }325345 326346 inner := strings.Join(lines, "\n")327- return cardFrame.Render(inner)347+ return cardFrameStyle().Render(inner)328348 }329349 330350 func renderStatLine(label, value string) string {331- l := statLabel.Render(label)332- v := statValue.Render(value)351+ l := statLabelStyle().Render(label)352+ v := statValueStyle().Render(value)333353 // Right-align value within card width.334354 gap := CardInnerWidth - lipgloss.Width(l) - lipgloss.Width(v)335355 if gap < 1 {@@ -359,12 +379,12 @@ func renderXPBar(currentXP, level int) string {
359379 filled = 0360380 }361381 362- bar := xpBarFilled.Render(strings.Repeat("\u2588", filled)) +363- xpBarEmpty.Render(strings.Repeat("\u2591", barWidth-filled))382+ bar := xpBarFilledStyle().Render(strings.Repeat("\u2588", filled)) +383+ xpBarEmptyStyle().Render(strings.Repeat("\u2591", barWidth-filled))364384 365- frac := xpFraction.Render(fmt.Sprintf(" %d/%d", currentXP, nextLevelXP))385+ frac := xpFractionStyle().Render(fmt.Sprintf(" %d/%d", xpIntoLevel, xpNeeded))366386 367- return statLabel.Foreground(ui.MenuText).Render("XP ") + bar + frac387+ return statLabelStyle().Foreground(theme.Current().FG).Render("XP ") + bar + frac368388 }369389 370390 // RenderBanner renders the profile summary banner.@@ -373,13 +393,13 @@ func RenderBanner(b ProfileBanner, width int) string {
373393 width = 40374394 }375395 376- ruleStr := bannerRule.Render(396+ ruleStr := bannerRuleStyle().Render(377397 "\u2500\u2500\u2500 Profile " + strings.Repeat("\u2500", max(width-12, 1)),378398 )379399 380- check := bannerValue.Render("\u2714")400+ check := bannerValueStyle().Render("\u2714")381401 if !b.CurrentDaily {382- check = lipgloss.NewStyle().Foreground(ui.MenuTextDim).Render("\u2014")402+ check = lipgloss.NewStyle().Foreground(theme.Current().TextDim).Render("\u2014")383403 }384404 385405 streakStr := fmt.Sprintf("%d days", b.DailyStreak)@@ -387,10 +407,10 @@ func RenderBanner(b ProfileBanner, width int) string {
387407 streakStr = "1 day"388408 }389409 390- col1 := bannerLabel.Render("Profile Level: ") + bannerValue.Render(fmt.Sprintf("%d", b.ProfileLevel))391- col2 := bannerLabel.Render("Daily Streak: ") + bannerValue.Render(streakStr)392- col3 := bannerLabel.Render("Total Dailies: ") + bannerValue.Render(fmt.Sprintf("%d", b.TotalDailies))393- col4 := bannerLabel.Render("Current daily: ") + check410+ col1 := bannerLabelStyle().Render("Profile Level: ") + bannerValueStyle().Render(fmt.Sprintf("%d", b.ProfileLevel))411+ col2 := bannerLabelStyle().Render("Daily Streak: ") + bannerValueStyle().Render(streakStr)412+ col3 := bannerLabelStyle().Render("Total Dailies: ") + bannerValueStyle().Render(fmt.Sprintf("%d", b.TotalDailies))413+ col4 := bannerLabelStyle().Render("Current daily: ") + check394414 395415 // Two-column layout: left side + gap + right side.396416 gap := width - lipgloss.Width(col1) - lipgloss.Width(col2)@@ -405,7 +425,7 @@ func RenderBanner(b ProfileBanner, width int) string {
405425 }406426 row2 := col3 + strings.Repeat(" ", gap2) + col4407427 408- bottomRule := bannerRule.Render(strings.Repeat("\u2500", max(width, 1)))428+ bottomRule := bannerRuleStyle().Render(strings.Repeat("\u2500", max(width, 1)))409429 410430 return strings.Join([]string{ruleStr, row1, row2, bottomRule}, "\n")411431 }@@ -415,7 +435,7 @@ func RenderBanner(b ProfileBanner, width int) string {
415435 func RenderCardGrid(cards []Card, width int) string {416436 if len(cards) == 0 {417437 return lipgloss.NewStyle().418- Foreground(ui.MenuTextDim).438+ Foreground(theme.Current().TextDim).419439 Render("No stats yet \u2014 play some puzzles!")420440 }421441 @@ -430,7 +450,7 @@ func RenderCardGrid(cards []Card, width int) string {
430450 func RenderView(banner ProfileBanner, cards []Card, width int) string {431451 if len(cards) == 0 {432452 return lipgloss.NewStyle().433- Foreground(ui.MenuTextDim).453+ Foreground(theme.Current().TextDim).434454 Render("No stats yet \u2014 play some puzzles!")435455 }436456 @@ -453,10 +473,13 @@ func renderCardColumns(cards []Card, cols int) string {
453473 cols = 1454474 }455475 476+ palette := theme.Current().CardColors()477+456478 columns := make([][]string, cols)457479 for i, c := range cards {458480 col := i % cols459- columns[col] = append(columns[col], RenderCard(c))481+ titleColor := palette[i%len(palette)]482+ columns[col] = append(columns[col], RenderCard(c, titleColor))460483 }461484 462485 rendered := make([]string, cols)@@ -25,7 +25,7 @@ var (
2525 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("236"), Dark: lipgloss.Color("187")}).2626 Background(backgroundColor)2727 28- cursorCellStyle = game.CursorStyle28+ // cursorCellStyle resolved at render time via game.CursorStyle().2929 3030 conflictCellStyle = lipgloss.NewStyle().3131 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("160"), Dark: lipgloss.Color("167")}).@@ -108,7 +108,7 @@ func getCellStyle(m Model, c cell, x, y int, conflict bool) lipgloss.Style {
108108 109109 // Priority: cursor > conflict > same number > provided > user > empty110110 if m.cursor.X == x && m.cursor.Y == y {111- return cursorCellStyle111+ return game.CursorStyle()112112 }113113 114114 if conflict {@@ -225,7 +225,7 @@ func computeConflicts(g grid) [gridSize][gridSize]bool {
225225 226226 func statusBarView(showFullHelp bool) string {227227 if showFullHelp {228- return game.StatusBarStyle.Render("arrows/wasd: move 1-9: fill bkspc: clear ctrl+n: menu ctrl+r: reset ctrl+h: help")228+ return game.StatusBarStyle().Render("arrows/wasd: move 1-9: fill bkspc: clear ctrl+n: menu ctrl+r: reset ctrl+h: help")229229 }230- return game.StatusBarStyle.Render("1-9: fill bkspc: clear")230+ return game.StatusBarStyle().Render("1-9: fill bkspc: clear")231231 }@@ -76,6 +76,9 @@ func (m Model) Update(msg tea.Msg) (game.Gamer, tea.Cmd) {
7676 func (m Model) View() string {7777 title := game.TitleBarView("Takuzu", m.modeTitle, m.solved)7878 grid := gridView(m.grid, m.provided, m.cursor, m.solved)79+ if m.solved {80+ return lipgloss.JoinVertical(lipgloss.Center, title, grid)81+ }7982 status := statusBarView(m.showFullHelp)8083 return lipgloss.JoinVertical(lipgloss.Center, title, grid, status)8184 }@@ -21,7 +21,7 @@ var (
2121 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("250"), Dark: lipgloss.Color("240")}).2222 Background(backgroundColor)2323 24- cursorSolvedStyle = game.CursorSolvedStyle24+ // cursorSolvedStyle resolved at render time via game.CursorSolvedStyle().2525 2626 crosshairBG = compat.AdaptiveColor{Light: lipgloss.Color("254"), Dark: lipgloss.Color("237")}2727 solvedBG = compat.AdaptiveColor{Light: lipgloss.Color("151"), Dark: lipgloss.Color("22")}@@ -56,9 +56,9 @@ func cellView(val rune, isProvided, isCursor, inCursorRow, inCursorCol, solved b
5656 }5757 5858 if isCursor && solved {59- s = cursorSolvedStyle59+ s = game.CursorSolvedStyle()6060 } else if isCursor {61- s = s.Background(game.CursorWarmBG).Bold(true)61+ s = s.Background(game.CursorWarmBG()).Bold(true)6262 } else if solved {6363 s = s.Background(solvedBG)6464 } else if inCursorRow || inCursorCol {@@ -116,7 +116,7 @@ var gridBorderColors = game.GridBorderColors{
116116 117117 func statusBarView(showFullHelp bool) string {118118 if showFullHelp {119- return game.StatusBarStyle.Render("arrows/wasd: move z: ● x: ○ bkspc: clear ctrl+n: menu ctrl+r: reset ctrl+h: help")119+ return game.StatusBarStyle().Render("arrows/wasd: move z: ● x: ○ bkspc: clear ctrl+n: menu ctrl+r: reset ctrl+h: help")120120 }121- return game.StatusBarStyle.Render("z: ● x: ○ bkspc: clear")121+ return game.StatusBarStyle().Render("z: ● x: ○ bkspc: clear")122122 }@@ -0,0 +1,163 @@
1+package theme2+3+import (4+ "image/color"5+ "math"6+)7+8+// relativeLuminance returns the WCAG 2.x relative luminance of a color.9+// See https://www.w3.org/TR/WCAG21/#dfn-relative-luminance10+func relativeLuminance(c color.Color) float64 {11+ r, g, b, _ := c.RGBA()12+ // Convert from 16-bit pre-multiplied to 0..1 sRGB.13+ sr := linearize(float64(r) / 0xffff)14+ sg := linearize(float64(g) / 0xffff)15+ sb := linearize(float64(b) / 0xffff)16+ return 0.2126*sr + 0.7152*sg + 0.0722*sb17+}18+19+// linearize converts an sRGB channel value (0..1) to linear light.20+func linearize(v float64) float64 {21+ if v <= 0.04045 {22+ return v / 12.9223+ }24+ return math.Pow((v+0.055)/1.055, 2.4)25+}26+27+// contrastRatio returns the WCAG 2.x contrast ratio between two colors.28+// The result is in the range [1, 21].29+func contrastRatio(a, b color.Color) float64 {30+ la := relativeLuminance(a)31+ lb := relativeLuminance(b)32+ if la < lb {33+ la, lb = lb, la34+ }35+ return (la + 0.05) / (lb + 0.05)36+}37+38+// minContrastNormal is the WCAG AA minimum for normal text (4.5:1).39+const minContrastNormal = 4.540+41+// minContrastLarge is the WCAG AA minimum for large/bold text (3:1).42+const minContrastLarge = 3.043+44+// ensurePairContrast ensures that the foreground/background pair meets the45+// minimum contrast ratio. When the original fg falls short, it scans the46+// full 16-color ANSI palette for the candidate that meets the ratio and47+// has the closest relative luminance to the original fg — preserving the48+// intended lightness rather than jumping to an extreme.49+//50+// If no ANSI color qualifies, the closest-luminance ANSI candidate is51+// nudged toward white or black just enough to satisfy the ratio, keeping52+// the result close to the palette's tonal range.53+func ensurePairContrast(fg, bg color.Color, p Palette, minRatio float64) color.Color {54+ if contrastRatio(fg, bg) >= minRatio {55+ return fg56+ }57+58+ targetLum := relativeLuminance(fg)59+60+ // Find the closest-luminance ANSI color that meets contrast, and61+ // separately track the closest-luminance ANSI color overall as a62+ // nudge candidate if nothing qualifies outright.63+ var bestOK, bestAny color.Color64+ bestOKDist := math.Inf(1)65+ bestAnyDist := math.Inf(1)66+67+ for _, c := range p.ANSI {68+ dist := math.Abs(relativeLuminance(c) - targetLum)69+ if dist < bestAnyDist {70+ bestAny = c71+ bestAnyDist = dist72+ }73+ if contrastRatio(c, bg) >= minRatio && dist < bestOKDist {74+ bestOK = c75+ bestOKDist = dist76+ }77+ }78+79+ if bestOK != nil {80+ return bestOK81+ }82+83+ // No ANSI color meets the ratio — nudge the closest candidate.84+ return nudgeContrast(bestAny, bg, minRatio)85+}86+87+// nudgeContrast blends fg toward white or black until the contrast ratio88+// against bg meets minRatio. The direction (lighter or darker) is chosen89+// by moving away from the background luminance, so the result stays as90+// close to the original fg as possible.91+func nudgeContrast(fg, bg color.Color, minRatio float64) color.Color {92+ fgLum := relativeLuminance(fg)93+ bgLum := relativeLuminance(bg)94+95+ type endpoint struct{ r, g, b uint8 }96+ light := endpoint{0xff, 0xff, 0xff}97+ dark := endpoint{0x00, 0x00, 0x00}98+99+ // Move away from the background luminance.100+ target := light101+ if fgLum <= bgLum {102+ target = dark103+ }104+105+ // If the chosen extreme can't reach minRatio, flip.106+ tColor := color.NRGBA{R: target.r, G: target.g, B: target.b, A: 0xff}107+ if contrastRatio(tColor, bg) < minRatio {108+ if target == light {109+ target = dark110+ } else {111+ target = light112+ }113+ }114+115+ fr, fg2, fb, _ := fg.RGBA()116+ fr8, fg8, fb8 := uint8(fr>>8), uint8(fg2>>8), uint8(fb>>8)117+118+ // Binary search for the minimum blend factor.119+ lo, hi := 0.0, 1.0120+ for range 32 {121+ mid := (lo + hi) / 2122+ c := blendRGB(fr8, fg8, fb8, target.r, target.g, target.b, mid)123+ if contrastRatio(c, bg) >= minRatio {124+ hi = mid125+ } else {126+ lo = mid127+ }128+ }129+ return blendRGB(fr8, fg8, fb8, target.r, target.g, target.b, hi)130+}131+132+// blendRGB linearly interpolates between two RGB colors at factor t ∈ [0,1].133+func blendRGB(r1, g1, b1, r2, g2, b2 uint8, t float64) color.Color {134+ lerp := func(a, b uint8) uint8 {135+ return uint8(float64(a)*(1-t) + float64(b)*t + 0.5)136+ }137+ return color.NRGBA{R: lerp(r1, r2), G: lerp(g1, g2), B: lerp(b1, b2), A: 0xff}138+}139+140+// TextOnBG returns the current palette's FG or BG color — whichever has141+// better contrast against bg. This is useful for choosing readable text142+// over an arbitrary background (e.g. colored rectangles in shikaku).143+func TextOnBG(bg color.Color) color.Color {144+ p := Current()145+ if contrastRatio(p.FG, bg) >= contrastRatio(p.BG, bg) {146+ return p.FG147+ }148+ return p.BG149+}150+151+// midTone returns a color perceptually halfway between a and b by152+// blending their sRGB channels. This produces a muted tone suitable for153+// dim/secondary text that is guaranteed to sit between the two anchors.154+func midTone(a, b color.Color) color.Color {155+ ar, ag, ab, _ := a.RGBA()156+ br, bg, bb, _ := b.RGBA()157+ return color.NRGBA{158+ R: uint8(((ar >> 8) + (br >> 8)) / 2),159+ G: uint8(((ag >> 8) + (bg >> 8)) / 2),160+ B: uint8(((ab >> 8) + (bb >> 8)) / 2),161+ A: 0xff,162+ }163+}@@ -0,0 +1,66 @@
1+package theme2+3+import (4+ "image/color"5+6+ "charm.land/lipgloss/v2"7+)8+9+// DefaultThemeName is the name of the built-in earth-tone palette that ships10+// with PuzzleTea. When no theme is configured, this palette is active.11+const DefaultThemeName = "PuzzleTea Default"12+13+// defaultPalette returns the hand-tuned palette that ships with PuzzleTea.14+// Base colors are chosen so that every critical FG/BG pairing meets WCAG AA15+// after [enforcePaletteContrast] runs. The contrast enforcement step16+// auto-selects cursor text color (light or dark) based on accent luminance.17+func defaultPalette() Palette {18+ p := Palette{19+ // Surfaces20+ BG: lipgloss.Color("#262626"), // 235 — main background21+ FG: lipgloss.Color("#d0d0d0"), // 252 — primary text (9.8:1 on BG)22+ Surface: lipgloss.Color("#3a3a3a"), // 237 — subtle elevation23+ SurfaceBright: lipgloss.Color("#e4e4e4"), // 254 — bright surface / cursor text24+25+ // Accent — earth-tone orange26+ Accent: lipgloss.Color("#cc8844"), // ~180 — primary accent (5.2:1 on BG)27+ AccentSoft: lipgloss.Color("#cc9966"), // 180 — secondary highlight28+ AccentText: lipgloss.Color("#e4e4e4"), // 254 — text on accent background29+30+ // Text31+ TextDim: lipgloss.Color("#949494"), // ~246 — muted text (5.0:1 on BG)32+33+ // Chrome34+ Border: lipgloss.Color("#585858"), // ~240 — borders (2.1:1 on BG, 1.6:1 on Surface)35+36+ // Game semantics37+ Success: lipgloss.Color("#145530"), // deeper green38+ SuccessBorder: lipgloss.Color("#99cc33"), // 149 — solved border text39+ Error: lipgloss.Color("#cc3333"), // 167 — conflict foreground40+ ErrorBG: lipgloss.Color("#330000"), // 52 — conflict background41+ Info: lipgloss.Color("#bb8844"), // ~180 — hint/info text (4.8:1 on BG)42+ Highlight: lipgloss.Color("#cc9933"), // 179 — selection highlight43+ Warm: lipgloss.Color("#b86b00"), // ~166 — warm cursor BG44+ WarmText: lipgloss.Color("#e4e4e4"), // 254 — text on warm background45+46+ ANSI: [16]color.Color{47+ lipgloss.Color("#262626"), // 0 black48+ lipgloss.Color("#cc3333"), // 1 red49+ lipgloss.Color("#145530"), // 2 green — success50+ lipgloss.Color("#cc8844"), // 3 yellow — primary accent51+ lipgloss.Color("#bb8844"), // 4 blue — info/hint52+ lipgloss.Color("#993399"), // 5 purple53+ lipgloss.Color("#cc9933"), // 6 cyan — highlight54+ lipgloss.Color("#d0d0d0"), // 7 white55+ lipgloss.Color("#949494"), // 8 brightBlack — textDim56+ lipgloss.Color("#330000"), // 9 brightRed — error bg57+ lipgloss.Color("#99cc33"), // 10 brightGreen — success border58+ lipgloss.Color("#cc9966"), // 11 brightYellow — accent soft59+ lipgloss.Color("#cccc99"), // 12 brightBlue60+ lipgloss.Color("#99cc99"), // 13 brightPurple61+ lipgloss.Color("#ffcc99"), // 14 brightCyan62+ lipgloss.Color("#eeeeee"), // 15 brightWhite63+ },64+ }65+ return enforcePaletteContrast(p)66+}@@ -0,0 +1,162 @@
1+package theme2+3+import (4+ "image/color"5+6+ "charm.land/lipgloss/v2"7+)8+9+// Palette holds the semantic color tokens derived from a terminal color scheme.10+// Every style in the application reads from the active palette via [Current].11+type Palette struct {12+ // Surfaces13+ BG color.Color // main background14+ FG color.Color // primary text / foreground15+ Surface color.Color // slightly elevated surface (crosshair, panels)16+ SurfaceBright color.Color // bright surface (light-mode backgrounds)17+18+ // Brand / accent19+ Accent color.Color // primary accent (menu highlights, cursor BG)20+ AccentSoft color.Color // muted accent (secondary highlights)21+ AccentText color.Color // text on accent background (cursor text, title bars)22+23+ // Text24+ TextDim color.Color // secondary / muted text25+26+ // Chrome27+ Border color.Color // borders, separators, dividers28+29+ // Game semantics30+ Success color.Color // solved state31+ SuccessBorder color.Color // solved border32+ Error color.Color // conflict / error foreground33+ ErrorBG color.Color // conflict / error background34+ Info color.Color // hints, informational text35+ Highlight color.Color // selection, active highlight36+ Warm color.Color // warm accent (cursor variant)37+ WarmText color.Color // text on warm background38+39+ // Full 16-color ANSI palette for puzzle-specific use (e.g. shikaku rects).40+ // Order: black, red, green, yellow, blue, purple, cyan, white,41+ // brightBlack..brightWhite.42+ ANSI [16]color.Color43+}44+45+// CardColors returns a curated slice of distinct, colorful palette colors46+// suitable for differentiating UI cards. The colors are drawn from the47+// chromatic ANSI slots (skipping black/white/gray) and the semantic accent48+// colors, giving up to 10 visually distinct options per theme.49+func (p Palette) CardColors() []color.Color {50+ return []color.Color{51+ p.ANSI[3], // yellow52+ p.ANSI[4], // blue53+ p.ANSI[2], // green54+ p.ANSI[5], // purple55+ p.ANSI[6], // cyan56+ p.ANSI[1], // red57+ p.ANSI[11], // brightYellow58+ p.ANSI[12], // brightBlue59+ p.ANSI[14], // brightCyan60+ p.ANSI[13], // brightPurple61+ }62+}63+64+// derivePalette maps a Theme's 16 terminal colors onto semantic tokens and65+// enforces minimum WCAG contrast ratios for every critical FG/BG pairing.66+func derivePalette(t Theme) Palette {67+ bg := lipgloss.Color(t.Background)68+ fg := lipgloss.Color(t.Foreground)69+70+ ansi := [16]color.Color{71+ lipgloss.Color(t.Black),72+ lipgloss.Color(t.Red),73+ lipgloss.Color(t.Green),74+ lipgloss.Color(t.Yellow),75+ lipgloss.Color(t.Blue),76+ lipgloss.Color(t.Purple),77+ lipgloss.Color(t.Cyan),78+ lipgloss.Color(t.White),79+ lipgloss.Color(t.BrightBlack),80+ lipgloss.Color(t.BrightRed),81+ lipgloss.Color(t.BrightGreen),82+ lipgloss.Color(t.BrightYellow),83+ lipgloss.Color(t.BrightBlue),84+ lipgloss.Color(t.BrightPurple),85+ lipgloss.Color(t.BrightCyan),86+ lipgloss.Color(t.BrightWhite),87+ }88+89+ // Pick distinct slots for Surface / TextDim / Border so they are not90+ // all identical. Surface stays at brightBlack (8); TextDim uses white91+ // (7) or brightBlack (8) depending on which has better contrast against92+ // BG; Border uses black (0).93+ surface := ansi[8] // brightBlack — subtle elevation94+ textDim := midTone(bg, fg) // halfway between BG and FG95+ border := ansi[0] // black — distinct from surface96+97+ // If border is too close to BG, swap to brightBlack.98+ if contrastRatio(border, bg) < 1.5 {99+ border = surface100+ }101+102+ p := Palette{103+ BG: bg,104+ FG: fg,105+ Surface: surface,106+ SurfaceBright: ansi[7], // white107+ Accent: ansi[3], // yellow108+ AccentSoft: ansi[11], // brightYellow109+ AccentText: ansi[7], // white — text on accent background110+ TextDim: textDim,111+ Border: border,112+ Success: ansi[2], // green113+ SuccessBorder: ansi[10], // brightGreen114+ Error: ansi[1], // red115+ ErrorBG: ansi[9], // brightRed116+ Info: ansi[4], // blue117+ Highlight: ansi[6], // cyan118+ Warm: ansi[11], // brightYellow119+ WarmText: ansi[7], // white — text on warm background120+ ANSI: ansi,121+ }122+123+ return enforcePaletteContrast(p)124+}125+126+// enforcePaletteContrast ensures every critical FG-on-BG pairing in p meets127+// WCAG AA minimums. It nudges foreground colors toward the palette's brightest128+// or darkest ANSI slot when the original contrast is insufficient.129+//130+// Ordering matters: background-role colors (Accent, Success, ErrorBG) are131+// finalized first, then foreground-role colors that sit on top of them.132+func enforcePaletteContrast(p Palette) Palette {133+ // --- Phase 1: finalize colors used as backgrounds ---134+135+ // Accent on BG (normal text for menu items → 4.5:1).136+ p.Accent = ensurePairContrast(p.Accent, p.BG, p, minContrastNormal)137+138+ // --- Phase 2: finalize foreground colors against their backgrounds ---139+140+ // AccentText on Accent (cursor text, title bars — large/bold text → 3:1).141+ p.AccentText = ensurePairContrast(p.AccentText, p.Accent, p, minContrastLarge)142+143+ // WarmText on Warm (warm cursor text — large/bold text → 3:1).144+ p.WarmText = ensurePairContrast(p.WarmText, p.Warm, p, minContrastLarge)145+146+ // Solved: SuccessBorder on Success (large/bold text → 3:1).147+ p.SuccessBorder = ensurePairContrast(p.SuccessBorder, p.Success, p, minContrastLarge)148+149+ // Conflict: Error on ErrorBG (large/bold text → 3:1).150+ p.Error = ensurePairContrast(p.Error, p.ErrorBG, p, minContrastLarge)151+152+ // TextDim on BG (normal text → 4.5:1).153+ p.TextDim = ensurePairContrast(p.TextDim, p.BG, p, minContrastNormal)154+155+ // FG on BG (normal text → 4.5:1).156+ p.FG = ensurePairContrast(p.FG, p.BG, p, minContrastNormal)157+158+ // Info on BG (normal text → 4.5:1).159+ p.Info = ensurePairContrast(p.Info, p.BG, p, minContrastNormal)160+161+ return p162+}@@ -0,0 +1,103 @@
1+package theme2+3+import (4+ "image/color"5+ "strings"6+7+ "charm.land/lipgloss/v2"8+)9+10+const (11+ swatchW = 612+ previewW = 2813+)14+15+// PreviewPanel renders a visual color preview for the named theme.16+// It shows labeled swatches for the 16 ANSI colors, background/foreground,17+// and the semantic roles.18+func PreviewPanel(themeName string, height int) string {19+ var p Palette20+ if themeName == "" || strings.EqualFold(themeName, DefaultThemeName) {21+ p = defaultPalette()22+ } else if t := LookupTheme(themeName); t != nil {23+ p = t.Palette()24+ } else {25+ p = defaultPalette()26+ }27+28+ title := lipgloss.NewStyle().Bold(true).Foreground(p.Accent)29+ dim := lipgloss.NewStyle().Foreground(p.TextDim)30+ label := lipgloss.NewStyle().Foreground(p.FG)31+32+ var lines []string33+34+ lines = append(lines, title.Render(themeName))35+ lines = append(lines, "")36+37+ // Background + foreground sample text.38+ sample := lipgloss.NewStyle().39+ Background(p.BG).Foreground(p.FG).40+ Width(previewW).Padding(0, 1).41+ Render("The quick brown fox")42+ lines = append(lines, sample)43+ lines = append(lines, "")44+45+ // Semantic color swatches: two per row to keep labels readable.46+ lines = append(lines, dim.Render("Semantic"))47+ lines = append(lines, swatchPair(p, "Accent", p.Accent, "Soft", p.AccentSoft))48+ lines = append(lines, swatchPair(p, "Info", p.Info, "Warm", p.Warm))49+ lines = append(lines, swatchPair(p, "OK", p.Success, "Error", p.Error))50+ lines = append(lines, swatchPair(p, "FG", p.FG, "Dim", p.TextDim))51+ lines = append(lines, "")52+53+ // ANSI 16-color grid: 8 per row, compact 3-char swatches.54+ lines = append(lines, dim.Render("ANSI Palette"))55+ lines = append(lines, ansiRow(p.ANSI[0:8]))56+ lines = append(lines, ansiRow(p.ANSI[8:16]))57+ lines = append(lines, "")58+59+ // Game state previews.60+ lines = append(lines, dim.Render("Game States"))61+ lines = append(lines, lipgloss.NewStyle().62+ Background(p.Accent).Foreground(p.AccentText).Bold(true).63+ Width(previewW).Padding(0, 1).64+ Render("Cursor"))65+ lines = append(lines, lipgloss.NewStyle().66+ Background(p.Success).Foreground(p.SuccessBorder).Bold(true).67+ Width(previewW).Padding(0, 1).68+ Render("Solved"))69+ lines = append(lines, lipgloss.NewStyle().70+ Background(p.ErrorBG).Foreground(p.Error).Bold(true).71+ Width(previewW).Padding(0, 1).72+ Render("Conflict"))73+74+ _ = label // reserved for future use75+76+ // Truncate to available height.77+ if height > 0 && len(lines) > height {78+ lines = lines[:height]79+ }80+81+ return lipgloss.JoinVertical(lipgloss.Left, lines...)82+}83+84+// swatchPair renders two labeled color swatches side by side on two lines.85+func swatchPair(p Palette, lbl1 string, c1 color.Color, lbl2 string, c2 color.Color) string {86+ sw := func(c color.Color) string {87+ return lipgloss.NewStyle().Background(c).Width(swatchW).Render(strings.Repeat(" ", swatchW))88+ }89+ lb := func(s string) string {90+ return lipgloss.NewStyle().Foreground(p.TextDim).Width(swatchW).Render(s)91+ }92+ gap := " "93+ return sw(c1) + gap + sw(c2) + "\n" + lb(lbl1) + gap + lb(lbl2)94+}95+96+// ansiRow renders 8 color swatches in a single compact row.97+func ansiRow(colors []color.Color) string {98+ var cells []string99+ for _, c := range colors {100+ cells = append(cells, lipgloss.NewStyle().Background(c).Render(" "))101+ }102+ return strings.Join(cells, "")103+}@@ -0,0 +1,126 @@
1+// Package theme provides color theming for PuzzleTea. It loads terminal2+// color schemes from an embedded JSON file and exposes a semantic [Palette]3+// derived from the active theme's 16-color ANSI palette.4+package theme5+6+import (7+ "encoding/json"8+ "fmt"9+ "strings"10+ "sync"11+)12+13+// Theme represents a terminal color scheme with the standard 16 ANSI colors14+// plus background, foreground, and cursor colors.15+type Theme struct {16+ Name string `json:"name"`17+ Black string `json:"black"`18+ Red string `json:"red"`19+ Green string `json:"green"`20+ Yellow string `json:"yellow"`21+ Blue string `json:"blue"`22+ Purple string `json:"purple"`23+ Cyan string `json:"cyan"`24+ White string `json:"white"`25+ BrightBlack string `json:"brightBlack"`26+ BrightRed string `json:"brightRed"`27+ BrightGreen string `json:"brightGreen"`28+ BrightYellow string `json:"brightYellow"`29+ BrightBlue string `json:"brightBlue"`30+ BrightPurple string `json:"brightPurple"`31+ BrightCyan string `json:"brightCyan"`32+ BrightWhite string `json:"brightWhite"`33+ Background string `json:"background"`34+ Foreground string `json:"foreground"`35+ CursorColor string `json:"cursorColor,omitempty"`36+ SelectionBackground string `json:"selectionBackground,omitempty"`37+ Meta struct {38+ IsDark bool `json:"isDark"`39+ } `json:"meta"`40+}41+42+// Palette returns the semantic color palette derived from this theme.43+func (t Theme) Palette() Palette {44+ return derivePalette(t)45+}46+47+// MaxNameLen is the length of the longest theme name (including the default).48+// Useful for sizing UI elements like the theme picker list.49+var MaxNameLen int50+51+var (52+ mu sync.RWMutex53+ current Palette54+ allThemes []Theme55+ byName map[string]int // lowercase name -> index in allThemes56+)57+58+func init() {59+ allThemes = parseEmbeddedThemes()60+ byName = make(map[string]int, len(allThemes)+1)61+ MaxNameLen = len(DefaultThemeName)62+ for i, t := range allThemes {63+ byName[strings.ToLower(t.Name)] = i64+ if len(t.Name) > MaxNameLen {65+ MaxNameLen = len(t.Name)66+ }67+ }68+ current = defaultPalette()69+}70+71+// Current returns the active palette. Safe for concurrent use.72+func Current() Palette {73+ mu.RLock()74+ defer mu.RUnlock()75+ return current76+}77+78+// Apply activates the named theme. An empty name applies the built-in default.79+// Returns an error if the theme name is not found.80+func Apply(name string) error {81+ mu.Lock()82+ defer mu.Unlock()83+84+ if name == "" || strings.EqualFold(name, DefaultThemeName) {85+ current = defaultPalette()86+ return nil87+ }88+89+ idx, ok := byName[strings.ToLower(name)]90+ if !ok {91+ return fmt.Errorf("unknown theme %q", name)92+ }93+ current = allThemes[idx].Palette()94+ return nil95+}96+97+// AllThemes returns every available theme.98+func AllThemes() []Theme { return allThemes }99+100+// ThemeNames returns the list of all theme names, with the default first.101+func ThemeNames() []string {102+ names := make([]string, 0, len(allThemes)+1)103+ names = append(names, DefaultThemeName)104+ for _, t := range allThemes {105+ names = append(names, t.Name)106+ }107+ return names108+}109+110+// LookupTheme returns the theme with the given name, or nil if not found.111+func LookupTheme(name string) *Theme {112+ idx, ok := byName[strings.ToLower(name)]113+ if !ok {114+ return nil115+ }116+ t := allThemes[idx]117+ return &t118+}119+120+func parseEmbeddedThemes() []Theme {121+ var themes []Theme122+ if err := json.Unmarshal(themesJSON, &themes); err != nil {123+ panic(fmt.Sprintf("theme: failed to parse embedded themes.json: %v", err))124+ }125+ return themes126+}@@ -0,0 +1,204 @@
1+package theme2+3+import (4+ "fmt"5+ "image/color"6+ "testing"7+)8+9+// --- Embedded theme loading (P0) ---10+11+func TestParseEmbeddedThemes(t *testing.T) {12+ themes := AllThemes()13+ if len(themes) == 0 {14+ t.Fatal("expected at least one embedded theme")15+ }16+ // Spot-check a well-known theme exists.17+ found := false18+ for _, th := range themes {19+ if th.Name == "Dracula" {20+ found = true21+ break22+ }23+ }24+ if !found {25+ t.Error("expected to find Dracula theme in embedded themes")26+ }27+}28+29+func TestThemeNames(t *testing.T) {30+ names := ThemeNames()31+ if len(names) < 2 {32+ t.Fatalf("expected at least 2 theme names, got %d", len(names))33+ }34+ if names[0] != DefaultThemeName {35+ t.Errorf("first theme name should be %q, got %q", DefaultThemeName, names[0])36+ }37+}38+39+func TestLookupTheme(t *testing.T) {40+ th := LookupTheme("Dracula")41+ if th == nil {42+ t.Fatal("expected to find Dracula theme")43+ }44+ if th.Name != "Dracula" {45+ t.Errorf("expected name Dracula, got %q", th.Name)46+ }47+ if !th.Meta.IsDark {48+ t.Error("expected Dracula to be a dark theme")49+ }50+}51+52+func TestLookupThemeCaseInsensitive(t *testing.T) {53+ th := LookupTheme("dracula")54+ if th == nil {55+ t.Fatal("expected case-insensitive lookup to find Dracula")56+ }57+}58+59+func TestLookupThemeNotFound(t *testing.T) {60+ th := LookupTheme("nonexistent-theme-xyz")61+ if th != nil {62+ t.Error("expected nil for unknown theme")63+ }64+}65+66+// --- Palette derivation (P0) ---67+68+func TestDefaultPaletteNonNil(t *testing.T) {69+ p := defaultPalette()70+ if p.BG == nil {71+ t.Error("default palette BG should not be nil")72+ }73+ if p.FG == nil {74+ t.Error("default palette FG should not be nil")75+ }76+ if p.Accent == nil {77+ t.Error("default palette Accent should not be nil")78+ }79+}80+81+func TestDerivePaletteFromTheme(t *testing.T) {82+ th := LookupTheme("Dracula")83+ if th == nil {84+ t.Fatal("Dracula theme not found")85+ }86+ p := th.Palette()87+ if p.BG == nil {88+ t.Error("Dracula palette BG should not be nil")89+ }90+ if p.Success == nil {91+ t.Error("Dracula palette Success should not be nil")92+ }93+ // All 16 ANSI slots should be populated.94+ for i, c := range p.ANSI {95+ if c == nil {96+ t.Errorf("Dracula palette ANSI[%d] should not be nil", i)97+ }98+ }99+}100+101+// --- Apply / Current (P0) ---102+103+func TestApplyDefault(t *testing.T) {104+ if err := Apply(""); err != nil {105+ t.Fatalf("Apply empty should succeed: %v", err)106+ }107+ p := Current()108+ if p.BG == nil {109+ t.Error("current palette BG should not be nil after applying default")110+ }111+}112+113+func TestApplyNamedTheme(t *testing.T) {114+ if err := Apply("Dracula"); err != nil {115+ t.Fatalf("Apply Dracula should succeed: %v", err)116+ }117+ p := Current()118+ if p.BG == nil {119+ t.Error("current palette BG should not be nil after applying Dracula")120+ }121+ // Restore default for other tests.122+ _ = Apply("")123+}124+125+func TestApplyUnknownTheme(t *testing.T) {126+ err := Apply("nonexistent-theme-xyz")127+ if err == nil {128+ t.Error("expected error for unknown theme")129+ }130+}131+132+// --- Contrast enforcement (P0) ---133+134+func TestContrastRatioKnownValues(t *testing.T) {135+ // Black on white should be 21:1.136+ black := color.NRGBA{R: 0, G: 0, B: 0, A: 255}137+ white := color.NRGBA{R: 255, G: 255, B: 255, A: 255}138+ got := contrastRatio(black, white)139+ if got < 20.9 || got > 21.1 {140+ t.Errorf("black-on-white contrast = %.2f, want ~21.0", got)141+ }142+ // Same color should be 1:1.143+ got = contrastRatio(black, black)144+ if got < 0.99 || got > 1.01 {145+ t.Errorf("same-color contrast = %.2f, want 1.0", got)146+ }147+}148+149+func TestDefaultPaletteContrast(t *testing.T) {150+ p := defaultPalette()151+ assertPaletteContrast(t, "default", p)152+}153+154+func TestAllThemePaletteContrast(t *testing.T) {155+ for _, th := range AllThemes() {156+ p := th.Palette()157+ t.Run(th.Name, func(t *testing.T) {158+ assertPaletteContrast(t, th.Name, p)159+ })160+ }161+}162+163+// assertPaletteContrast checks that every critical FG/BG pairing in a palette164+// meets WCAG AA minimums. Bold/large text uses 3:1; normal text uses 4.5:1.165+func assertPaletteContrast(t *testing.T, name string, p Palette) {166+ t.Helper()167+168+ type pair struct {169+ label string170+ fg, bg color.Color171+ minRatio float64172+ }173+174+ pairs := []pair{175+ {"FG on BG", p.FG, p.BG, minContrastNormal},176+ {"TextDim on BG", p.TextDim, p.BG, minContrastNormal},177+ {"Info on BG", p.Info, p.BG, minContrastNormal},178+ {"Accent on BG", p.Accent, p.BG, minContrastNormal},179+ {"AccentText on Accent (cursor)", p.AccentText, p.Accent, minContrastLarge},180+ {"WarmText on Warm (warm cursor)", p.WarmText, p.Warm, minContrastLarge},181+ {"SuccessBorder on Success (solved)", p.SuccessBorder, p.Success, minContrastLarge},182+ {"Error on ErrorBG (conflict)", p.Error, p.ErrorBG, minContrastLarge},183+ }184+185+ for _, pp := range pairs {186+ cr := contrastRatio(pp.fg, pp.bg)187+ if cr < pp.minRatio {188+ t.Errorf("[%s] %s: contrast %.2f:1 < %.1f:1 minimum",189+ name, pp.label, cr, pp.minRatio)190+ }191+ }192+}193+194+func TestMidTone(t *testing.T) {195+ black := color.NRGBA{R: 0, G: 0, B: 0, A: 255}196+ white := color.NRGBA{R: 255, G: 255, B: 255, A: 255}197+ mid := midTone(black, white)198+ r, g, b, _ := mid.RGBA()199+ // Should be roughly 127/128 for each channel.200+ got := fmt.Sprintf("%d,%d,%d", r>>8, g>>8, b>>8)201+ if got != "127,127,127" {202+ t.Errorf("midTone(black, white) = %s, want 127,127,127", got)203+ }204+}@@ -0,0 +1 @@
1+[{"name":"3024 Day","black":"#090300","red":"#db2d20","green":"#01a252","yellow":"#fded02","blue":"#01a0e4","purple":"#a16a94","cyan":"#b5e4f4","white":"#a5a2a2","brightBlack":"#5c5855","brightRed":"#e8bbd0","brightGreen":"#3a3432","brightYellow":"#4a4543","brightBlue":"#807d7c","brightPurple":"#d6d5d4","brightCyan":"#cdab53","brightWhite":"#f7f7f7","background":"#f7f7f7","foreground":"#4a4543","cursorColor":"#4a4543","selectionBackground":"#a5a2a2","meta":{"isDark":false,"credits":[{"name":"0x3024","link":"https://github.com/0x3024"}]}},{"name":"3024 Night","black":"#090300","red":"#db2d20","green":"#01a252","yellow":"#fded02","blue":"#01a0e4","purple":"#a16a94","cyan":"#b5e4f4","white":"#a5a2a2","brightBlack":"#5c5855","brightRed":"#e8bbd0","brightGreen":"#3a3432","brightYellow":"#4a4543","brightBlue":"#807d7c","brightPurple":"#d6d5d4","brightCyan":"#cdab53","brightWhite":"#f7f7f7","background":"#090300","foreground":"#a5a2a2","cursorColor":"#a5a2a2","selectionBackground":"#4a4543","meta":{"isDark":true,"credits":[{"name":"0x3024","link":"https://github.com/0x3024"}]}},{"name":"Aardvark Blue","black":"#191919","red":"#aa342e","green":"#4b8c0f","yellow":"#dbba00","blue":"#1370d3","purple":"#c43ac3","cyan":"#008eb0","white":"#bebebe","brightBlack":"#454545","brightRed":"#f05b50","brightGreen":"#95dc55","brightYellow":"#ffe763","brightBlue":"#60a4ec","brightPurple":"#e26be2","brightCyan":"#60b6cb","brightWhite":"#f7f7f7","background":"#102040","foreground":"#dddddd","cursorColor":"#007acc","selectionBackground":"#bfdbfe","meta":{"isDark":true,"credits":null}},{"name":"Abernathy","black":"#000000","red":"#cd0000","green":"#00cd00","yellow":"#cdcd00","blue":"#1093f5","purple":"#cd00cd","cyan":"#00cdcd","white":"#faebd7","brightBlack":"#404040","brightRed":"#ff0000","brightGreen":"#00ff00","brightYellow":"#ffff00","brightBlue":"#11b5f6","brightPurple":"#ff00ff","brightCyan":"#00ffff","brightWhite":"#ffffff","background":"#111416","foreground":"#eeeeec","cursorColor":"#bbbbbb","selectionBackground":"#eeeeec","meta":{"isDark":true,"credits":null}},{"name":"Adventure","black":"#040404","red":"#d84a33","green":"#5da602","yellow":"#eebb6e","blue":"#417ab3","purple":"#e5c499","cyan":"#bdcfe5","white":"#dbded8","brightBlack":"#685656","brightRed":"#d76b42","brightGreen":"#99b52c","brightYellow":"#ffb670","brightBlue":"#97d7ef","brightPurple":"#aa7900","brightCyan":"#bdcfe5","brightWhite":"#e4d5c7","background":"#040404","foreground":"#feffff","cursorColor":"#feffff","selectionBackground":"#606060","meta":{"isDark":true,"credits":[{"name":"hongzimao","link":"https://github.com/hongzimao/iTerm2-Color-Schemes"}]}},{"name":"AdventureTime","black":"#050404","red":"#bd0013","green":"#4ab118","yellow":"#e7741e","blue":"#0f4ac6","purple":"#665993","cyan":"#70a598","white":"#f8dcc0","brightBlack":"#4e7cbf","brightRed":"#fc5f5a","brightGreen":"#9eff6e","brightYellow":"#efc11a","brightBlue":"#1997c6","brightPurple":"#9b5953","brightCyan":"#c8faf4","brightWhite":"#f6f5fb","background":"#1f1d45","foreground":"#f8dcc0","cursorColor":"#efbf38","selectionBackground":"#706b4e","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Afterglow","black":"#151515","red":"#ac4142","green":"#7e8e50","yellow":"#e5b567","blue":"#6c99bb","purple":"#9f4e85","cyan":"#7dd6cf","white":"#d0d0d0","brightBlack":"#505050","brightRed":"#ac4142","brightGreen":"#7e8e50","brightYellow":"#e5b567","brightBlue":"#6c99bb","brightPurple":"#9f4e85","brightCyan":"#7dd6cf","brightWhite":"#f5f5f5","background":"#212121","foreground":"#d0d0d0","cursorColor":"#d0d0d0","selectionBackground":"#303030","meta":{"isDark":true,"credits":[{"name":"yabatadesign","link":"https://github.com/YabataDesign/afterglow-itermcolors"}]}},{"name":"Alabaster","black":"#000000","red":"#aa3731","green":"#448c27","yellow":"#cb9000","blue":"#325cc0","purple":"#7a3e9d","cyan":"#0083b2","white":"#f7f7f7","brightBlack":"#777777","brightRed":"#f05050","brightGreen":"#60cb00","brightYellow":"#ffbc5d","brightBlue":"#007acc","brightPurple":"#e64ce6","brightCyan":"#00aacb","brightWhite":"#f7f7f7","background":"#f7f7f7","foreground":"#000000","cursorColor":"#007acc","selectionBackground":"#bfdbfe","meta":{"isDark":false,"credits":null}},{"name":"AlienBlood","black":"#112616","red":"#7f2b27","green":"#2f7e25","yellow":"#717f24","blue":"#2f6a7f","purple":"#47587f","cyan":"#327f77","white":"#647d75","brightBlack":"#3c4812","brightRed":"#e08009","brightGreen":"#18e000","brightYellow":"#bde000","brightBlue":"#00aae0","brightPurple":"#0058e0","brightCyan":"#00e0c4","brightWhite":"#73fa91","background":"#0f1610","foreground":"#637d75","cursorColor":"#73fa91","selectionBackground":"#1d4125","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Andromeda","black":"#000000","red":"#cd3131","green":"#05bc79","yellow":"#e5e512","blue":"#2472c8","purple":"#bc3fbc","cyan":"#0fa8cd","white":"#e5e5e5","brightBlack":"#666666","brightRed":"#cd3131","brightGreen":"#05bc79","brightYellow":"#e5e512","brightBlue":"#2472c8","brightPurple":"#bc3fbc","brightCyan":"#0fa8cd","brightWhite":"#e5e5e5","background":"#262a33","foreground":"#e5e5e5","cursorColor":"#f8f8f0","selectionBackground":"#5a5c62","meta":{"isDark":true,"credits":[{"name":"memije","link":"https://github.com/memije"},{"name":"EliverLara","link":"https://github.com/EliverLara/"}]}},{"name":"Apple Classic","black":"#000000","red":"#c91b00","green":"#00c200","yellow":"#c7c400","blue":"#0225c7","purple":"#ca30c7","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#ff77ff","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#2c2b2b","foreground":"#d5a200","cursorColor":"#c7c7c7","selectionBackground":"#6b5b02","meta":{"isDark":true,"credits":null}},{"name":"Apple System Colors","black":"#1a1a1a","red":"#cc372e","green":"#26a439","yellow":"#cdac08","blue":"#0869cb","purple":"#9647bf","cyan":"#479ec2","white":"#98989d","brightBlack":"#464646","brightRed":"#ff453a","brightGreen":"#32d74b","brightYellow":"#ffd60a","brightBlue":"#0a84ff","brightPurple":"#bf5af2","brightCyan":"#76d6ff","brightWhite":"#ffffff","background":"#1e1e1e","foreground":"#ffffff","cursorColor":"#98989d","selectionBackground":"#3f638b","meta":{"isDark":true,"credits":null}},{"name":"arcoiris","black":"#333333","red":"#da2700","green":"#12c258","yellow":"#ffc656","blue":"#518bfc","purple":"#e37bd9","cyan":"#63fad5","white":"#bab2b2","brightBlack":"#777777","brightRed":"#ffb9b9","brightGreen":"#e3f6aa","brightYellow":"#ffddaa","brightBlue":"#b3e8f3","brightPurple":"#cbbaf9","brightCyan":"#bcffc7","brightWhite":"#efefef","background":"#201f1e","foreground":"#eee4d9","cursorColor":"#7a1c1c","selectionBackground":"#25524a","meta":{"isDark":true,"credits":null}},{"name":"Argonaut","black":"#232323","red":"#ff000f","green":"#8ce10b","yellow":"#ffb900","blue":"#008df8","purple":"#6d43a6","cyan":"#00d8eb","white":"#ffffff","brightBlack":"#444444","brightRed":"#ff2740","brightGreen":"#abe15b","brightYellow":"#ffd242","brightBlue":"#0092ff","brightPurple":"#9a5feb","brightCyan":"#67fff0","brightWhite":"#ffffff","background":"#0e1019","foreground":"#fffaf4","cursorColor":"#ff0018","selectionBackground":"#002a3b","meta":{"isDark":true,"credits":[{"name":"effkay","link":"https://github.com/effkay/iTerm-argonaut"}]}},{"name":"Arthur","black":"#3d352a","red":"#cd5c5c","green":"#86af80","yellow":"#e8ae5b","blue":"#6495ed","purple":"#deb887","cyan":"#b0c4de","white":"#bbaa99","brightBlack":"#554444","brightRed":"#cc5533","brightGreen":"#88aa22","brightYellow":"#ffa75d","brightBlue":"#87ceeb","brightPurple":"#996600","brightCyan":"#b0c4de","brightWhite":"#ddccbb","background":"#1c1c1c","foreground":"#ddeedd","cursorColor":"#e2bbef","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"baskerville","link":"https://github.com/baskerville/iTerm-2-Color-Themes"}]}},{"name":"AtelierSulphurpool","black":"#202746","red":"#c94922","green":"#ac9739","yellow":"#c08b30","blue":"#3d8fd1","purple":"#6679cc","cyan":"#22a2c9","white":"#979db4","brightBlack":"#6b7394","brightRed":"#c76b29","brightGreen":"#293256","brightYellow":"#5e6687","brightBlue":"#898ea4","brightPurple":"#dfe2f1","brightCyan":"#9c637a","brightWhite":"#f5f7ff","background":"#202746","foreground":"#979db4","cursorColor":"#979db4","selectionBackground":"#5e6687","meta":{"isDark":true,"credits":[{"name":"atelierbram","link":"http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool/"}]}},{"name":"Atom","black":"#000000","red":"#fd5ff1","green":"#87c38a","yellow":"#ffd7b1","blue":"#85befd","purple":"#b9b6fc","cyan":"#85befd","white":"#e0e0e0","brightBlack":"#000000","brightRed":"#fd5ff1","brightGreen":"#94fa36","brightYellow":"#f5ffa8","brightBlue":"#96cbfe","brightPurple":"#b9b6fc","brightCyan":"#85befd","brightWhite":"#e0e0e0","background":"#161719","foreground":"#c5c8c6","cursorColor":"#d0d0d0","selectionBackground":"#444444","meta":{"isDark":true,"credits":[{"name":"bahlo","link":"https://github.com/bahlo/iterm-colors"}]}},{"name":"AtomOneLight","black":"#000000","red":"#de3e35","green":"#3f953a","yellow":"#d2b67c","blue":"#2f5af3","purple":"#950095","cyan":"#3f953a","white":"#bbbbbb","brightBlack":"#000000","brightRed":"#de3e35","brightGreen":"#3f953a","brightYellow":"#d2b67c","brightBlue":"#2f5af3","brightPurple":"#a00095","brightCyan":"#3f953a","brightWhite":"#ffffff","background":"#f9f9f9","foreground":"#2a2c33","cursorColor":"#bbbbbb","selectionBackground":"#ededed","meta":{"isDark":false,"credits":[{"name":"iamstarkov","link":"https://github.com/iamstarkov"}]}},{"name":"Aurora","black":"#23262e","red":"#f0266f","green":"#8fd46d","yellow":"#ffe66d","blue":"#0321d7","purple":"#ee5d43","cyan":"#03d6b8","white":"#c74ded","brightBlack":"#292e38","brightRed":"#f92672","brightGreen":"#8fd46d","brightYellow":"#ffe66d","brightBlue":"#03d6b8","brightPurple":"#ee5d43","brightCyan":"#03d6b8","brightWhite":"#c74ded","background":"#23262e","foreground":"#ffca28","cursorColor":"#ee5d43","selectionBackground":"#292e38","meta":{"isDark":true,"credits":[{"name":"fcsmJS","link":"https://github.com/fcsmJS/iTerm2-Color-Schemes"}]}},{"name":"ayu","black":"#000000","red":"#ff3333","green":"#b8cc52","yellow":"#e7c547","blue":"#36a3d9","purple":"#f07178","cyan":"#95e6cb","white":"#ffffff","brightBlack":"#323232","brightRed":"#ff6565","brightGreen":"#eafe84","brightYellow":"#fff779","brightBlue":"#68d5ff","brightPurple":"#ffa3aa","brightCyan":"#c7fffd","brightWhite":"#ffffff","background":"#0f1419","foreground":"#e6e1cf","cursorColor":"#f29718","selectionBackground":"#253340","meta":{"isDark":true,"credits":[{"name":"alebcay","link":"https://github.com/alebcay"}]}},{"name":"Ayu Mirage","black":"#191e2a","red":"#ed8274","green":"#a6cc70","yellow":"#fad07b","blue":"#6dcbfa","purple":"#cfbafa","cyan":"#90e1c6","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#f28779","brightGreen":"#bae67e","brightYellow":"#ffd580","brightBlue":"#73d0ff","brightPurple":"#d4bfff","brightCyan":"#95e6cb","brightWhite":"#ffffff","background":"#1f2430","foreground":"#cbccc6","cursorColor":"#ffcc66","selectionBackground":"#33415e","meta":{"isDark":true,"credits":null}},{"name":"ayu_light","black":"#000000","red":"#ff3333","green":"#86b300","yellow":"#f29718","blue":"#41a6d9","purple":"#f07178","cyan":"#4dbf99","white":"#ffffff","brightBlack":"#323232","brightRed":"#ff6565","brightGreen":"#b8e532","brightYellow":"#ffc94a","brightBlue":"#73d8ff","brightPurple":"#ffa3aa","brightCyan":"#7ff1cb","brightWhite":"#ffffff","background":"#fafafa","foreground":"#5c6773","cursorColor":"#ff6a00","selectionBackground":"#f0eee4","meta":{"isDark":false,"credits":[{"name":"alebcay","link":"https://github.com/alebcay"}]}},{"name":"Banana Blueberry","black":"#17141f","red":"#ff6b7f","green":"#00bd9c","yellow":"#e6c62f","blue":"#22e8df","purple":"#dc396a","cyan":"#56b6c2","white":"#f1f1f1","brightBlack":"#495162","brightRed":"#fe9ea1","brightGreen":"#98c379","brightYellow":"#f9e46b","brightBlue":"#91fff4","brightPurple":"#da70d6","brightCyan":"#bcf3ff","brightWhite":"#ffffff","background":"#191323","foreground":"#cccccc","cursorColor":"#e07d13","selectionBackground":"#220525","meta":{"isDark":true,"credits":[{"name":"ReagentX","link":"https://github.com/ReagentX"}]}},{"name":"Batman","black":"#1b1d1e","red":"#e6dc44","green":"#c8be46","yellow":"#f4fd22","blue":"#737174","purple":"#747271","cyan":"#62605f","white":"#c6c5bf","brightBlack":"#505354","brightRed":"#fff78e","brightGreen":"#fff27d","brightYellow":"#feed6c","brightBlue":"#919495","brightPurple":"#9a9a9d","brightCyan":"#a3a3a6","brightWhite":"#dadbd6","background":"#1b1d1e","foreground":"#6f6f6f","cursorColor":"#fcef0c","selectionBackground":"#4d504c","meta":{"isDark":true,"credits":[{"name":"pyrophos","link":"https://github.com/pyrophos"}]}},{"name":"Belafonte Day","black":"#20111b","red":"#be100e","green":"#858162","yellow":"#eaa549","blue":"#426a79","purple":"#97522c","cyan":"#989a9c","white":"#968c83","brightBlack":"#5e5252","brightRed":"#be100e","brightGreen":"#858162","brightYellow":"#eaa549","brightBlue":"#426a79","brightPurple":"#97522c","brightCyan":"#989a9c","brightWhite":"#d5ccba","background":"#d5ccba","foreground":"#45373c","cursorColor":"#45373c","selectionBackground":"#968c83","meta":{"isDark":false,"credits":[{"name":"idleberg","link":"https://github.com/idleberg"}]}},{"name":"Belafonte Night","black":"#20111b","red":"#be100e","green":"#858162","yellow":"#eaa549","blue":"#426a79","purple":"#97522c","cyan":"#989a9c","white":"#968c83","brightBlack":"#5e5252","brightRed":"#be100e","brightGreen":"#858162","brightYellow":"#eaa549","brightBlue":"#426a79","brightPurple":"#97522c","brightCyan":"#989a9c","brightWhite":"#d5ccba","background":"#20111b","foreground":"#968c83","cursorColor":"#968c83","selectionBackground":"#45373c","meta":{"isDark":true,"credits":[{"name":"idleberg","link":"https://github.com/idleberg"}]}},{"name":"BirdsOfParadise","black":"#573d26","red":"#be2d26","green":"#6ba18a","yellow":"#e99d2a","blue":"#5a86ad","purple":"#ac80a6","cyan":"#74a6ad","white":"#e0dbb7","brightBlack":"#9b6c4a","brightRed":"#e84627","brightGreen":"#95d8ba","brightYellow":"#d0d150","brightBlue":"#b8d3ed","brightPurple":"#d19ecb","brightCyan":"#93cfd7","brightWhite":"#fff9d5","background":"#2a1f1d","foreground":"#e0dbb7","cursorColor":"#573d26","selectionBackground":"#563c27","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Blazer","black":"#000000","red":"#b87a7a","green":"#7ab87a","yellow":"#b8b87a","blue":"#7a7ab8","purple":"#b87ab8","cyan":"#7ab8b8","white":"#d9d9d9","brightBlack":"#262626","brightRed":"#dbbdbd","brightGreen":"#bddbbd","brightYellow":"#dbdbbd","brightBlue":"#bdbddb","brightPurple":"#dbbddb","brightCyan":"#bddbdb","brightWhite":"#ffffff","background":"#0d1926","foreground":"#d9e6f2","cursorColor":"#d9e6f2","selectionBackground":"#c1ddff","meta":{"isDark":true,"credits":null}},{"name":"Blue Matrix","black":"#101116","red":"#ff5680","green":"#00ff9c","yellow":"#fffc58","blue":"#00b0ff","purple":"#d57bff","cyan":"#76c1ff","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#d682ec","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#101116","foreground":"#00a2ff","cursorColor":"#76ff9f","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":[{"name":"ReagentX","link":"https://github.com/ReagentX"}]}},{"name":"BlueBerryPie","black":"#0a4c62","red":"#99246e","green":"#5cb1b3","yellow":"#eab9a8","blue":"#90a5bd","purple":"#9d54a7","cyan":"#7e83cc","white":"#f0e8d6","brightBlack":"#201637","brightRed":"#c87272","brightGreen":"#0a6c7e","brightYellow":"#7a3188","brightBlue":"#39173d","brightPurple":"#bc94b7","brightCyan":"#5e6071","brightWhite":"#0a6c7e","background":"#1c0c28","foreground":"#babab9","cursorColor":"#fcfad6","selectionBackground":"#606060","meta":{"isDark":true,"credits":[{"name":"murmurlilia","link":"https://www.instagram.com/the.julias"},{"name":"fitz123","link":"https://github.com/fitz123"}]}},{"name":"BlueDolphin","black":"#292d3e","red":"#ff8288","green":"#b4e88d","yellow":"#f4d69f","blue":"#82aaff","purple":"#e9c1ff","cyan":"#89ebff","white":"#d0d0d0","brightBlack":"#434758","brightRed":"#ff8b92","brightGreen":"#ddffa7","brightYellow":"#ffe585","brightBlue":"#9cc4ff","brightPurple":"#ddb0f6","brightCyan":"#a3f7ff","brightWhite":"#ffffff","background":"#006984","foreground":"#c5f2ff","cursorColor":"#ffcc00","selectionBackground":"#2baeca","meta":{"isDark":true,"credits":null}},{"name":"BlulocoDark","black":"#41444d","red":"#fc2f52","green":"#25a45c","yellow":"#ff936a","blue":"#3476ff","purple":"#7a82da","cyan":"#4483aa","white":"#cdd4e0","brightBlack":"#8f9aae","brightRed":"#ff6480","brightGreen":"#3fc56b","brightYellow":"#f9c859","brightBlue":"#10b1fe","brightPurple":"#ff78f8","brightCyan":"#5fb9bc","brightWhite":"#ffffff","background":"#282c34","foreground":"#b9c0cb","cursorColor":"#ffcc00","selectionBackground":"#b9c0ca","meta":{"isDark":true,"credits":null}},{"name":"BlulocoLight","black":"#373a41","red":"#d52753","green":"#23974a","yellow":"#df631c","blue":"#275fe4","purple":"#823ff1","cyan":"#27618d","white":"#babbc2","brightBlack":"#676a77","brightRed":"#ff6480","brightGreen":"#3cbc66","brightYellow":"#c5a332","brightBlue":"#0099e1","brightPurple":"#ce33c0","brightCyan":"#6d93bb","brightWhite":"#d3d3d3","background":"#f9f9f9","foreground":"#373a41","cursorColor":"#f32759","selectionBackground":"#daf0ff","meta":{"isDark":false,"credits":null}},{"name":"Borland","black":"#4f4f4f","red":"#ff6c60","green":"#a8ff60","yellow":"#ffffb6","blue":"#96cbfe","purple":"#ff73fd","cyan":"#c6c5fe","white":"#eeeeee","brightBlack":"#7c7c7c","brightRed":"#ffb6b0","brightGreen":"#ceffac","brightYellow":"#ffffcc","brightBlue":"#b5dcff","brightPurple":"#ff9cfe","brightCyan":"#dfdffe","brightWhite":"#ffffff","background":"#0000a4","foreground":"#ffff4e","cursorColor":"#ffa560","selectionBackground":"#a4a4a4","meta":{"isDark":true,"credits":[{"name":"delip","link":"https://gist.github.com/delip/9e16c606d9331d69d681"}]}},{"name":"Breeze","black":"#31363b","red":"#ed1515","green":"#11d116","yellow":"#f67400","blue":"#1d99f3","purple":"#9b59b6","cyan":"#1abc9c","white":"#eff0f1","brightBlack":"#7f8c8d","brightRed":"#c0392b","brightGreen":"#1cdc9a","brightYellow":"#fdbc4b","brightBlue":"#3daee9","brightPurple":"#8e44ad","brightCyan":"#16a085","brightWhite":"#fcfcfc","background":"#31363b","foreground":"#eff0f1","cursorColor":"#eff0f1","selectionBackground":"#eff0f1","meta":{"isDark":true,"credits":[{"name":"KDE","link":"https://kde.org"},{"name":"nieltg","link":"https://github.com/nieltg"}]}},{"name":"Bright Lights","black":"#191919","red":"#ff355b","green":"#b7e876","yellow":"#ffc251","blue":"#76d4ff","purple":"#ba76e7","cyan":"#6cbfb5","white":"#c2c8d7","brightBlack":"#191919","brightRed":"#ff355b","brightGreen":"#b7e876","brightYellow":"#ffc251","brightBlue":"#76d5ff","brightPurple":"#ba76e7","brightCyan":"#6cbfb5","brightWhite":"#c2c8d7","background":"#191919","foreground":"#b3c9d7","cursorColor":"#f34b00","selectionBackground":"#b3c9d7","meta":{"isDark":true,"credits":[{"name":"tw15egan","link":"https://github.com/tw15egan"}]}},{"name":"Broadcast","black":"#000000","red":"#da4939","green":"#519f50","yellow":"#ffd24a","blue":"#6d9cbe","purple":"#d0d0ff","cyan":"#6e9cbe","white":"#ffffff","brightBlack":"#323232","brightRed":"#ff7b6b","brightGreen":"#83d182","brightYellow":"#ffff7c","brightBlue":"#9fcef0","brightPurple":"#ffffff","brightCyan":"#a0cef0","brightWhite":"#ffffff","background":"#2b2b2b","foreground":"#e6e1dc","cursorColor":"#ffffff","selectionBackground":"#5a647e","meta":{"isDark":true,"credits":[{"name":"vinkla","link":"https://github.com/vinkla/broadcast-theme"}]}},{"name":"Brogrammer","black":"#1f1f1f","red":"#f81118","green":"#2dc55e","yellow":"#ecba0f","blue":"#2a84d2","purple":"#4e5ab7","cyan":"#1081d6","white":"#d6dbe5","brightBlack":"#d6dbe5","brightRed":"#de352e","brightGreen":"#1dd361","brightYellow":"#f3bd09","brightBlue":"#1081d6","brightPurple":"#5350b9","brightCyan":"#0f7ddb","brightWhite":"#ffffff","background":"#131313","foreground":"#d6dbe5","cursorColor":"#b9b9b9","selectionBackground":"#1f1f1f","meta":{"isDark":true,"credits":[{"name":"bahlo","link":"https://github.com/bahlo/iterm-colors"}]}},{"name":"Bubbles","background":"#161D38","black":"#000000","blue":"#589DF6","brightBlack":"#555555","brightBlue":"#589DF6","brightCyan":"#3979BC","brightGreen":"#35BB9A","brightPurple":"#E75699","brightRed":"#FA8C8F","brightWhite":"#FFFFFF","brightYellow":"#FFFF55","cursorColor":"#BBBBBB","cyan":"#1F9EE7","foreground":"#FFFFFF","green":"#21B089","purple":"#944D95","red":"#F9555F","selectionBackground":"#B5D5FF","white":"#BBBBBB","yellow":"#FEF02A","meta":{"isDark":true,"credits":[{"name":"jos3s","link":"https://github.com/jos3s"}]}},{"name":"Builtin Dark","black":"#000000","red":"#bb0000","green":"#00bb00","yellow":"#bbbb00","blue":"#0000bb","purple":"#bb00bb","cyan":"#00bbbb","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#000000","foreground":"#bbbbbb","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":null}},{"name":"Builtin Light","black":"#000000","red":"#bb0000","green":"#00bb00","yellow":"#bbbb00","blue":"#0000bb","purple":"#bb00bb","cyan":"#00bbbb","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#b5d5ff","meta":{"isDark":false,"credits":null}},{"name":"Builtin Pastel Dark","black":"#4f4f4f","red":"#ff6c60","green":"#a8ff60","yellow":"#ffffb6","blue":"#96cbfe","purple":"#ff73fd","cyan":"#c6c5fe","white":"#eeeeee","brightBlack":"#7c7c7c","brightRed":"#ffb6b0","brightGreen":"#ceffac","brightYellow":"#ffffcc","brightBlue":"#b5dcff","brightPurple":"#ff9cfe","brightCyan":"#dfdffe","brightWhite":"#ffffff","background":"#000000","foreground":"#bbbbbb","cursorColor":"#ffa560","selectionBackground":"#363983","meta":{"isDark":true,"credits":null}},{"name":"Builtin Solarized Dark","black":"#073642","red":"#dc322f","green":"#859900","yellow":"#b58900","blue":"#268bd2","purple":"#d33682","cyan":"#2aa198","white":"#eee8d5","brightBlack":"#002b36","brightRed":"#cb4b16","brightGreen":"#586e75","brightYellow":"#657b83","brightBlue":"#839496","brightPurple":"#6c71c4","brightCyan":"#93a1a1","brightWhite":"#fdf6e3","background":"#002b36","foreground":"#839496","cursorColor":"#839496","selectionBackground":"#073642","meta":{"isDark":true,"credits":[{"name":"Solarized web site","link":"http://ethanschoonover.com/solarized"}]}},{"name":"Builtin Solarized Light","black":"#073642","red":"#dc322f","green":"#859900","yellow":"#b58900","blue":"#268bd2","purple":"#d33682","cyan":"#2aa198","white":"#eee8d5","brightBlack":"#002b36","brightRed":"#cb4b16","brightGreen":"#586e75","brightYellow":"#657b83","brightBlue":"#839496","brightPurple":"#6c71c4","brightCyan":"#93a1a1","brightWhite":"#fdf6e3","background":"#fdf6e3","foreground":"#657b83","cursorColor":"#657b83","selectionBackground":"#eee8d5","meta":{"isDark":false,"credits":[{"name":"Solarized web site","link":"http://ethanschoonover.com/solarized"}]}},{"name":"Builtin Tango Dark","black":"#000000","red":"#cc0000","green":"#4e9a06","yellow":"#c4a000","blue":"#3465a4","purple":"#75507b","cyan":"#06989a","white":"#d3d7cf","brightBlack":"#555753","brightRed":"#ef2929","brightGreen":"#8ae234","brightYellow":"#fce94f","brightBlue":"#729fcf","brightPurple":"#ad7fa8","brightCyan":"#34e2e2","brightWhite":"#eeeeec","background":"#000000","foreground":"#ffffff","cursorColor":"#ffffff","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":null}},{"name":"Builtin Tango Light","black":"#000000","red":"#cc0000","green":"#4e9a06","yellow":"#c4a000","blue":"#3465a4","purple":"#75507b","cyan":"#06989a","white":"#d3d7cf","brightBlack":"#555753","brightRed":"#ef2929","brightGreen":"#8ae234","brightYellow":"#fce94f","brightBlue":"#729fcf","brightPurple":"#ad7fa8","brightCyan":"#34e2e2","brightWhite":"#eeeeec","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#b5d5ff","meta":{"isDark":false,"credits":null}},{"name":"C64","black":"#090300","red":"#883932","green":"#55a049","yellow":"#bfce72","blue":"#40318d","purple":"#8b3f96","cyan":"#67b6bd","white":"#ffffff","brightBlack":"#000000","brightRed":"#883932","brightGreen":"#55a049","brightYellow":"#bfce72","brightBlue":"#40318d","brightPurple":"#8b3f96","brightCyan":"#67b6bd","brightWhite":"#f7f7f7","background":"#40318d","foreground":"#7869c4","cursorColor":"#7869c4","selectionBackground":"#7869c4","meta":{"isDark":true,"credits":[{"name":"idleberg","link":"https://github.com/idleberg"}]}},{"name":"Calamity","black":"#2f2833","red":"#fc644d","green":"#a5f69c","yellow":"#e9d7a5","blue":"#3b79c7","purple":"#f92672","cyan":"#74d3de","white":"#d5ced9","brightBlack":"#7e6c88","brightRed":"#fc644d","brightGreen":"#a5f69c","brightYellow":"#e9d7a5","brightBlue":"#3b79c7","brightPurple":"#f92672","brightCyan":"#74d3de","brightWhite":"#ffffff","background":"#2f2833","foreground":"#d5ced9","cursorColor":"#d5ced9","selectionBackground":"#7e6c88","meta":{"isDark":true,"credits":[{"name":"Pustur","link":"https://github.com/Pustur"}]}},{"name":"Catppuccin Frappe","black":"#51576d","red":"#e78284","green":"#a6d189","yellow":"#e5c890","blue":"#8caaee","purple":"#f4b8e4","cyan":"#81c8be","white":"#b5bfe2","brightBlack":"#626880","brightRed":"#e78284","brightGreen":"#a6d189","brightYellow":"#e5c890","brightBlue":"#8caaee","brightPurple":"#f4b8e4","brightCyan":"#81c8be","brightWhite":"#a5adce","background":"#303446","foreground":"#c6d0f5","selectionBackground":"#626880","cursorColor":"#f2d5cf","meta":{"isDark":true,"credits":null}},{"name":"Catppuccin Latte","black":"#5c5f77","red":"#d20f39","green":"#40a02b","yellow":"#df8e1d","blue":"#1e66f5","purple":"#ea76cb","cyan":"#179299","white":"#acb0be","brightBlack":"#6c6f85","brightRed":"#d20f39","brightGreen":"#40a02b","brightYellow":"#df8e1d","brightBlue":"#1e66f5","brightPurple":"#ea76cb","brightCyan":"#179299","brightWhite":"#bcc0cc","background":"#eff1f5","foreground":"#4c4f69","selectionBackground":"#acb0be","cursorColor":"#dc8a78","meta":{"isDark":false,"credits":null}},{"name":"Catppuccin Macchiato","black":"#494d64","red":"#ed8796","green":"#a6da95","yellow":"#eed49f","blue":"#8aadf4","purple":"#f5bde6","cyan":"#8bd5ca","white":"#b8c0e0","brightBlack":"#5b6078","brightRed":"#ed8796","brightGreen":"#a6da95","brightYellow":"#eed49f","brightBlue":"#8aadf4","brightPurple":"#f5bde6","brightCyan":"#8bd5ca","brightWhite":"#b8c0e0","background":"#24273a","foreground":"#cad3f5","selectionBackground":"#5b6078","cursorColor":"#f4dbd6","meta":{"isDark":true,"credits":null}},{"name":"Catppuccin Mocha","black":"#45475a","red":"#f38ba8","green":"#a6e3a1","yellow":"#f9e2af","blue":"#89b4fa","purple":"#f5c2e7","cyan":"#94e2d5","white":"#bac2de","brightBlack":"#585b70","brightRed":"#f38ba8","brightGreen":"#a6e3a1","brightYellow":"#f9e2af","brightBlue":"#89b4fa","brightPurple":"#f5c2e7","brightCyan":"#94e2d5","brightWhite":"#a6adc8","background":"#1e1e2e","foreground":"#cdd6f4","selectionBackground":"#585b70","cursorColor":"#f5e0dc","meta":{"isDark":true,"credits":null}},{"name":"catppuccin-frappe","black":"#51576d","red":"#e78284","green":"#a6d189","yellow":"#e5c890","blue":"#8caaee","purple":"#f4b8e4","cyan":"#81c8be","white":"#b5bfe2","brightBlack":"#626880","brightRed":"#e78284","brightGreen":"#a6d189","brightYellow":"#e5c890","brightBlue":"#8caaee","brightPurple":"#f4b8e4","brightCyan":"#81c8be","brightWhite":"#a5adce","background":"#303446","foreground":"#c6d0f5","cursorColor":"#f2d5cf","selectionBackground":"#626880","meta":{"isDark":true,"credits":null}},{"name":"catppuccin-latte","black":"#5c5f77","red":"#d20f39","green":"#40a02b","yellow":"#df8e1d","blue":"#1e66f5","purple":"#ea76cb","cyan":"#179299","white":"#acb0be","brightBlack":"#6c6f85","brightRed":"#d20f39","brightGreen":"#40a02b","brightYellow":"#df8e1d","brightBlue":"#1e66f5","brightPurple":"#ea76cb","brightCyan":"#179299","brightWhite":"#bcc0cc","background":"#eff1f5","foreground":"#4c4f69","cursorColor":"#dc8a78","selectionBackground":"#acb0be","meta":{"isDark":false,"credits":null}},{"name":"catppuccin-macchiato","black":"#494d64","red":"#ed8796","green":"#a6da95","yellow":"#eed49f","blue":"#8aadf4","purple":"#f5bde6","cyan":"#8bd5ca","white":"#b8c0e0","brightBlack":"#5b6078","brightRed":"#ed8796","brightGreen":"#a6da95","brightYellow":"#eed49f","brightBlue":"#8aadf4","brightPurple":"#f5bde6","brightCyan":"#8bd5ca","brightWhite":"#a5adcb","background":"#24273a","foreground":"#cad3f5","cursorColor":"#f4dbd6","selectionBackground":"#5b6078","meta":{"isDark":true,"credits":null}},{"name":"catppuccin-mocha","black":"#45475a","red":"#f38ba8","green":"#a6e3a1","yellow":"#f9e2af","blue":"#89b4fa","purple":"#f5c2e7","cyan":"#94e2d5","white":"#bac2de","brightBlack":"#585b70","brightRed":"#f38ba8","brightGreen":"#a6e3a1","brightYellow":"#f9e2af","brightBlue":"#89b4fa","brightPurple":"#f5c2e7","brightCyan":"#94e2d5","brightWhite":"#a6adc8","background":"#1e1e2e","foreground":"#cdd6f4","cursorColor":"#f5e0dc","selectionBackground":"#585b70","meta":{"isDark":true,"credits":null}},{"name":"CGA","black":"#000000","red":"#aa0000","green":"#00aa00","yellow":"#aa5500","blue":"#0000aa","purple":"#aa00aa","cyan":"#00aaaa","white":"#aaaaaa","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#000000","foreground":"#aaaaaa","cursorColor":"#b8b8b8","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":null}},{"name":"Chalk","black":"#7d8b8f","red":"#b23a52","green":"#789b6a","yellow":"#b9ac4a","blue":"#2a7fac","purple":"#bd4f5a","cyan":"#44a799","white":"#d2d8d9","brightBlack":"#888888","brightRed":"#f24840","brightGreen":"#80c470","brightYellow":"#ffeb62","brightBlue":"#4196ff","brightPurple":"#fc5275","brightCyan":"#53cdbd","brightWhite":"#d2d8d9","background":"#2b2d2e","foreground":"#d2d8d9","cursorColor":"#708284","selectionBackground":"#e4e8ed","meta":{"isDark":true,"credits":[{"name":"achalv","link":"https://github.com/achalv/chalk"}]}},{"name":"Chalkboard","black":"#000000","red":"#c37372","green":"#72c373","yellow":"#c2c372","blue":"#7372c3","purple":"#c372c2","cyan":"#72c2c3","white":"#d9d9d9","brightBlack":"#323232","brightRed":"#dbaaaa","brightGreen":"#aadbaa","brightYellow":"#dadbaa","brightBlue":"#aaaadb","brightPurple":"#dbaada","brightCyan":"#aadadb","brightWhite":"#ffffff","background":"#29262f","foreground":"#d9e6f2","cursorColor":"#d9e6f2","selectionBackground":"#073642","meta":{"isDark":true,"credits":null}},{"name":"ChallengerDeep","black":"#141228","red":"#ff5458","green":"#62d196","yellow":"#ffb378","blue":"#65b2ff","purple":"#906cff","cyan":"#63f2f1","white":"#a6b3cc","brightBlack":"#565575","brightRed":"#ff8080","brightGreen":"#95ffa4","brightYellow":"#ffe9aa","brightBlue":"#91ddff","brightPurple":"#c991e1","brightCyan":"#aaffe4","brightWhite":"#cbe3e7","background":"#1e1c31","foreground":"#cbe1e7","cursorColor":"#fbfcfc","selectionBackground":"#cbe1e7","meta":{"isDark":true,"credits":[{"name":"challenger-deep-theme","link":"https://github.com/challenger-deep-theme/vim"},{"name":"eendroroy","link":"https://github.com/eendroroy"}]}},{"name":"Chester","black":"#080200","red":"#fa5e5b","green":"#16c98d","yellow":"#ffc83f","blue":"#288ad6","purple":"#d34590","cyan":"#28ddde","white":"#e7e7e7","brightBlack":"#6f6b68","brightRed":"#fa5e5b","brightGreen":"#16c98d","brightYellow":"#feef6d","brightBlue":"#278ad6","brightPurple":"#d34590","brightCyan":"#27dede","brightWhite":"#ffffff","background":"#2c3643","foreground":"#ffffff","cursorColor":"#b4b1b1","selectionBackground":"#67747c","meta":{"isDark":true,"credits":[{"name":"KH","link":"https://github.com/spectralkh"}]}},{"name":"Ciapre","black":"#181818","red":"#810009","green":"#48513b","yellow":"#cc8b3f","blue":"#576d8c","purple":"#724d7c","cyan":"#5c4f4b","white":"#aea47f","brightBlack":"#555555","brightRed":"#ac3835","brightGreen":"#a6a75d","brightYellow":"#dcdf7c","brightBlue":"#3097c6","brightPurple":"#d33061","brightCyan":"#f3dbb2","brightWhite":"#f4f4f4","background":"#191c27","foreground":"#aea47a","cursorColor":"#92805b","selectionBackground":"#172539","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"CLRS","black":"#000000","red":"#f8282a","green":"#328a5d","yellow":"#fa701d","blue":"#135cd0","purple":"#9f00bd","cyan":"#33c3c1","white":"#b3b3b3","brightBlack":"#555753","brightRed":"#fb0416","brightGreen":"#2cc631","brightYellow":"#fdd727","brightBlue":"#1670ff","brightPurple":"#e900b0","brightCyan":"#3ad5ce","brightWhite":"#eeeeec","background":"#ffffff","foreground":"#262626","cursorColor":"#6fd3fc","selectionBackground":"#6fd3fc","meta":{"isDark":false,"credits":[{"name":"jasonlong","link":"https://github.com/jasonlong/iterm-clrs"}]}},{"name":"Cobalt Neon","black":"#142631","red":"#ff2320","green":"#3ba5ff","yellow":"#e9e75c","blue":"#8ff586","purple":"#781aa0","cyan":"#8ff586","white":"#ba46b2","brightBlack":"#fff688","brightRed":"#d4312e","brightGreen":"#8ff586","brightYellow":"#e9f06d","brightBlue":"#3c7dd2","brightPurple":"#8230a7","brightCyan":"#6cbc67","brightWhite":"#8ff586","background":"#142838","foreground":"#8ff586","cursorColor":"#c4206f","selectionBackground":"#094fb1","meta":{"isDark":true,"credits":[{"name":"vazquez","link":"https://github.com/vazquez/cobalt-neon-iterm"}]}},{"name":"Cobalt2","black":"#000000","red":"#ff0000","green":"#38de21","yellow":"#ffe50a","blue":"#1460d2","purple":"#ff005d","cyan":"#00bbbb","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#f40e17","brightGreen":"#3bd01d","brightYellow":"#edc809","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#6ae3fa","brightWhite":"#ffffff","background":"#132738","foreground":"#ffffff","cursorColor":"#f0cc09","selectionBackground":"#18354f","meta":{"isDark":true,"credits":[{"name":"wesbos","link":"https://github.com/wesbos/Cobalt2-iterm"}]}},{"name":"coffee_theme","black":"#000000","red":"#c91b00","green":"#00c200","yellow":"#c7c400","blue":"#0225c7","purple":"#ca30c7","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#ff77ff","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#f5deb3","foreground":"#000000","cursorColor":"#c7c7c7","selectionBackground":"#c1deff","meta":{"isDark":false,"credits":[{"name":"cbitterfield","link":"https://github.com/cbitterfield"}]}},{"background":"#FFFFFF","black":"#2E1742","blue":"#0D6BAD","brightBlack":"#462366","brightBlue":"#008CCC","brightCyan":"#46D1E0","brightGreen":"#99C252","brightPurple":"#AF87FF","brightRed":"#FF0000","brightWhite":"#FFFFFF","brightYellow":"#A39B46","cursorColor":"#000000","cyan":"#41C2D0","foreground":"#051840","green":"#77B01B","name":"Contrast Light","purple":"#8700FF","red":"#BF0000","selectionBackground":"#B5D5FF","white":"#E6E6E6","yellow":"#857E39","meta":{"isDark":false,"credits":null}},{"background":"#010C18","black":"#0B3B61","blue":"#1376F9","brightBlack":"#63686D","brightBlue":"#388EFF","brightCyan":"#FF6AD7","brightGreen":"#74FFD8","brightPurple":"#AE81FF","brightRed":"#FF54B0","brightWhite":"#60FBBF","brightYellow":"#FCF5AE","cursorColor":"#38FF9D","cyan":"#FF5ED4","foreground":"#ECDEF4","green":"#52FFD0","name":"coolnight","purple":"#C792EA","red":"#FF3A3A","selectionBackground":"#38FF9C","white":"#16FDA2","yellow":"#FFF383","meta":{"isDark":true,"credits":null}},{"name":"CrayonPonyFish","black":"#2b1b1d","red":"#91002b","green":"#579524","yellow":"#ab311b","blue":"#8c87b0","purple":"#692f50","cyan":"#e8a866","white":"#68525a","brightBlack":"#3d2b2e","brightRed":"#c5255d","brightGreen":"#8dff57","brightYellow":"#c8381d","brightBlue":"#cfc9ff","brightPurple":"#fc6cba","brightCyan":"#ffceaf","brightWhite":"#b0949d","background":"#150707","foreground":"#68525a","cursorColor":"#68525a","selectionBackground":"#2b1b1d","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"background":"#1E1423","black":"#0A0A14","blue":"#5050E6","brightBlack":"#363B54","brightBlue":"#7AA2F7","brightCyan":"#7DCFFF","brightGreen":"#41A6B5","brightPurple":"#BB9AF7","brightRed":"#F7768E","brightWhite":"#ACB0D0","brightYellow":"#E0AF68","cursorColor":"#2DB9E6","cyan":"#2DB9E6","foreground":"#737DA0","green":"#32CD87","name":"Crystal Violet","purple":"#6E14EB","red":"#E63232","selectionBackground":"#5050E6","white":"#D2D2D2","yellow":"#EBA041","meta":{"isDark":true,"credits":null}},{"name":"CutiePro","black":"#000000","red":"#f56e7f","green":"#bec975","yellow":"#f58669","blue":"#42d9c5","purple":"#d286b7","cyan":"#37cb8a","white":"#d5c3c3","brightBlack":"#88847f","brightRed":"#e5a1a3","brightGreen":"#e8d6a7","brightYellow":"#f1bb79","brightBlue":"#80c5de","brightPurple":"#b294bb","brightCyan":"#9dccbb","brightWhite":"#ffffff","background":"#181818","foreground":"#d5d0c9","cursorColor":"#efc4cd","selectionBackground":"#363636","meta":{"isDark":true,"credits":null}},{"background":"#161C2B","black":"#141D2B","blue":"#2E6CFF","brightBlack":"#767676","brightBlue":"#5CB2FF","brightCyan":"#5CECC6","brightGreen":"#C5F467","brightPurple":"#CF8DFB","brightRed":"#FF8484","brightWhite":"#D5DAFF","brightYellow":"#FFCC5C","cursorColor":"#C5D1EB","cyan":"#2DE2B2","foreground":"#A4B1CD","green":"#9FEF00","name":"Cyber Cube","purple":"#9F00FF","red":"#FF3E3E","selectionBackground":"#C5D1EB","white":"#D5E0FF","yellow":"#FFAF00","meta":{"isDark":true,"credits":null}},{"name":"Cyberdyne","black":"#080808","red":"#ff8373","green":"#00c172","yellow":"#d2a700","blue":"#0071cf","purple":"#ff90fe","cyan":"#6bffdd","white":"#f1f1f1","brightBlack":"#2e2e2e","brightRed":"#ffc4be","brightGreen":"#d6fcba","brightYellow":"#fffed5","brightBlue":"#c2e3ff","brightPurple":"#ffb2fe","brightCyan":"#e6e7fe","brightWhite":"#ffffff","background":"#151144","foreground":"#00ff92","cursorColor":"#00ff9c","selectionBackground":"#454d96","meta":{"isDark":true,"credits":[{"name":"ReagentX","link":"https://github.com/ReagentX"}]}},{"name":"cyberpunk","black":"#000000","red":"#ff7092","green":"#00fbac","yellow":"#fffa6a","blue":"#00bfff","purple":"#df95ff","cyan":"#86cbfe","white":"#ffffff","brightBlack":"#000000","brightRed":"#ff8aa4","brightGreen":"#21f6bc","brightYellow":"#fff787","brightBlue":"#1bccfd","brightPurple":"#e6aefe","brightCyan":"#99d6fc","brightWhite":"#ffffff","background":"#332a57","foreground":"#e5e5e5","cursorColor":"#21f6bc","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":[{"name":"Murderlon","link":"https://github.com/Murderlon/cyberpunk-iterm"}]}},{"name":"CyberPunk2077","background":"#272932","black":"#272932","blue":"#9381FF","brightBlack":"#7b8097","brightBlue":"#37EBF3","brightCyan":"#37EBF3","brightGreen":"#40FFE9","brightPurple":"#CB1DCD","brightRed":"#C71515","brightWhite":"#C1DEFF","brightYellow":"#fff955","cursorColor":"#FDF500","cyan":"#00D0DB","foreground":"#E455AE","green":"#1AC5B0","purple":"#742D8B","red":"#710000","selectionBackground":"#742D8B","white":"#D1C5C0","yellow":"#FDF500","meta":{"isDark":true,"credits":null}},{"name":"Dark Pastel","black":"#000000","red":"#ff5555","green":"#55ff55","yellow":"#ffff55","blue":"#5555ff","purple":"#ff55ff","cyan":"#55ffff","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#000000","foreground":"#ffffff","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":null}},{"name":"Dark+","black":"#000000","red":"#cd3131","green":"#0dbc79","yellow":"#e5e510","blue":"#2472c8","purple":"#bc3fbc","cyan":"#11a8cd","white":"#e5e5e5","brightBlack":"#666666","brightRed":"#f14c4c","brightGreen":"#23d18b","brightYellow":"#f5f543","brightBlue":"#3b8eea","brightPurple":"#d670d6","brightCyan":"#29b8db","brightWhite":"#e5e5e5","background":"#1e1e1e","foreground":"#cccccc","cursorColor":"#ffffff","selectionBackground":"#3a3d41","meta":{"isDark":true,"credits":null}},{"name":"darkermatrix","black":"#091013","red":"#002e18","green":"#6fa64c","yellow":"#595900","blue":"#00cb6b","purple":"#412a4d","cyan":"#125459","white":"#002e19","brightBlack":"#333333","brightRed":"#00381d","brightGreen":"#90d762","brightYellow":"#e2e500","brightBlue":"#00ff87","brightPurple":"#412a4d","brightCyan":"#176c73","brightWhite":"#00381e","background":"#070c0e","foreground":"#28380d","cursorColor":"#373a26","selectionBackground":"#0f191c","meta":{"isDark":true,"credits":null}},{"name":"darkmatrix","black":"#091013","red":"#006536","green":"#6fa64c","yellow":"#7e8000","blue":"#2c9a84","purple":"#452d53","cyan":"#114d53","white":"#006536","brightBlack":"#333333","brightRed":"#00733d","brightGreen":"#90d762","brightYellow":"#e2e500","brightBlue":"#46d8b8","brightPurple":"#4a3059","brightCyan":"#12545a","brightWhite":"#006536","background":"#070c0e","foreground":"#3e5715","cursorColor":"#9fa86e","selectionBackground":"#0f191c","meta":{"isDark":true,"credits":null}},{"name":"Darkside","black":"#000000","red":"#e8341c","green":"#68c256","yellow":"#f2d42c","blue":"#1c98e8","purple":"#8e69c9","cyan":"#1c98e8","white":"#bababa","brightBlack":"#000000","brightRed":"#e05a4f","brightGreen":"#77b869","brightYellow":"#efd64b","brightBlue":"#387cd3","brightPurple":"#957bbe","brightCyan":"#3d97e2","brightWhite":"#bababa","background":"#222324","foreground":"#bababa","cursorColor":"#bbbbbb","selectionBackground":"#303333","meta":{"isDark":true,"credits":[{"name":"bahlo","link":"https://github.com/bahlo/iterm-colors"}]}},{"name":"dayfox","black":"#352c24","red":"#a5222f","green":"#396847","yellow":"#ac5402","blue":"#2848a9","purple":"#6e33ce","cyan":"#287980","white":"#f2e9e1","brightBlack":"#534c45","brightRed":"#b3434e","brightGreen":"#577f63","brightYellow":"#b86e28","brightBlue":"#4863b6","brightPurple":"#8452d5","brightCyan":"#488d93","brightWhite":"#f4ece6","background":"#f6f2ee","foreground":"#3d2b5a","cursorColor":"#3d2b5a","selectionBackground":"#e7d2be","meta":{"isDark":false,"credits":null}},{"name":"deep","black":"#000000","red":"#d70005","green":"#1cd915","yellow":"#d9bd26","blue":"#5665ff","purple":"#b052da","cyan":"#50d2da","white":"#e0e0e0","brightBlack":"#535353","brightRed":"#fb0007","brightGreen":"#22ff18","brightYellow":"#fedc2b","brightBlue":"#9fa9ff","brightPurple":"#e09aff","brightCyan":"#8df9ff","brightWhite":"#ffffff","background":"#090909","foreground":"#cdcdcd","cursorColor":"#d0d0d0","selectionBackground":"#780002","meta":{"isDark":true,"credits":[{"name":"ADoyle","link":"https://github.com/adoyle-h"}]}},{"name":"Desert","black":"#4d4d4d","red":"#ff2b2b","green":"#98fb98","yellow":"#f0e68c","blue":"#cd853f","purple":"#ffdead","cyan":"#ffa0a0","white":"#f5deb3","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#87ceff","brightPurple":"#ff55ff","brightCyan":"#ffd700","brightWhite":"#ffffff","background":"#333333","foreground":"#ffffff","cursorColor":"#00ff00","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":null}},{"name":"DimmedMonokai","black":"#3a3d43","red":"#be3f48","green":"#879a3b","yellow":"#c5a635","blue":"#4f76a1","purple":"#855c8d","cyan":"#578fa4","white":"#b9bcba","brightBlack":"#888987","brightRed":"#fb001f","brightGreen":"#0f722f","brightYellow":"#c47033","brightBlue":"#186de3","brightPurple":"#fb0067","brightCyan":"#2e706d","brightWhite":"#fdffb9","background":"#1f1f1f","foreground":"#b9bcba","cursorColor":"#f83e19","selectionBackground":"#2a2d32","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Django","black":"#000000","red":"#fd6209","green":"#41a83e","yellow":"#ffe862","blue":"#245032","purple":"#f8f8f8","cyan":"#9df39f","white":"#ffffff","brightBlack":"#323232","brightRed":"#ff943b","brightGreen":"#73da70","brightYellow":"#ffff94","brightBlue":"#568264","brightPurple":"#ffffff","brightCyan":"#cfffd1","brightWhite":"#ffffff","background":"#0b2f20","foreground":"#f8f8f8","cursorColor":"#336442","selectionBackground":"#245032","meta":{"isDark":true,"credits":[{"name":"Jannis Leidel","link":"https://code.djangoproject.com/wiki/TextMate"},{"name":"threespot.com","link":"https://threespot.com"}]}},{"name":"DjangoRebornAgain","black":"#000000","red":"#fd6209","green":"#41a83e","yellow":"#ffe862","blue":"#245032","purple":"#f8f8f8","cyan":"#9df39f","white":"#ffffff","brightBlack":"#323232","brightRed":"#ff943b","brightGreen":"#73da70","brightYellow":"#ffff94","brightBlue":"#568264","brightPurple":"#ffffff","brightCyan":"#cfffd1","brightWhite":"#ffffff","background":"#051f14","foreground":"#dadedc","cursorColor":"#ffcc00","selectionBackground":"#203727","meta":{"isDark":true,"credits":[{"name":"christopherscott","link":"https://github.com/christopherscott/django-reborn"},{"name":"Jannis Leidel","link":"https://code.djangoproject.com/wiki/TextMate"}]}},{"name":"DjangoSmooth","black":"#000000","red":"#fd6209","green":"#41a83e","yellow":"#ffe862","blue":"#989898","purple":"#f8f8f8","cyan":"#9df39f","white":"#e8e8e7","brightBlack":"#323232","brightRed":"#ff943b","brightGreen":"#73da70","brightYellow":"#ffff94","brightBlue":"#cacaca","brightPurple":"#ffffff","brightCyan":"#cfffd1","brightWhite":"#ffffff","background":"#245032","foreground":"#f8f8f8","cursorColor":"#336442","selectionBackground":"#336442","meta":{"isDark":true,"credits":[{"name":"Jannis Leidel","link":"https://code.djangoproject.com/wiki/TextMate"},{"name":"threespot.com","link":"https://threespot.com"}]}},{"name":"Doom Peacock","black":"#1c1f24","red":"#cb4b16","green":"#26a6a6","yellow":"#bcd42a","blue":"#2a6cc6","purple":"#a9a1e1","cyan":"#5699af","white":"#ede0ce","brightBlack":"#2b2a27","brightRed":"#ff5d38","brightGreen":"#98be65","brightYellow":"#e6f972","brightBlue":"#51afef","brightPurple":"#c678dd","brightCyan":"#46d9ff","brightWhite":"#dfdfdf","background":"#2b2a27","foreground":"#ede0ce","cursorColor":"#9c9c9d","selectionBackground":"#a60033","meta":{"isDark":true,"credits":[{"name":"Emacs Doom Peacock theme","link":"https://github.com/hlissner/emacs-doom-themes"}]}},{"name":"DoomOne","black":"#000000","red":"#ff6c6b","green":"#98be65","yellow":"#ecbe7b","blue":"#a9a1e1","purple":"#c678dd","cyan":"#51afef","white":"#bbc2cf","brightBlack":"#000000","brightRed":"#ff6655","brightGreen":"#99bb66","brightYellow":"#ecbe7b","brightBlue":"#a9a1e1","brightPurple":"#c678dd","brightCyan":"#51afef","brightWhite":"#bfbfbf","background":"#282c34","foreground":"#bbc2cf","cursorColor":"#51afef","selectionBackground":"#42444b","meta":{"isDark":true,"credits":[{"name":"Emacs Doom default theme","link":"https://github.com/hlissner/emacs-doom-themes"}]}},{"name":"DotGov","black":"#191919","red":"#bf091d","green":"#3d9751","yellow":"#f6bb34","blue":"#17b2e0","purple":"#7830b0","cyan":"#8bd2ed","white":"#ffffff","brightBlack":"#191919","brightRed":"#bf091d","brightGreen":"#3d9751","brightYellow":"#f6bb34","brightBlue":"#17b2e0","brightPurple":"#7830b0","brightCyan":"#8bd2ed","brightWhite":"#ffffff","background":"#262c35","foreground":"#ebebeb","cursorColor":"#d9002f","selectionBackground":"#1a4080","meta":{"isDark":true,"credits":[{"name":"U.S. Web Design Standards","link":"https://standards.usa.gov/visual-style/"}]}},{"name":"Dracula","black":"#000000","red":"#ff5555","green":"#50fa7b","yellow":"#f1fa8c","blue":"#bd93f9","purple":"#ff79c6","cyan":"#8be9fd","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#50fa7b","brightYellow":"#f1fa8c","brightBlue":"#bd93f9","brightPurple":"#ff79c6","brightCyan":"#8be9fd","brightWhite":"#ffffff","background":"#1e1f29","foreground":"#f8f8f2","cursorColor":"#bbbbbb","selectionBackground":"#44475a","meta":{"isDark":true,"credits":[{"name":"zenorocha","link":"https://github.com/zenorocha/dracula-theme"}]}},{"name":"Dracula+","black":"#21222c","red":"#ff5555","green":"#50fa7b","yellow":"#ffcb6b","blue":"#82aaff","purple":"#c792ea","cyan":"#8be9fd","white":"#f8f8f2","brightBlack":"#545454","brightRed":"#ff6e6e","brightGreen":"#69ff94","brightYellow":"#ffcb6b","brightBlue":"#d6acff","brightPurple":"#ff92df","brightCyan":"#a4ffff","brightWhite":"#f8f8f2","background":"#212121","foreground":"#f8f8f2","cursorColor":"#eceff4","selectionBackground":"#f8f8f2","meta":{"isDark":true,"credits":[{"name":"zenorocha","link":"https://github.com/zenorocha/dracula-theme"}]}},{"name":"DraculaPlus","background":"#212121","black":"#21222C","blue":"#82aaff","cyan":"#8BE9FD","foreground":"#F8F8F2","green":"#50FA7B","purple":"#c792ea","red":"#FF5555","white":"#F8F8F2","yellow":"#ffcb6b","brightBlack":"#545454","brightBlue":"#D6ACFF","brightCyan":"#A4FFFF","brightGreen":"#69FF94","brightPurple":"#FF92DF","brightRed":"#FF6E6E","brightWhite":"#F8F8F2","brightYellow":"#ffcb6b","meta":{"isDark":true,"credits":[{"name":"jos3s","link":"https://github.com/jos3s"}]}},{"name":"duckbones","black":"#0e101a","red":"#e03600","green":"#5dcd97","yellow":"#e39500","blue":"#00a3cb","purple":"#795ccc","cyan":"#00a3cb","white":"#ebefc0","brightBlack":"#2b2f46","brightRed":"#ff4821","brightGreen":"#58db9e","brightYellow":"#f6a100","brightBlue":"#00b4e0","brightPurple":"#b3a1e6","brightCyan":"#00b4e0","brightWhite":"#b3b692","background":"#0e101a","foreground":"#ebefc0","cursorColor":"#edf2c2","selectionBackground":"#37382d","meta":{"isDark":true,"credits":null}},{"name":"Duotone Dark","black":"#1f1d27","red":"#d9393e","green":"#2dcd73","yellow":"#d9b76e","blue":"#ffc284","purple":"#de8d40","cyan":"#2488ff","white":"#b7a1ff","brightBlack":"#353147","brightRed":"#d9393e","brightGreen":"#2dcd73","brightYellow":"#d9b76e","brightBlue":"#ffc284","brightPurple":"#de8d40","brightCyan":"#2488ff","brightWhite":"#eae5ff","background":"#1f1d27","foreground":"#b7a1ff","cursorColor":"#ff9839","selectionBackground":"#353147","meta":{"isDark":true,"credits":[{"name":"chibicode","link":"http://chibicode.com"},{"name":"simurai","link":"https://github.com/simurai"}]}},{"name":"Earthsong","black":"#121418","red":"#c94234","green":"#85c54c","yellow":"#f5ae2e","blue":"#1398b9","purple":"#d0633d","cyan":"#509552","white":"#e5c6aa","brightBlack":"#675f54","brightRed":"#ff645a","brightGreen":"#98e036","brightYellow":"#e0d561","brightBlue":"#5fdaff","brightPurple":"#ff9269","brightCyan":"#84f088","brightWhite":"#f6f7ec","background":"#292520","foreground":"#e5c7a9","cursorColor":"#f6f7ec","selectionBackground":"#121418","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Elemental","black":"#3c3c30","red":"#98290f","green":"#479a43","yellow":"#7f7111","blue":"#497f7d","purple":"#7f4e2f","cyan":"#387f58","white":"#807974","brightBlack":"#555445","brightRed":"#e0502a","brightGreen":"#61e070","brightYellow":"#d69927","brightBlue":"#79d9d9","brightPurple":"#cd7c54","brightCyan":"#59d599","brightWhite":"#fff1e9","background":"#22211d","foreground":"#807a74","cursorColor":"#facb80","selectionBackground":"#413829","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Elementary","black":"#242424","red":"#d71c15","green":"#5aa513","yellow":"#fdb40c","blue":"#063b8c","purple":"#e40038","cyan":"#2595e1","white":"#efefef","brightBlack":"#4b4b4b","brightRed":"#fc1c18","brightGreen":"#6bc219","brightYellow":"#fec80e","brightBlue":"#0955ff","brightPurple":"#fb0050","brightCyan":"#3ea8fc","brightWhite":"#8c00ec","background":"#181818","foreground":"#efefef","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"elementary.io","link":"https://elementary.io/"},{"name":"987poiuytrewq","link":"https://github.com/987poiuytrewq"}]}},{"name":"ENCOM","black":"#000000","red":"#9f0000","green":"#008b00","yellow":"#ffd000","blue":"#0081ff","purple":"#bc00ca","cyan":"#008b8b","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff0000","brightGreen":"#00ee00","brightYellow":"#ffff00","brightBlue":"#0000ff","brightPurple":"#ff00ff","brightCyan":"#00cdcd","brightWhite":"#ffffff","background":"#000000","foreground":"#00a595","cursorColor":"#bbbbbb","selectionBackground":"#00a48c","meta":{"isDark":true,"credits":[{"name":"Josh Braun","link":"http://wideaperture.net"}]}},{"name":"Espresso","black":"#353535","red":"#d25252","green":"#a5c261","yellow":"#ffc66d","blue":"#6c99bb","purple":"#d197d9","cyan":"#bed6ff","white":"#eeeeec","brightBlack":"#535353","brightRed":"#f00c0c","brightGreen":"#c2e075","brightYellow":"#e1e48b","brightBlue":"#8ab7d9","brightPurple":"#efb5f7","brightCyan":"#dcf4ff","brightWhite":"#ffffff","background":"#323232","foreground":"#ffffff","cursorColor":"#d6d6d6","selectionBackground":"#5b5b5b","meta":{"isDark":true,"credits":null}},{"name":"Espresso Libre","black":"#000000","red":"#cc0000","green":"#1a921c","yellow":"#f0e53a","blue":"#0066ff","purple":"#c5656b","cyan":"#06989a","white":"#d3d7cf","brightBlack":"#555753","brightRed":"#ef2929","brightGreen":"#9aff87","brightYellow":"#fffb5c","brightBlue":"#43a8ed","brightPurple":"#ff818a","brightCyan":"#34e2e2","brightWhite":"#eeeeec","background":"#2a211c","foreground":"#b8a898","cursorColor":"#ffffff","selectionBackground":"#c3dcff","meta":{"isDark":true,"credits":[{"name":"jurgemaister","link":"https://github.com/jurgemaister/Espresso-Libre"}]}},{"name":"Everblush","black":"#232a2d","red":"#e57474","green":"#8ccf7e","yellow":"#e5c76b","blue":"#67b0e8","purple":"#c47fd5","cyan":"#6cbfbf","white":"#b3b9b8","brightBlack":"#2d3437","brightRed":"#ef7e7e","brightGreen":"#96d988","brightYellow":"#f4d67a","brightBlue":"#71baf2","brightPurple":"#ce89df","brightCyan":"#67cbe7","brightWhite":"#bdc3c2","background":"#141b1e","foreground":"#dadada","cursorColor":"#dadada","selectionBackground":"#141b1e","meta":{"isDark":true,"credits":null}},{"name":"Fahrenheit","black":"#1d1d1d","red":"#cda074","green":"#9e744d","yellow":"#fecf75","blue":"#720102","purple":"#734c4d","cyan":"#979797","white":"#ffffce","brightBlack":"#000000","brightRed":"#fecea0","brightGreen":"#cc734d","brightYellow":"#fd9f4d","brightBlue":"#cb4a05","brightPurple":"#4e739f","brightCyan":"#fed04d","brightWhite":"#ffffff","background":"#000000","foreground":"#ffffce","cursorColor":"#bbbbbb","selectionBackground":"#4e739f","meta":{"isDark":true,"credits":[{"name":"jonascarpay","link":"https://github.com/jonascarpay"},{"name":"fcpg","link":"https://github.com/fcpg"}]}},{"name":"Fairyfloss","black":"#040303","red":"#f92672","green":"#c2ffdf","yellow":"#e6c000","blue":"#c2ffdf","purple":"#ffb8d1","cyan":"#c5a3ff","white":"#f8f8f0","brightBlack":"#6090cb","brightRed":"#ff857f","brightGreen":"#c2ffdf","brightYellow":"#ffea00","brightBlue":"#c2ffdf","brightPurple":"#ffb8d1","brightCyan":"#c5a3ff","brightWhite":"#f8f8f0","background":"#5a5475","foreground":"#f8f8f2","cursorColor":"#f8f8f0","selectionBackground":"#8077a8","meta":{"isDark":true,"credits":null}},{"name":"farmhouse-dark","black":"#1d2027","red":"#ba0004","green":"#549d00","yellow":"#c87300","blue":"#0049e6","purple":"#9f1b61","cyan":"#1fb65c","white":"#e8e4e1","brightBlack":"#394047","brightRed":"#eb0009","brightGreen":"#7ac100","brightYellow":"#ea9a00","brightBlue":"#006efe","brightPurple":"#bf3b7f","brightCyan":"#19e062","brightWhite":"#f4eef0","background":"#1d2027","foreground":"#e8e4e1","cursorColor":"#006efe","selectionBackground":"#4d5658","meta":{"isDark":true,"credits":null}},{"name":"farmhouse-light","black":"#1d2027","red":"#8d0003","green":"#3a7d00","yellow":"#a95600","blue":"#092ccd","purple":"#820046","cyan":"#229256","white":"#e8e4e1","brightBlack":"#394047","brightRed":"#eb0009","brightGreen":"#7ac100","brightYellow":"#ea9a00","brightBlue":"#006efe","brightPurple":"#bf3b7f","brightCyan":"#19e062","brightWhite":"#f4eef0","background":"#e8e4e1","foreground":"#1d2027","cursorColor":"#006efe","selectionBackground":"#b3b1aa","meta":{"isDark":false,"credits":null}},{"name":"Fideloper","black":"#292f33","red":"#cb1e2d","green":"#edb8ac","yellow":"#b7ab9b","blue":"#2e78c2","purple":"#c0236f","cyan":"#309186","white":"#eae3ce","brightBlack":"#092028","brightRed":"#d4605a","brightGreen":"#d4605a","brightYellow":"#a86671","brightBlue":"#7c85c4","brightPurple":"#5c5db2","brightCyan":"#819090","brightWhite":"#fcf4df","background":"#292f33","foreground":"#dbdae0","cursorColor":"#d4605a","selectionBackground":"#efb8ac","meta":{"isDark":true,"credits":[{"name":"Fideloper","link":"http://fideloper.com/"}]}},{"name":"Firefly Traditional","black":"#000000","red":"#c23720","green":"#33bc26","yellow":"#afad24","blue":"#5a63ff","purple":"#d53ad2","cyan":"#33bbc7","white":"#cccccc","brightBlack":"#828282","brightRed":"#ff3b1e","brightGreen":"#2ee720","brightYellow":"#ecec16","brightBlue":"#838dff","brightPurple":"#ff5cfe","brightCyan":"#29f0f0","brightWhite":"#ebebeb","background":"#000000","foreground":"#f5f5f5","cursorColor":"#00f900","selectionBackground":"#cfeac6","meta":{"isDark":true,"credits":null}},{"name":"FirefoxDev","black":"#002831","red":"#e63853","green":"#5eb83c","yellow":"#a57706","blue":"#359ddf","purple":"#d75cff","cyan":"#4b73a2","white":"#dcdcdc","brightBlack":"#001e27","brightRed":"#e1003f","brightGreen":"#1d9000","brightYellow":"#cd9409","brightBlue":"#006fc0","brightPurple":"#a200da","brightCyan":"#005794","brightWhite":"#e2e2e2","background":"#0e1011","foreground":"#7c8fa4","cursorColor":"#708284","selectionBackground":"#163c61","meta":{"isDark":true,"credits":[{"name":"Or3stis","link":"https://github.com/Or3stis"}]}},{"name":"Firewatch","black":"#585f6d","red":"#d95360","green":"#5ab977","yellow":"#dfb563","blue":"#4d89c4","purple":"#d55119","cyan":"#44a8b6","white":"#e6e5ff","brightBlack":"#585f6d","brightRed":"#d95360","brightGreen":"#5ab977","brightYellow":"#dfb563","brightBlue":"#4c89c5","brightPurple":"#d55119","brightCyan":"#44a8b6","brightWhite":"#e6e5ff","background":"#1e2027","foreground":"#9ba2b2","cursorColor":"#f6f7ec","selectionBackground":"#2f363e","meta":{"isDark":true,"credits":[{"name":"Sebastian Szturo","link":"https://github.com/SebastianSzturo"},{"name":"Ben Styles","link":"https://github.com/leeds-ebooks"},{"name":"Firewatch game","link":"http://www.firewatchgame.com/"}]}},{"name":"FishTank","black":"#03073c","red":"#c6004a","green":"#acf157","yellow":"#fecd5e","blue":"#525fb8","purple":"#986f82","cyan":"#968763","white":"#ecf0fc","brightBlack":"#6c5b30","brightRed":"#da4b8a","brightGreen":"#dbffa9","brightYellow":"#fee6a9","brightBlue":"#b2befa","brightPurple":"#fda5cd","brightCyan":"#a5bd86","brightWhite":"#f6ffec","background":"#232537","foreground":"#ecf0fe","cursorColor":"#fecd5e","selectionBackground":"#fcf7e9","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Flat","black":"#222d3f","red":"#a82320","green":"#32a548","yellow":"#e58d11","blue":"#3167ac","purple":"#781aa0","cyan":"#2c9370","white":"#b0b6ba","brightBlack":"#212c3c","brightRed":"#d4312e","brightGreen":"#2d9440","brightYellow":"#e5be0c","brightBlue":"#3c7dd2","brightPurple":"#8230a7","brightCyan":"#35b387","brightWhite":"#e7eced","background":"#002240","foreground":"#2cc55d","cursorColor":"#e5be0c","selectionBackground":"#792b9c","meta":{"isDark":true,"credits":[{"name":"ahmetsulek","link":"https://github.com/ahmetsulek/flat-terminal"}]}},{"name":"Flatland","black":"#1d1d19","red":"#f18339","green":"#9fd364","yellow":"#f4ef6d","blue":"#5096be","purple":"#695abc","cyan":"#d63865","white":"#ffffff","brightBlack":"#1d1d19","brightRed":"#d22a24","brightGreen":"#a7d42c","brightYellow":"#ff8949","brightBlue":"#61b9d0","brightPurple":"#695abc","brightCyan":"#d63865","brightWhite":"#ffffff","background":"#1d1f21","foreground":"#b8dbef","cursorColor":"#708284","selectionBackground":"#2b2a24","meta":{"isDark":true,"credits":[{"name":"realchaseadams","link":"http://www.snip2code.com/Snippet/148193/Flatland-color-scheme-for-iTerm2"}]}},{"name":"flexoki-dark","black":"#1c1b1a","red":"#d14d41","green":"#879a39","yellow":"#d0a215","blue":"#4385be","purple":"#ce5d97","cyan":"#3aa99f","white":"#b7b5ac","brightBlack":"#575653","brightRed":"#d14d41","brightGreen":"#879a39","brightYellow":"#d0a215","brightBlue":"#4385be","brightPurple":"#ce5d97","brightCyan":"#3aa99f","brightWhite":"#cecdc3","background":"#1c1b1a","foreground":"#cecdc3","cursorColor":"#cecdc3","selectionBackground":"#cecdc3","meta":{"isDark":true,"credits":null}},{"name":"flexoki-light","black":"#100f0f","red":"#af3029","green":"#66800b","yellow":"#ad8301","blue":"#205ea6","purple":"#a02f6f","cyan":"#24837b","white":"#f2f0e5","brightBlack":"#575653","brightRed":"#d14d41","brightGreen":"#879a39","brightYellow":"#d0a215","brightBlue":"#4385be","brightPurple":"#ce5d97","brightCyan":"#3aa99f","brightWhite":"#fffcf0","background":"#fffcf0","foreground":"#100f0f","cursorColor":"#100f0f","selectionBackground":"#cecdc3","meta":{"isDark":false,"credits":null}},{"name":"Floraverse","black":"#08002e","red":"#64002c","green":"#5d731a","yellow":"#cd751c","blue":"#1d6da1","purple":"#b7077e","cyan":"#42a38c","white":"#f3e0b8","brightBlack":"#331e4d","brightRed":"#d02063","brightGreen":"#b4ce59","brightYellow":"#fac357","brightBlue":"#40a4cf","brightPurple":"#f12aae","brightCyan":"#62caa8","brightWhite":"#fff5db","background":"#0e0d15","foreground":"#dbd1b9","cursorColor":"#bbbbbb","selectionBackground":"#f3e0b8","meta":{"isDark":true,"credits":[{"name":"papayakitty","link":"http://floraverse.com/"}]}},{"name":"ForestBlue","black":"#333333","red":"#f8818e","green":"#92d3a2","yellow":"#1a8e63","blue":"#8ed0ce","purple":"#5e468c","cyan":"#31658c","white":"#e2d8cd","brightBlack":"#3d3d3d","brightRed":"#fb3d66","brightGreen":"#6bb48d","brightYellow":"#30c85a","brightBlue":"#39a7a2","brightPurple":"#7e62b3","brightCyan":"#6096bf","brightWhite":"#e2d8cd","background":"#051519","foreground":"#e2d8cd","cursorColor":"#9e9ecb","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"olkinn","link":"https://github.com/olkinn/forest-blue-iTerm"}]}},{"name":"Framer","black":"#141414","red":"#ff5555","green":"#98ec65","yellow":"#ffcc33","blue":"#00aaff","purple":"#aa88ff","cyan":"#88ddff","white":"#cccccc","brightBlack":"#414141","brightRed":"#ff8888","brightGreen":"#b6f292","brightYellow":"#ffd966","brightBlue":"#33bbff","brightPurple":"#cebbff","brightCyan":"#bbecff","brightWhite":"#ffffff","background":"#111111","foreground":"#777777","cursorColor":"#fcdc08","selectionBackground":"#666666","meta":{"isDark":true,"credits":[{"name":"markogresak","link":"https://github.com/markogresak"},{"name":"Framer","link":"https://framer.com"}]}},{"name":"FrontEndDelight","black":"#242526","red":"#f8511b","green":"#565747","yellow":"#fa771d","blue":"#2c70b7","purple":"#f02e4f","cyan":"#3ca1a6","white":"#adadad","brightBlack":"#5fac6d","brightRed":"#f74319","brightGreen":"#74ec4c","brightYellow":"#fdc325","brightBlue":"#3393ca","brightPurple":"#e75e4f","brightCyan":"#4fbce6","brightWhite":"#8c735b","background":"#1b1c1d","foreground":"#adadad","cursorColor":"#cdcdcd","selectionBackground":"#ea6154","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"FunForrest","black":"#000000","red":"#d6262b","green":"#919c00","yellow":"#be8a13","blue":"#4699a3","purple":"#8d4331","cyan":"#da8213","white":"#ddc265","brightBlack":"#7f6a55","brightRed":"#e55a1c","brightGreen":"#bfc65a","brightYellow":"#ffcb1b","brightBlue":"#7cc9cf","brightPurple":"#d26349","brightCyan":"#e6a96b","brightWhite":"#ffeaa3","background":"#251200","foreground":"#dec165","cursorColor":"#e5591c","selectionBackground":"#e5591c","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Galaxy","black":"#000000","red":"#f9555f","green":"#21b089","yellow":"#fef02a","blue":"#589df6","purple":"#944d95","cyan":"#1f9ee7","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#fa8c8f","brightGreen":"#35bb9a","brightYellow":"#ffff55","brightBlue":"#589df6","brightPurple":"#e75699","brightCyan":"#3979bc","brightWhite":"#ffffff","background":"#1d2837","foreground":"#ffffff","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"jglovier","link":"https://github.com/jglovier/galaxy-theme-iterm"}]}},{"name":"Galizur","black":"#223344","red":"#aa1122","green":"#33aa11","yellow":"#ccaa22","blue":"#2255cc","purple":"#7755aa","cyan":"#22bbdd","white":"#8899aa","brightBlack":"#556677","brightRed":"#ff1133","brightGreen":"#33ff11","brightYellow":"#ffdd33","brightBlue":"#3377ff","brightPurple":"#aa77ff","brightCyan":"#33ddff","brightWhite":"#bbccdd","background":"#071317","foreground":"#ddeeff","cursorColor":"#ddeeff","selectionBackground":"#071317","meta":{"isDark":true,"credits":[{"name":"Raziel Anarki","link":"https://github.com/razielanarki"}]}},{"name":"Ganyu","cursorColor":"#AC5487","background":"#221b2f","foreground":"#5055C2","selectionBackground":"#d7c6a4","black":"#12061B","brightBlack":"#322a51","blue":"#5256c3","brightBlue":"#9aa8dd","cyan":"#2aadb3","brightCyan":"#7ce7d8","green":"#c7e18d","brightGreen":"#b4f42c","purple":"#ddb2ff","brightPurple":"#9681ed","red":"#E06C75","brightRed":"#a5313d","white":"#ecebea","brightWhite":"#f3f3f3","yellow":"#f8b433","brightYellow":"#f1d661","meta":{"isDark":true,"credits":[{"name":"resyfer","link":"https://github.com/resyfer"}]}},{"name":"Github","black":"#3e3e3e","red":"#970b16","green":"#07962a","yellow":"#f8eec7","blue":"#003e8a","purple":"#e94691","cyan":"#89d1ec","white":"#ffffff","brightBlack":"#666666","brightRed":"#de0000","brightGreen":"#87d5a2","brightYellow":"#f1d007","brightBlue":"#2e6cba","brightPurple":"#ffa29f","brightCyan":"#1cfafe","brightWhite":"#ffffff","background":"#f4f4f4","foreground":"#3e3e3e","cursorColor":"#3f3f3f","selectionBackground":"#a9c1e2","meta":{"isDark":false,"credits":[{"name":"Github","link":"https://github.com/"}]}},{"name":"GitHub Dark","black":"#000000","red":"#f78166","green":"#56d364","yellow":"#e3b341","blue":"#6ca4f8","purple":"#db61a2","cyan":"#2b7489","white":"#ffffff","brightBlack":"#4d4d4d","brightRed":"#f78166","brightGreen":"#56d364","brightYellow":"#e3b341","brightBlue":"#6ca4f8","brightPurple":"#db61a2","brightCyan":"#2b7489","brightWhite":"#ffffff","background":"#101216","foreground":"#8b949e","cursorColor":"#c9d1d9","selectionBackground":"#3b5070","meta":{"isDark":true,"credits":null}},{"name":"Glacier","black":"#2e343c","red":"#bd0f2f","green":"#35a770","yellow":"#fb9435","blue":"#1f5872","purple":"#bd2523","cyan":"#778397","white":"#ffffff","brightBlack":"#404a55","brightRed":"#bd0f2f","brightGreen":"#49e998","brightYellow":"#fddf6e","brightBlue":"#2a8bc1","brightPurple":"#ea4727","brightCyan":"#a0b6d3","brightWhite":"#ffffff","background":"#0c1115","foreground":"#ffffff","cursorColor":"#6c6c6c","selectionBackground":"#bd2523","meta":{"isDark":true,"credits":[{"name":"bahlo","link":"https://github.com/bahlo/iterm-colors"}]}},{"name":"Glorious","black":"#1e1e1e","red":"#be0f17","green":"#868715","yellow":"#cc881a","blue":"#16777a","purple":"#a04b73","cyan":"#578e57","white":"#978771","brightBlack":"#7f7061","brightRed":"#f73028","brightGreen":"#d5d5d7","brightYellow":"#f7b125","brightBlue":"#4e917c","brightPurple":"#c77089","brightCyan":"#7db669","brightWhite":"#e6d4a3","background":"#201d27","foreground":"#c8c8c9","meta":{"isDark":true,"credits":[{"name":"alex","link":"https://github.com/AlexMailo"}]}},{"name":"Grape","black":"#2d283f","red":"#ed2261","green":"#1fa91b","yellow":"#8ddc20","blue":"#487df4","purple":"#8d35c9","cyan":"#3bdeed","white":"#9e9ea0","brightBlack":"#59516a","brightRed":"#f0729a","brightGreen":"#53aa5e","brightYellow":"#b2dc87","brightBlue":"#a9bcec","brightPurple":"#ad81c2","brightCyan":"#9de3eb","brightWhite":"#a288f7","background":"#171423","foreground":"#9f9fa1","cursorColor":"#a288f7","selectionBackground":"#493d70","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Grass","black":"#000000","red":"#bb0000","green":"#00bb00","yellow":"#e7b000","blue":"#0000a3","purple":"#950062","cyan":"#00bbbb","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#bb0000","brightGreen":"#00bb00","brightYellow":"#e7b000","brightBlue":"#0000bb","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#13773d","foreground":"#fff0a5","cursorColor":"#8c2800","selectionBackground":"#b64926","meta":{"isDark":true,"credits":null}},{"name":"Grey-green","black":"#000000","red":"#fe1414","green":"#74ff00","yellow":"#f1ff01","blue":"#00deff","purple":"#ff00f0","cyan":"#00ffbc","white":"#ffffff","brightBlack":"#666666","brightRed":"#ff3939","brightGreen":"#00ff44","brightYellow":"#ffd100","brightBlue":"#00afff","brightPurple":"#ff008a","brightCyan":"#00ffd3","brightWhite":"#f5ecec","background":"#002a1a","foreground":"#ffffff","cursorColor":"#fff400","selectionBackground":"#517e50","meta":{"isDark":true,"credits":null}},{"name":"Gruvbox Light","black":"#fbf1c7","red":"#9d0006","green":"#79740e","yellow":"#b57614","blue":"#076678","purple":"#8f3f71","cyan":"#427b58","white":"#3c3836","brightBlack":"#9d8374","brightRed":"#cc241d","brightGreen":"#98971a","brightYellow":"#d79921","brightBlue":"#458588","brightPurple":"#b16186","brightCyan":"#689d69","brightWhite":"#7c6f64","background":"#fbf1c7","foreground":"#282828","cursorColor":"#282828","selectionBackground":"#d5c4a1","meta":{"isDark":false,"credits":[{"name":"morhetz","link":"https://github.com/morhetz"},{"name":"reynn","link":"https://github.com/reynn"}]}},{"name":"GruvboxDark","black":"#282828","red":"#cc241d","green":"#98971a","yellow":"#d79921","blue":"#458588","purple":"#b16286","cyan":"#689d6a","white":"#a89984","brightBlack":"#928374","brightRed":"#fb4934","brightGreen":"#b8bb26","brightYellow":"#fabd2f","brightBlue":"#83a598","brightPurple":"#d3869b","brightCyan":"#8ec07c","brightWhite":"#ebdbb2","background":"#282828","foreground":"#ebdbb2","cursorColor":"#ebdbb2","selectionBackground":"#665c54","meta":{"isDark":true,"credits":null}},{"name":"GruvboxDarkHard","black":"#1b1b1b","red":"#cc241d","green":"#98971a","yellow":"#d79921","blue":"#458588","purple":"#b16286","cyan":"#689d6a","white":"#a89984","brightBlack":"#928374","brightRed":"#fb4934","brightGreen":"#b8bb26","brightYellow":"#fabd2f","brightBlue":"#83a598","brightPurple":"#d3869b","brightCyan":"#8ec07c","brightWhite":"#ebdbb2","background":"#1b1b1b","foreground":"#ebdbb2","cursorColor":"#ebdbb2","selectionBackground":"#665c54","meta":{"isDark":true,"credits":null}},{"name":"GruvboxLight","black":"#fbf1c7","red":"#9d0006","green":"#79740e","yellow":"#b57614","blue":"#076678","purple":"#8f3f71","cyan":"#427b58","white":"#3c3836","brightBlack":"#9d8374","brightRed":"#cc241d","brightGreen":"#98971a","brightYellow":"#d79921","brightBlue":"#458588","brightPurple":"#b16186","brightCyan":"#689d69","brightWhite":"#7c6f64","background":"#fbf1c7","foreground":"#282828","cursorColor":"#282828","selectionBackground":"#d5c4a1","meta":{"isDark":false,"credits":null}},{"name":"Guezwhoz","black":"#080808","red":"#ff5f5f","green":"#87d7af","yellow":"#d7d787","blue":"#5fafd7","purple":"#afafff","cyan":"#5fd7d7","white":"#dadada","brightBlack":"#8a8a8a","brightRed":"#d75f5f","brightGreen":"#afd7af","brightYellow":"#d7d7af","brightBlue":"#87afd7","brightPurple":"#afafd7","brightCyan":"#87d7d7","brightWhite":"#dadada","background":"#1c1c1c","foreground":"#d0d0d0","cursorColor":"#eeeeee","selectionBackground":"#005f5f","meta":{"isDark":true,"credits":[{"name":"Egor Lem","link":"https://github.com/guesswhozzz/guezwhoz-iterm2-theme"}]}},{"background":"#1F1F1E","black":"#151507","blue":"#839496","brightBlack":"#1F1F1E","brightBlue":"#839496","brightCyan":"#93A1A1","brightGreen":"#586E75","brightPurple":"#6C71C4","brightRed":"#CB4B16","brightWhite":"#FFFFFF","brightYellow":"#657B83","cursorColor":"#FFFFFF","cyan":"#B0D1BA","foreground":"#839496","green":"#849900","name":"h4rithd","purple":"#D33682","red":"#C94B16","selectionBackground":"#FFFFFF","white":"#FFFFFF","yellow":"#B58900","meta":{"isDark":true,"credits":null}},{"background":"#1E1E1E","black":"#010100","blue":"#3464A5","brightBlack":"#545752","brightBlue":"#729ECE","brightCyan":"#35E2E3","brightGreen":"#8BE235","brightPurple":"#AC7EA8","brightRed":"#EE282B","brightWhite":"#D3D7CF","brightYellow":"#FDE94E","cursorColor":"#FFFFFF","cyan":"#06989A","foreground":"#FFFEFF","green":"#4E9B07","name":"h4rithd.com","purple":"#75517A","red":"#CC0000","selectionBackground":"#FFFFFF","white":"#D3D7CF","yellow":"#C4A000","meta":{"isDark":true,"credits":null}},{"name":"Hacktober","black":"#191918","red":"#b34538","green":"#587744","yellow":"#d08949","blue":"#206ec5","purple":"#864651","cyan":"#ac9166","white":"#f1eee7","brightBlack":"#2c2b2a","brightRed":"#b33323","brightGreen":"#42824a","brightYellow":"#c75a22","brightBlue":"#5389c5","brightPurple":"#e795a5","brightCyan":"#ebc587","brightWhite":"#ffffff","background":"#141414","foreground":"#c9c9c9","cursorColor":"#c9c9c9","selectionBackground":"#141414","meta":{"isDark":true,"credits":null}},{"name":"Hardcore","black":"#1b1d1e","red":"#f92672","green":"#a6e22e","yellow":"#fd971f","blue":"#66d9ef","purple":"#9e6ffe","cyan":"#5e7175","white":"#ccccc6","brightBlack":"#505354","brightRed":"#ff669d","brightGreen":"#beed5f","brightYellow":"#e6db74","brightBlue":"#66d9ef","brightPurple":"#9e6ffe","brightCyan":"#a3babf","brightWhite":"#f8f8f2","background":"#121212","foreground":"#a0a0a0","cursorColor":"#bbbbbb","selectionBackground":"#453b39","meta":{"isDark":true,"credits":[{"name":"hardcore","link":"https://github.com/hardcore/iTerm-colors"}]}},{"name":"Harper","black":"#010101","red":"#f8b63f","green":"#7fb5e1","yellow":"#d6da25","blue":"#489e48","purple":"#b296c6","cyan":"#f5bfd7","white":"#a8a49d","brightBlack":"#726e6a","brightRed":"#f8b63f","brightGreen":"#7fb5e1","brightYellow":"#d6da25","brightBlue":"#489e48","brightPurple":"#b296c6","brightCyan":"#f5bfd7","brightWhite":"#fefbea","background":"#010101","foreground":"#a8a49d","cursorColor":"#a8a49d","selectionBackground":"#5a5753","meta":{"isDark":true,"credits":[{"name":"idleberg","link":"https://github.com/idleberg/Harper-iTerm2"}]}},{"name":"HaX0R_BLUE","black":"#010921","red":"#10b6ff","green":"#10b6ff","yellow":"#10b6ff","blue":"#10b6ff","purple":"#10b6ff","cyan":"#10b6ff","white":"#fafafa","brightBlack":"#080117","brightRed":"#00b3f7","brightGreen":"#00b3f7","brightYellow":"#00b3f7","brightBlue":"#00b3f7","brightPurple":"#00b3f7","brightCyan":"#00b3f7","brightWhite":"#fefefe","background":"#010515","foreground":"#11b7ff","cursorColor":"#10b6ff","selectionBackground":"#c1e4ff","meta":{"isDark":true,"credits":null}},{"name":"HaX0R_GR33N","black":"#001f0b","red":"#15d00d","green":"#15d00d","yellow":"#15d00d","blue":"#15d00d","purple":"#15d00d","cyan":"#15d00d","white":"#fafafa","brightBlack":"#001510","brightRed":"#19e20e","brightGreen":"#19e20e","brightYellow":"#19e20e","brightBlue":"#19e20e","brightPurple":"#19e20e","brightCyan":"#19e20e","brightWhite":"#fefefe","background":"#020f01","foreground":"#16b10e","cursorColor":"#15d00d","selectionBackground":"#d4ffc1","meta":{"isDark":true,"credits":null}},{"name":"HaX0R_R3D","black":"#1f0000","red":"#b00d0d","green":"#b00d0d","yellow":"#b00d0d","blue":"#b00d0d","purple":"#b00d0d","cyan":"#b00d0d","white":"#fafafa","brightBlack":"#150000","brightRed":"#ff1111","brightGreen":"#ff1010","brightYellow":"#ff1010","brightBlue":"#ff1010","brightPurple":"#ff1010","brightCyan":"#ff1010","brightWhite":"#fefefe","background":"#200101","foreground":"#b10e0e","cursorColor":"#b00d0d","selectionBackground":"#ebc1ff","meta":{"isDark":true,"credits":null}},{"name":"Highway","black":"#000000","red":"#d00e18","green":"#138034","yellow":"#ffcb3e","blue":"#006bb3","purple":"#6b2775","cyan":"#384564","white":"#ededed","brightBlack":"#5d504a","brightRed":"#f07e18","brightGreen":"#b1d130","brightYellow":"#fff120","brightBlue":"#4fc2fd","brightPurple":"#de0071","brightCyan":"#5d504a","brightWhite":"#ffffff","background":"#222225","foreground":"#ededed","cursorColor":"#e0d9b9","selectionBackground":"#384564","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Hipster Green","black":"#000000","red":"#b6214a","green":"#00a600","yellow":"#bfbf00","blue":"#246eb2","purple":"#b200b2","cyan":"#00a6b2","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#86a93e","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#100b05","foreground":"#84c138","cursorColor":"#23ff18","selectionBackground":"#083905","meta":{"isDark":true,"credits":[{"name":"Unkulunkulu","link":"https://github.com/Unkulunkulu"}]}},{"name":"Hivacruz","black":"#202746","red":"#c94922","green":"#ac9739","yellow":"#c08b30","blue":"#3d8fd1","purple":"#6679cc","cyan":"#22a2c9","white":"#979db4","brightBlack":"#6b7394","brightRed":"#c76b29","brightGreen":"#73ad43","brightYellow":"#5e6687","brightBlue":"#898ea4","brightPurple":"#dfe2f1","brightCyan":"#9c637a","brightWhite":"#f5f7ff","background":"#132638","foreground":"#ede4e4","cursorColor":"#979db4","selectionBackground":"#5e6687","meta":{"isDark":true,"credits":[{"name":"Yann Defretin","link":"https://github.com/kinoute/hivacruz-itermcolors"}]}},{"name":"Homebrew","black":"#000000","red":"#990000","green":"#00a600","yellow":"#999900","blue":"#0000b2","purple":"#b200b2","cyan":"#00a6b2","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#00d900","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#000000","foreground":"#00ff00","cursorColor":"#23ff18","selectionBackground":"#083905","meta":{"isDark":true,"credits":null}},{"name":"Hopscotch","black":"#322931","red":"#dd464c","green":"#8fc13e","yellow":"#fdcc59","blue":"#1290bf","purple":"#c85e7c","cyan":"#149b93","white":"#b9b5b8","brightBlack":"#797379","brightRed":"#fd8b19","brightGreen":"#433b42","brightYellow":"#5c545b","brightBlue":"#989498","brightPurple":"#d5d3d5","brightCyan":"#b33508","brightWhite":"#ffffff","background":"#322931","foreground":"#b9b5b8","cursorColor":"#b9b5b8","selectionBackground":"#5c545b","meta":{"isDark":true,"credits":[{"name":"Jan T. Sott","link":"https://github.com/idleberg/Hopscotch"}]}},{"name":"Hopscotch.256","black":"#322931","red":"#dd464c","green":"#8fc13e","yellow":"#fdcc59","blue":"#1290bf","purple":"#c85e7c","cyan":"#149b93","white":"#b9b5b8","brightBlack":"#797379","brightRed":"#dd464c","brightGreen":"#8fc13e","brightYellow":"#fdcc59","brightBlue":"#1290bf","brightPurple":"#c85e7c","brightCyan":"#149b93","brightWhite":"#ffffff","background":"#322931","foreground":"#b9b5b8","cursorColor":"#b9b5b8","selectionBackground":"#5c545b","meta":{"isDark":true,"credits":[{"name":"Jan T. Sott","link":"https://github.com/idleberg/Hopscotch"}]}},{"name":"Horizon","black":"#0a0a0d","red":"#E95678","green":"#29D398","yellow":"#FAB795","blue":"#26BBD9","purple":"#EE64AC","cyan":"#59E1E3","white":"#e5e5e5","brightBlack":"#848484","brightRed":"#EC6A88","brightGreen":"#3FDAA4","brightYellow":"#FBC3A7","brightBlue":"#3FC4DE","brightPurple":"#F075B5","brightCyan":"#6BE4E6","brightWhite":"#e5e5e5","background":"#1c1e26","foreground":"#bdc0c2","meta":{"isDark":true,"credits":[{"name":"wafelack","link":"https://github.com/wafelack"}]}},{"name":"Hurtado","black":"#575757","red":"#ff1b00","green":"#a5e055","yellow":"#fbe74a","blue":"#496487","purple":"#fd5ff1","cyan":"#86e9fe","white":"#cbcccb","brightBlack":"#262626","brightRed":"#d51d00","brightGreen":"#a5df55","brightYellow":"#fbe84a","brightBlue":"#89beff","brightPurple":"#c001c1","brightCyan":"#86eafe","brightWhite":"#dbdbdb","background":"#000000","foreground":"#dbdbdb","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"juanghurtado","link":"https://github.com/juanghurtado/dotfiles"}]}},{"name":"Hybrid","black":"#2a2e33","red":"#b84d51","green":"#b3bf5a","yellow":"#e4b55e","blue":"#6e90b0","purple":"#a17eac","cyan":"#7fbfb4","white":"#b5b9b6","brightBlack":"#1d1f22","brightRed":"#8d2e32","brightGreen":"#798431","brightYellow":"#e58a50","brightBlue":"#4b6b88","brightPurple":"#6e5079","brightCyan":"#4d7b74","brightWhite":"#5a626a","background":"#161719","foreground":"#b7bcba","cursorColor":"#b7bcba","selectionBackground":"#1e1f22","meta":{"isDark":true,"credits":[{"name":"luan","link":"https://gist.github.com/luan/6362811"}]}},{"background":"#000000","black":"#000000","blue":"#0066FF","brightBlack":"#808080","brightBlue":"#0066FF","brightCyan":"#00FFFF","brightGreen":"#33FF00","brightPurple":"#CC00FF","brightRed":"#FE0100","brightWhite":"#FFFFFF","brightYellow":"#FEFF00","cursorColor":"#FFFFFF","cyan":"#00FFFF","foreground":"#FFFFFF","green":"#33FF00","name":"Hyper","purple":"#CC00FF","red":"#FE0100","selectionBackground":"#F81CE5","white":"#D0D0D0","yellow":"#FEFF00","meta":{"isDark":true,"credits":[{"name":"shivang","link":"https://github.com/ShivangMathur1"}]}},{"name":"iceberg-dark","black":"#1e2132","red":"#e27878","green":"#b4be82","yellow":"#e2a478","blue":"#84a0c6","purple":"#a093c7","cyan":"#89b8c2","white":"#c6c8d1","brightBlack":"#6b7089","brightRed":"#e98989","brightGreen":"#c0ca8e","brightYellow":"#e9b189","brightBlue":"#91acd1","brightPurple":"#ada0d3","brightCyan":"#95c4ce","brightWhite":"#d2d4de","background":"#161821","foreground":"#c6c8d1","cursorColor":"#c6c8d1","selectionBackground":"#c6c8d1","meta":{"isDark":true,"credits":[{"name":"cocopon","link":"https://github.com/cocopon/iceberg.vim"},{"name":"pbnj","link":"https://github.com/pbnj"}]}},{"name":"iceberg-light","black":"#dcdfe7","red":"#cc517a","green":"#668e3d","yellow":"#c57339","blue":"#2d539e","purple":"#7759b4","cyan":"#3f83a6","white":"#33374c","brightBlack":"#8389a3","brightRed":"#cc3768","brightGreen":"#598030","brightYellow":"#b6662d","brightBlue":"#22478e","brightPurple":"#6845ad","brightCyan":"#327698","brightWhite":"#262a3f","background":"#e8e9ec","foreground":"#33374c","cursorColor":"#33374c","selectionBackground":"#33374c","meta":{"isDark":false,"credits":[{"name":"cocopon","link":"https://github.com/cocopon/iceberg.vim"},{"name":"pbnj","link":"https://github.com/pbnj"}]}},{"name":"IC_Green_PPL","black":"#014401","red":"#ff2736","green":"#41a638","yellow":"#76a831","blue":"#2ec3b9","purple":"#50a096","cyan":"#3ca078","white":"#e6fef2","brightBlack":"#035c03","brightRed":"#b4fa5c","brightGreen":"#aefb86","brightYellow":"#dafa87","brightBlue":"#2efaeb","brightPurple":"#50fafa","brightCyan":"#3cfac8","brightWhite":"#e0f1dc","background":"#2c2c2c","foreground":"#e0f1dc","cursorColor":"#47fa6b","selectionBackground":"#116b41","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"IC_Orange_PPL","black":"#000000","red":"#c13900","green":"#a4a900","yellow":"#caaf00","blue":"#bd6d00","purple":"#fc5e00","cyan":"#f79500","white":"#ffc88a","brightBlack":"#6a4f2a","brightRed":"#ff8c68","brightGreen":"#f6ff40","brightYellow":"#ffe36e","brightBlue":"#ffbe55","brightPurple":"#fc874f","brightCyan":"#c69752","brightWhite":"#fafaff","background":"#262626","foreground":"#ffcb83","cursorColor":"#fc531d","selectionBackground":"#c14020","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"idea","black":"#adadad","red":"#fc5256","green":"#98b61c","yellow":"#ccb444","blue":"#437ee7","purple":"#9d74b0","cyan":"#248887","white":"#181818","brightBlack":"#ffffff","brightRed":"#fc7072","brightGreen":"#98b61c","brightYellow":"#ffff0b","brightBlue":"#6c9ced","brightPurple":"#fc7eff","brightCyan":"#248887","brightWhite":"#181818","background":"#202020","foreground":"#adadad","cursorColor":"#bbbbbb","selectionBackground":"#44475a","meta":{"isDark":true,"credits":null}},{"name":"idleToes","black":"#323232","red":"#d25252","green":"#7fe173","yellow":"#ffc66d","blue":"#4099ff","purple":"#f680ff","cyan":"#bed6ff","white":"#eeeeec","brightBlack":"#535353","brightRed":"#f07070","brightGreen":"#9dff91","brightYellow":"#ffe48b","brightBlue":"#5eb7f7","brightPurple":"#ff9dff","brightCyan":"#dcf4ff","brightWhite":"#ffffff","background":"#323232","foreground":"#ffffff","cursorColor":"#d6d6d6","selectionBackground":"#5b5b5b","meta":{"isDark":true,"credits":[{"name":"idleFingers","link":"http://www.idlefingers.co.uk/"}]}},{"name":"IR_Black","black":"#4f4f4f","red":"#fa6c60","green":"#a8ff60","yellow":"#fffeb7","blue":"#96cafe","purple":"#fa73fd","cyan":"#c6c5fe","white":"#efedef","brightBlack":"#7b7b7b","brightRed":"#fcb6b0","brightGreen":"#cfffab","brightYellow":"#ffffcc","brightBlue":"#b5dcff","brightPurple":"#fb9cfe","brightCyan":"#e0e0fe","brightWhite":"#ffffff","background":"#000000","foreground":"#f1f1f1","cursorColor":"#808080","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"meqif","link":"https://gist.github.com/meqif/1238378"}]}},{"name":"iTerm2 Dark Background","black":"#000000","red":"#c91b00","green":"#00c200","yellow":"#c7c400","blue":"#0225c7","purple":"#ca30c7","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#ff77ff","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#000000","foreground":"#c7c7c7","cursorColor":"#c7c7c7","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":null}},{"name":"iTerm2 Default","black":"#000000","red":"#c91b00","green":"#00c200","yellow":"#c7c400","blue":"#2225c4","purple":"#ca30c7","cyan":"#00c5c7","white":"#ffffff","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#ff77ff","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#000000","foreground":"#ffffff","cursorColor":"#e5e5e5","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":null}},{"name":"iTerm2 Light Background","black":"#000000","red":"#c91b00","green":"#00c200","yellow":"#c7c400","blue":"#0225c7","purple":"#ca30c7","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#ff77ff","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#c1deff","meta":{"isDark":false,"credits":null}},{"name":"iTerm2 Pastel Dark Background","black":"#626262","red":"#ff8373","green":"#b4fb73","yellow":"#fffdc3","blue":"#a5d5fe","purple":"#ff90fe","cyan":"#d1d1fe","white":"#f1f1f1","brightBlack":"#8f8f8f","brightRed":"#ffc4be","brightGreen":"#d6fcba","brightYellow":"#fffed5","brightBlue":"#c2e3ff","brightPurple":"#ffb2fe","brightCyan":"#e6e6fe","brightWhite":"#ffffff","background":"#000000","foreground":"#c7c7c7","cursorColor":"#ffb473","selectionBackground":"#454d96","meta":{"isDark":true,"credits":null}},{"name":"iTerm2 Smoooooth","black":"#14191e","red":"#b43c2a","green":"#00c200","yellow":"#c7c400","blue":"#2744c7","purple":"#c040be","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#dd7975","brightGreen":"#58e790","brightYellow":"#ece100","brightBlue":"#a7abf2","brightPurple":"#e17ee1","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#15191f","foreground":"#dcdcdc","cursorColor":"#ffffff","selectionBackground":"#b3d7ff","meta":{"isDark":true,"credits":null}},{"name":"iTerm2 Solarized Dark","black":"#073642","red":"#dc322f","green":"#859900","yellow":"#b58900","blue":"#268bd2","purple":"#d33682","cyan":"#2aa198","white":"#eee8d5","brightBlack":"#002b36","brightRed":"#cb4b16","brightGreen":"#586e75","brightYellow":"#657b83","brightBlue":"#839496","brightPurple":"#6c71c4","brightCyan":"#93a1a1","brightWhite":"#fdf6e3","background":"#002b36","foreground":"#839496","cursorColor":"#839496","selectionBackground":"#073642","meta":{"isDark":true,"credits":null}},{"name":"iTerm2 Solarized Light","black":"#073642","red":"#dc322f","green":"#859900","yellow":"#b58900","blue":"#268bd2","purple":"#d33682","cyan":"#2aa198","white":"#eee8d5","brightBlack":"#002b36","brightRed":"#cb4b16","brightGreen":"#586e75","brightYellow":"#657b83","brightBlue":"#839496","brightPurple":"#6c71c4","brightCyan":"#93a1a1","brightWhite":"#fdf6e3","background":"#fdf6e3","foreground":"#657b83","cursorColor":"#657b83","selectionBackground":"#eee8d5","meta":{"isDark":false,"credits":null}},{"name":"iTerm2 Tango Dark","black":"#000000","red":"#d81e00","green":"#5ea702","yellow":"#cfae00","blue":"#427ab3","purple":"#89658e","cyan":"#00a7aa","white":"#dbded8","brightBlack":"#686a66","brightRed":"#f54235","brightGreen":"#99e343","brightYellow":"#fdeb61","brightBlue":"#84b0d8","brightPurple":"#bc94b7","brightCyan":"#37e6e8","brightWhite":"#f1f1f0","background":"#000000","foreground":"#ffffff","cursorColor":"#ffffff","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":null}},{"name":"iTerm2 Tango Light","black":"#000000","red":"#d81e00","green":"#5ea702","yellow":"#cfae00","blue":"#427ab3","purple":"#89658e","cyan":"#00a7aa","white":"#dbded8","brightBlack":"#686a66","brightRed":"#f54235","brightGreen":"#99e343","brightYellow":"#fdeb61","brightBlue":"#84b0d8","brightPurple":"#bc94b7","brightCyan":"#37e6e8","brightWhite":"#f1f1f0","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#c1deff","meta":{"isDark":false,"credits":null}},{"name":"Jackie Brown","black":"#2c1d16","red":"#ef5734","green":"#2baf2b","yellow":"#bebf00","blue":"#246eb2","purple":"#d05ec1","cyan":"#00acee","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#86a93e","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#2c1d16","foreground":"#ffcc2f","cursorColor":"#23ff18","selectionBackground":"#af8d21","meta":{"isDark":true,"credits":[{"name":"Unkulunkulu","link":"https://github.com/Unkulunkulu"}]}},{"name":"Japanesque","black":"#343935","red":"#cf3f61","green":"#7bb75b","yellow":"#e9b32a","blue":"#4c9ad4","purple":"#a57fc4","cyan":"#389aad","white":"#fafaf6","brightBlack":"#595b59","brightRed":"#d18fa6","brightGreen":"#767f2c","brightYellow":"#78592f","brightBlue":"#135979","brightPurple":"#604291","brightCyan":"#76bbca","brightWhite":"#b2b5ae","background":"#1e1e1e","foreground":"#f7f6ec","cursorColor":"#edcf4f","selectionBackground":"#175877","meta":{"isDark":true,"credits":[{"name":"aereal","link":"https://github.com/aereal/dotfiles/blob/master/colors/Japanesque/Japanesque.itermcolors"}]}},{"name":"Jellybeans","black":"#929292","red":"#e27373","green":"#94b979","yellow":"#ffba7b","blue":"#97bedc","purple":"#e1c0fa","cyan":"#00988e","white":"#dedede","brightBlack":"#bdbdbd","brightRed":"#ffa1a1","brightGreen":"#bddeab","brightYellow":"#ffdca0","brightBlue":"#b1d8f6","brightPurple":"#fbdaff","brightCyan":"#1ab2a8","brightWhite":"#ffffff","background":"#121212","foreground":"#dedede","cursorColor":"#ffa560","selectionBackground":"#474e91","meta":{"isDark":true,"credits":[{"name":"qtpi","link":"https://github.com/qtpi/Jellybeans.itermcolors"}]}},{"name":"JetBrains Darcula","black":"#000000","red":"#fa5355","green":"#126e00","yellow":"#c2c300","blue":"#4581eb","purple":"#fa54ff","cyan":"#33c2c1","white":"#adadad","brightBlack":"#555555","brightRed":"#fb7172","brightGreen":"#67ff4f","brightYellow":"#ffff00","brightBlue":"#6d9df1","brightPurple":"#fb82ff","brightCyan":"#60d3d1","brightWhite":"#eeeeee","background":"#202020","foreground":"#adadad","cursorColor":"#ffffff","selectionBackground":"#1a3272","meta":{"isDark":true,"credits":[{"name":"vitstr","link":"https://github.com/vitstr"}]}},{"name":"jubi","black":"#3b3750","red":"#cf7b98","green":"#90a94b","yellow":"#6ebfc0","blue":"#576ea6","purple":"#bc4f68","cyan":"#75a7d2","white":"#c3d3de","brightBlack":"#a874ce","brightRed":"#de90ab","brightGreen":"#bcdd61","brightYellow":"#87e9ea","brightBlue":"#8c9fcd","brightPurple":"#e16c87","brightCyan":"#b7c9ef","brightWhite":"#d5e5f1","background":"#262b33","foreground":"#c3d3de","cursorColor":"#c3d3de","selectionBackground":"#5b5184","meta":{"isDark":true,"credits":[{"name":"Julia Tretel","link":"https://github.com/jutretel"}]}},{"name":"Juicy Colors","cursorColor":"#FFFFFF","selectionBackground":"#FFFFFF","background":"#292a24","foreground":"#CCCCCC","black":"#292a24","blue":"#209DE5","cyan":"#00D2FF","green":"#68D644","purple":"#AF80FF","red":"#FF6249","white":"#CCCCCC","yellow":"#FCC223","brightBlack":"#808080","brightBlue":"#209DE5","brightCyan":"#00D2FF","brightGreen":"#68D644","brightPurple":"#AF80FF","brightRed":"#FF6249","brightWhite":"#F2F2F2","brightYellow":"#FCC223","meta":{"isDark":true,"credits":null}},{"name":"Kanagawa","cursorColor":"#DCD7BA","selectionBackground":"#2A2A37","background":"#1F1F28","foreground":"#DCD7BA","black":"#1F1F28","blue":"#658594","cyan":"#9CABCA","green":"#76946A","purple":"#957FB8","red":"#E82424","white":"#DCD7BA","yellow":"#FF9E3B","brightBlack":"#2A2A37","brightBlue":"#7FB4CA","brightCyan":"#A3D4D5","brightGreen":"#98BB6C","brightPurple":"#D27E99","brightRed":"#FF5D62","brightWhite":"#DCD7BA","brightYellow":"#E6C384","meta":{"isDark":true,"credits":null}},{"name":"kanagawabones","black":"#1f1f28","red":"#e46a78","green":"#98bc6d","yellow":"#e5c283","blue":"#7eb3c9","purple":"#957fb8","cyan":"#7eb3c9","white":"#ddd8bb","brightBlack":"#3c3c51","brightRed":"#ec818c","brightGreen":"#9ec967","brightYellow":"#f1c982","brightBlue":"#7bc2df","brightPurple":"#a98fd2","brightCyan":"#7bc2df","brightWhite":"#a8a48d","background":"#1f1f28","foreground":"#ddd8bb","cursorColor":"#e6e0c2","selectionBackground":"#49473e","meta":{"isDark":true,"credits":null}},{"name":"Kibble","black":"#4d4d4d","red":"#c70031","green":"#29cf13","yellow":"#d8e30e","blue":"#3449d1","purple":"#8400ff","cyan":"#0798ab","white":"#e2d1e3","brightBlack":"#5a5a5a","brightRed":"#f01578","brightGreen":"#6ce05c","brightYellow":"#f3f79e","brightBlue":"#97a4f7","brightPurple":"#c495f0","brightCyan":"#68f2e0","brightWhite":"#ffffff","background":"#0e100a","foreground":"#f7f7f7","cursorColor":"#9fda9c","selectionBackground":"#9ba787","meta":{"isDark":true,"credits":null}},{"name":"Kolorit","black":"#1d1a1e","red":"#ff5b82","green":"#47d7a1","yellow":"#e8e562","blue":"#5db4ee","purple":"#da6cda","cyan":"#57e9eb","white":"#ededed","brightBlack":"#1d1a1e","brightRed":"#ff5b82","brightGreen":"#47d7a1","brightYellow":"#e8e562","brightBlue":"#5db4ee","brightPurple":"#da6cda","brightCyan":"#57e9eb","brightWhite":"#ededed","background":"#1d1a1e","foreground":"#efecec","cursorColor":"#c7c7c7","selectionBackground":"#e1925c","meta":{"isDark":true,"credits":[{"name":"thomaspaulmann","link":"https://github.com/thomaspaulmann"}]}},{"name":"Konsolas","black":"#000000","red":"#aa1717","green":"#18b218","yellow":"#ebae1f","blue":"#2323a5","purple":"#ad1edc","cyan":"#42b0c8","white":"#c8c1c1","brightBlack":"#7b716e","brightRed":"#ff4141","brightGreen":"#5fff5f","brightYellow":"#ffff55","brightBlue":"#4b4bff","brightPurple":"#ff54ff","brightCyan":"#69ffff","brightWhite":"#ffffff","background":"#060606","foreground":"#c8c1c1","cursorColor":"#c8c1c1","selectionBackground":"#060606","meta":{"isDark":true,"credits":null}},{"name":"Lab Fox","black":"#2e2e2e","red":"#fc6d26","green":"#3eb383","yellow":"#fca121","blue":"#db3b21","purple":"#380d75","cyan":"#6e49cb","white":"#ffffff","brightBlack":"#464646","brightRed":"#ff6517","brightGreen":"#53eaa8","brightYellow":"#fca013","brightBlue":"#db501f","brightPurple":"#441090","brightCyan":"#7d53e7","brightWhite":"#ffffff","background":"#2e2e2e","foreground":"#ffffff","cursorColor":"#7f7f7f","selectionBackground":"#cb392e","meta":{"isDark":true,"credits":[{"name":"theatlasroom","link":"https://github.com/theatlasroom"},{"name":"Gitlab design system","link":"https://design.gitlab.com"}]}},{"name":"Laser","black":"#626262","red":"#ff8373","green":"#b4fb73","yellow":"#09b4bd","blue":"#fed300","purple":"#ff90fe","cyan":"#d1d1fe","white":"#f1f1f1","brightBlack":"#8f8f8f","brightRed":"#ffc4be","brightGreen":"#d6fcba","brightYellow":"#fffed5","brightBlue":"#f92883","brightPurple":"#ffb2fe","brightCyan":"#e6e7fe","brightWhite":"#ffffff","background":"#030d18","foreground":"#f106e3","cursorColor":"#00ff9c","selectionBackground":"#2e206a","meta":{"isDark":true,"credits":[{"name":"ReagentX","link":"https://github.com/ReagentX"}]}},{"name":"Later This Evening","black":"#2b2b2b","red":"#d45a60","green":"#afba67","yellow":"#e5d289","blue":"#a0bad6","purple":"#c092d6","cyan":"#91bfb7","white":"#3c3d3d","brightBlack":"#454747","brightRed":"#d3232f","brightGreen":"#aabb39","brightYellow":"#e5be39","brightBlue":"#6699d6","brightPurple":"#ab53d6","brightCyan":"#5fc0ae","brightWhite":"#c1c2c2","background":"#222222","foreground":"#959595","cursorColor":"#424242","selectionBackground":"#424242","meta":{"isDark":true,"credits":[{"name":"vilhalmer","link":"https://github.com/vilhalmer/System/tree/master/terminal-themes"}]}},{"name":"Lavandula","black":"#230046","red":"#7d1625","green":"#337e6f","yellow":"#7f6f49","blue":"#4f4a7f","purple":"#5a3f7f","cyan":"#58777f","white":"#736e7d","brightBlack":"#372d46","brightRed":"#e05167","brightGreen":"#52e0c4","brightYellow":"#e0c386","brightBlue":"#8e87e0","brightPurple":"#a776e0","brightCyan":"#9ad4e0","brightWhite":"#8c91fa","background":"#050014","foreground":"#736e7d","cursorColor":"#8c91fa","selectionBackground":"#37323c","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"LiquidCarbon","black":"#000000","red":"#ff3030","green":"#559a70","yellow":"#ccac00","blue":"#0099cc","purple":"#cc69c8","cyan":"#7ac4cc","white":"#bccccc","brightBlack":"#000000","brightRed":"#ff3030","brightGreen":"#559a70","brightYellow":"#ccac00","brightBlue":"#0099cc","brightPurple":"#cc69c8","brightCyan":"#7ac4cc","brightWhite":"#bccccc","background":"#303030","foreground":"#afc2c2","cursorColor":"#ffffff","selectionBackground":"#7dbeff","meta":{"isDark":true,"credits":[{"name":"markcho","link":"https://github.com/markcho/iTerm2_LiquidCarbon"}]}},{"name":"LiquidCarbonTransparent","black":"#000000","red":"#ff3030","green":"#559a70","yellow":"#ccac00","blue":"#0099cc","purple":"#cc69c8","cyan":"#7ac4cc","white":"#bccccc","brightBlack":"#000000","brightRed":"#ff3030","brightGreen":"#559a70","brightYellow":"#ccac00","brightBlue":"#0099cc","brightPurple":"#cc69c8","brightCyan":"#7ac4cc","brightWhite":"#bccccc","background":"#000000","foreground":"#afc2c2","cursorColor":"#ffffff","selectionBackground":"#7dbeff","meta":{"isDark":true,"credits":[{"name":"markcho","link":"https://github.com/markcho/iTerm2_LiquidCarbon"}]}},{"name":"LiquidCarbonTransparentInverse","black":"#bccccd","red":"#ff3030","green":"#559a70","yellow":"#ccac00","blue":"#0099cc","purple":"#cc69c8","cyan":"#7ac4cc","white":"#000000","brightBlack":"#ffffff","brightRed":"#ff3030","brightGreen":"#559a70","brightYellow":"#ccac00","brightBlue":"#0099cc","brightPurple":"#cc69c8","brightCyan":"#7ac4cc","brightWhite":"#000000","background":"#000000","foreground":"#afc2c2","cursorColor":"#ffffff","selectionBackground":"#7dbeff","meta":{"isDark":true,"credits":[{"name":"markcho","link":"https://github.com/markcho/iTerm2_LiquidCarbon"}]}},{"name":"lovelace","black":"#282a36","red":"#f37f97","green":"#5adecd","yellow":"#f2a272","blue":"#8897f4","purple":"#c574dd","cyan":"#79e6f3","white":"#fdfdfd","brightBlack":"#414458","brightRed":"#ff4971","brightGreen":"#18e3c8","brightYellow":"#ff8037","brightBlue":"#556fff","brightPurple":"#b043d1","brightCyan":"#3fdcee","brightWhite":"#bebec1","background":"#1d1f28","foreground":"#fdfdfd","cursorColor":"#c574dd","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":[{"name":"nalanbar","link":"https://github.com/nalanbar"},{"name":"elenapan","link":"https://github.com/elenapan"}]}},{"name":"Man Page","black":"#000000","red":"#cc0000","green":"#00a600","yellow":"#999900","blue":"#0000b2","purple":"#b200b2","cyan":"#00a6b2","white":"#cccccc","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#00d900","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#fef49c","foreground":"#000000","cursorColor":"#7f7f7f","selectionBackground":"#a4c9cd","meta":{"isDark":false,"credits":null}},{"name":"Mariana","black":"#000000","red":"#ec5f66","green":"#99c794","yellow":"#f9ae58","blue":"#6699cc","purple":"#c695c6","cyan":"#5fb4b4","white":"#f7f7f7","brightBlack":"#333333","brightRed":"#f97b58","brightGreen":"#acd1a8","brightYellow":"#fac761","brightBlue":"#85add6","brightPurple":"#d8b6d8","brightCyan":"#82c4c4","brightWhite":"#ffffff","background":"#343d46","foreground":"#d8dee9","cursorColor":"#fcbb6a","selectionBackground":"#4e5a65","meta":{"isDark":true,"credits":null}},{"name":"Material","black":"#212121","red":"#b7141f","green":"#457b24","yellow":"#f6981e","blue":"#134eb2","purple":"#560088","cyan":"#0e717c","white":"#efefef","brightBlack":"#424242","brightRed":"#e83b3f","brightGreen":"#7aba3a","brightYellow":"#ffea2e","brightBlue":"#54a4f3","brightPurple":"#aa4dbc","brightCyan":"#26bbd1","brightWhite":"#d9d9d9","background":"#eaeaea","foreground":"#232322","cursorColor":"#16afca","selectionBackground":"#c2c2c2","meta":{"isDark":false,"credits":[{"name":"stoeffel","link":"https://github.com/stoeffel/material-iterm"}]}},{"name":"MaterialDark","black":"#212121","red":"#b7141f","green":"#457b24","yellow":"#f6981e","blue":"#134eb2","purple":"#560088","cyan":"#0e717c","white":"#efefef","brightBlack":"#424242","brightRed":"#e83b3f","brightGreen":"#7aba3a","brightYellow":"#ffea2e","brightBlue":"#54a4f3","brightPurple":"#aa4dbc","brightCyan":"#26bbd1","brightWhite":"#d9d9d9","background":"#232322","foreground":"#e5e5e5","cursorColor":"#16afca","selectionBackground":"#dfdfdf","meta":{"isDark":true,"credits":[{"name":"stoeffel","link":"https://github.com/stoeffel/material-iterm"}]}},{"name":"MaterialDarker","black":"#000000","red":"#ff5370","green":"#c3e88d","yellow":"#ffcb6b","blue":"#82aaff","purple":"#c792ea","cyan":"#89ddff","white":"#ffffff","brightBlack":"#545454","brightRed":"#ff5370","brightGreen":"#c3e88d","brightYellow":"#ffcb6b","brightBlue":"#82aaff","brightPurple":"#c792ea","brightCyan":"#89ddff","brightWhite":"#ffffff","background":"#212121","foreground":"#eeffff","cursorColor":"#ffffff","selectionBackground":"#eeffff","meta":{"isDark":true,"credits":[{"name":"jos3s","link":"https://github.com/jos3s"}]}},{"name":"MaterialDesignColors","black":"#435b67","red":"#fc3841","green":"#5cf19e","yellow":"#fed032","blue":"#37b6ff","purple":"#fc226e","cyan":"#59ffd1","white":"#ffffff","brightBlack":"#a1b0b8","brightRed":"#fc746d","brightGreen":"#adf7be","brightYellow":"#fee16c","brightBlue":"#70cfff","brightPurple":"#fc669b","brightCyan":"#9affe6","brightWhite":"#ffffff","background":"#1d262a","foreground":"#e7ebed","cursorColor":"#eaeaea","selectionBackground":"#4e6a78","meta":{"isDark":true,"credits":null}},{"name":"MaterialOcean","black":"#546e7a","red":"#ff5370","green":"#c3e88d","yellow":"#ffcb6b","blue":"#82aaff","purple":"#c792ea","cyan":"#89ddff","white":"#ffffff","brightBlack":"#546e7a","brightRed":"#ff5370","brightGreen":"#c3e88d","brightYellow":"#ffcb6b","brightBlue":"#82aaff","brightPurple":"#c792ea","brightCyan":"#89ddff","brightWhite":"#ffffff","background":"#0f111a","foreground":"#8f93a2","cursorColor":"#ffcc00","selectionBackground":"#1f2233","meta":{"isDark":true,"credits":[{"name":"kaicataldo","link":"https://github.com/kaicataldo/material.vim/blob/master/terminal-colors/iterm2/material-ocean.itermcolors"},{"name":"fr3fou","link":"https://github.com/fr3fou"}]}},{"name":"Mathias","black":"#000000","red":"#e52222","green":"#a6e32d","yellow":"#fc951e","blue":"#c48dff","purple":"#fa2573","cyan":"#67d9f0","white":"#f2f2f2","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#000000","foreground":"#bbbbbb","cursorColor":"#bbbbbb","selectionBackground":"#555555","meta":{"isDark":true,"credits":[{"name":"mathiasbynens","link":"https://github.com/mathiasbynens/dotfiles"}]}},{"name":"matrix","black":"#0f191c","red":"#23755a","green":"#82d967","yellow":"#ffd700","blue":"#3f5242","purple":"#409931","cyan":"#50b45a","white":"#507350","brightBlack":"#688060","brightRed":"#2fc079","brightGreen":"#90d762","brightYellow":"#faff00","brightBlue":"#4f7e7e","brightPurple":"#11ff25","brightCyan":"#c1ff8a","brightWhite":"#678c61","background":"#0f191c","foreground":"#426644","cursorColor":"#384545","selectionBackground":"#18282e","meta":{"isDark":true,"credits":null}},{"name":"Medallion","black":"#000000","red":"#b64c00","green":"#7c8b16","yellow":"#d3bd26","blue":"#616bb0","purple":"#8c5a90","cyan":"#916c25","white":"#cac29a","brightBlack":"#5e5219","brightRed":"#ff9149","brightGreen":"#b2ca3b","brightYellow":"#ffe54a","brightBlue":"#acb8ff","brightPurple":"#ffa0ff","brightCyan":"#ffbc51","brightWhite":"#fed698","background":"#1d1908","foreground":"#cac296","cursorColor":"#d3ba30","selectionBackground":"#626dac","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Mellifluous","black":"#1a1a1a","red":"#d29393","green":"#b3b393","yellow":"#cbaa89","blue":"#a8a1be","purple":"#b39fb0","cyan":"#c0af8c","white":"#dadada","brightBlack":"#5b5b5b","brightRed":"#c95954","brightGreen":"#828040","brightYellow":"#a6794c","brightBlue":"#5a6599","brightPurple":"#9c6995","brightCyan":"#74a39e","brightWhite":"#ffffff","background":"#1a1a1a","foreground":"#dadada","cursorColor":"#bfad9e","selectionBackground":"#2d2d2d","meta":{"isDark":true,"credits":null}},{"name":"midnight-in-mojave","black":"#1e1e1e","red":"#ff453a","green":"#32d74b","yellow":"#ffd60a","blue":"#0a84ff","purple":"#bf5af2","cyan":"#5ac8fa","white":"#ffffff","brightBlack":"#1e1e1e","brightRed":"#ff453a","brightGreen":"#32d74b","brightYellow":"#ffd60a","brightBlue":"#0a84ff","brightPurple":"#bf5af2","brightCyan":"#5ac8fa","brightWhite":"#ffffff","background":"#1e1e1e","foreground":"#ffffff","cursorColor":"#32d74b","selectionBackground":"#4a504d","meta":{"isDark":true,"credits":[{"name":"OberstKrueger","link":"https://github.com/oberstkrueger"},{"name":"Human Interface Guidelines","link":"https://developer.apple.com/design/human-interface-guidelines/macos/overview/themes/"}]}},{"name":"Mirage","black":"#011627","red":"#ff9999","green":"#85cc95","yellow":"#ffd700","blue":"#7fb5ff","purple":"#ddb3ff","cyan":"#21c7a8","white":"#ffffff","brightBlack":"#575656","brightRed":"#ff9999","brightGreen":"#85cc95","brightYellow":"#ffd700","brightBlue":"#7fb5ff","brightPurple":"#ddb3ff","brightCyan":"#85cc95","brightWhite":"#ffffff","background":"#1b2738","foreground":"#a6b2c0","cursorColor":"#ddb3ff","selectionBackground":"#273951","meta":{"isDark":true,"credits":[{"name":"Tristan Remy","link":"https://github.com/tristanremy/mirage"},{"name":"Gomah","link":"https://github.com/Gomah/mirage-iterm"}]}},{"name":"Misterioso","black":"#000000","red":"#ff4242","green":"#74af68","yellow":"#ffad29","blue":"#338f86","purple":"#9414e6","cyan":"#23d7d7","white":"#e1e1e0","brightBlack":"#555555","brightRed":"#ff3242","brightGreen":"#74cd68","brightYellow":"#ffb929","brightBlue":"#23d7d7","brightPurple":"#ff37ff","brightCyan":"#00ede1","brightWhite":"#ffffff","background":"#2d3743","foreground":"#e1e1e0","cursorColor":"#000000","selectionBackground":"#2d37ff","meta":{"isDark":true,"credits":[{"name":"flooose","link":"https://github.com/flooose/misterioso-iterm2"}]}},{"name":"Molokai","black":"#121212","red":"#fa2573","green":"#98e123","yellow":"#dfd460","blue":"#1080d0","purple":"#8700ff","cyan":"#43a8d0","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#f6669d","brightGreen":"#b1e05f","brightYellow":"#fff26d","brightBlue":"#00afff","brightPurple":"#af87ff","brightCyan":"#51ceff","brightWhite":"#ffffff","background":"#121212","foreground":"#bbbbbb","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"tomasr","link":"https://github.com/tomasr/molokai"}]}},{"name":"MonaLisa","black":"#351b0e","red":"#9b291c","green":"#636232","yellow":"#c36e28","blue":"#515c5d","purple":"#9b1d29","cyan":"#588056","white":"#f7d75c","brightBlack":"#874228","brightRed":"#ff4331","brightGreen":"#b4b264","brightYellow":"#ff9566","brightBlue":"#9eb2b4","brightPurple":"#ff5b6a","brightCyan":"#8acd8f","brightWhite":"#ffe598","background":"#120b0d","foreground":"#f7d66a","cursorColor":"#c46c32","selectionBackground":"#f7d66a","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Monokai Cmder","cursorColor":"#ffffff","selectionBackground":"#cccc81","background":"#272822","foreground":"#cacaca","black":"#272822","red":"#a70334","green":"#74aa04","yellow":"#b6b649","blue":"#01549e","purple":"#89569c","cyan":"#1a83a6","white":"#cacaca","brightBlack":"#7c7c7c","brightRed":"#f3044b","brightGreen":"#8dd006","brightYellow":"#cccc81","brightBlue":"#0383f5","brightPurple":"#a87db8","brightCyan":"#58c2e5","brightWhite":"#ffffff","meta":{"isDark":true,"credits":[{"name":"vdurante","link":"https://github.com/vdurante/windows-terminal-monokai-cmder"}]}},{"name":"Monokai Pro","background":"#403e41","black":"#403e41","blue":"#fc9867","brightBlack":"#727072","brightBlue":"#fc9867","brightCyan":"#78dce8","brightGreen":"#a9dc76","brightPurple":"#ab9df2","brightRed":"#ff6188","brightWhite":"#fcfcfa","brightYellow":"#ffd866","cursorColor":"#fcfcfa","cyan":"#78dce8","foreground":"#fcfcfa","green":"#a9dc76","purple":"#ab9df2","red":"#ff6188","selectionBackground":"#fcfcfa","white":"#fcfcfa","yellow":"#ffd866","meta":{"isDark":true,"credits":[{"name":"monokai","link":"https://monokai.pro"}]}},{"name":"Monokai Pro (Filter Octagon)","black":"#000000","red":"#d81e00","green":"#5ea702","yellow":"#cfae00","blue":"#427ab3","purple":"#89658e","cyan":"#00a7aa","white":"#dbded8","brightBlack":"#686a66","brightRed":"#f54235","brightGreen":"#99e343","brightYellow":"#fdeb61","brightBlue":"#84b0d8","brightPurple":"#bc94b7","brightCyan":"#37e6e8","brightWhite":"#f1f1f0","background":"#282a3a","foreground":"#eaf2f1","meta":{"isDark":true,"credits":[{"name":"monokai","link":"https://monokai.pro"}]}},{"name":"Monokai Pro (Filter Ristretto)","background":"#2C2525","black":"#403838","blue":"#F38D70","brightBlack":"#72696A","brightBlue":"#F38D70","brightCyan":"#85DACC","brightGreen":"#ADDA78","brightPurple":"#A8A9EB","brightRed":"#FD6883","brightWhite":"#FFF1F3","brightYellow":"#F9CC6C","cursorColor":"#FFF1F3","cyan":"#85DACC","foreground":"#FFF1F3","green":"#ADDA78","purple":"#A8A9EB","red":"#FD6883","selectionBackground":"#C3B7B8","white":"#FFF1F3","yellow":"#F9CC6C","meta":{"isDark":true,"credits":null}},{"name":"Monokai Remastered","black":"#1a1a1a","red":"#f4005f","green":"#98e024","yellow":"#fd971f","blue":"#9d65ff","purple":"#f4005f","cyan":"#58d1eb","white":"#c4c5b5","brightBlack":"#625e4c","brightRed":"#f4005f","brightGreen":"#98e024","brightYellow":"#e0d561","brightBlue":"#9d65ff","brightPurple":"#f4005f","brightCyan":"#58d1eb","brightWhite":"#f6f6ef","background":"#0c0c0c","foreground":"#d9d9d9","cursorColor":"#fc971f","selectionBackground":"#343434","meta":{"isDark":true,"credits":null}},{"name":"Monokai Soda","black":"#1a1a1a","red":"#f4005f","green":"#98e024","yellow":"#fa8419","blue":"#9d65ff","purple":"#f4005f","cyan":"#58d1eb","white":"#c4c5b5","brightBlack":"#625e4c","brightRed":"#f4005f","brightGreen":"#98e024","brightYellow":"#e0d561","brightBlue":"#9d65ff","brightPurple":"#f4005f","brightCyan":"#58d1eb","brightWhite":"#f6f6ef","background":"#1a1a1a","foreground":"#c4c5b5","cursorColor":"#f6f7ec","selectionBackground":"#343434","meta":{"isDark":true,"credits":[{"name":"deepsweet","link":"https://github.com/deepsweet/Monokai-Soda-iTerm"}]}},{"name":"Monokai Vivid","black":"#121212","red":"#fa2934","green":"#98e123","yellow":"#fff30a","blue":"#0443ff","purple":"#f800f8","cyan":"#01b6ed","white":"#ffffff","brightBlack":"#838383","brightRed":"#f6669d","brightGreen":"#b1e05f","brightYellow":"#fff26d","brightBlue":"#0443ff","brightPurple":"#f200f6","brightCyan":"#51ceff","brightWhite":"#ffffff","background":"#121212","foreground":"#f9f9f9","cursorColor":"#fb0007","selectionBackground":"#ffffff","meta":{"isDark":true,"credits":[{"name":"vitalymak","link":"https://github.com/vitalymak/iTerm2-Color-Schemes"}]}},{"name":"Moonlight II","black":"#191a2a","red":"#ff757f","green":"#c3e88d","yellow":"#ffc777","blue":"#82aaff","purple":"#c099ff","cyan":"#86e1fc","white":"#c8d3f5","brightBlack":"#828bb8","brightRed":"#ff757f","brightGreen":"#c3e88d","brightYellow":"#ffc777","brightBlue":"#82aaff","brightPurple":"#c099ff","brightCyan":"#86e1fc","brightWhite":"#c8d3f5","background":"#222436","foreground":"#c8d3f5","meta":{"isDark":true,"credits":[{"name":"atomiks","link":"https://github.com/atomiks"}]}},{"name":"N0tch2k","black":"#383838","red":"#a95551","green":"#666666","yellow":"#a98051","blue":"#657d3e","purple":"#767676","cyan":"#c9c9c9","white":"#d0b8a3","brightBlack":"#474747","brightRed":"#a97775","brightGreen":"#8c8c8c","brightYellow":"#a99175","brightBlue":"#98bd5e","brightPurple":"#a3a3a3","brightCyan":"#dcdcdc","brightWhite":"#d8c8bb","background":"#222222","foreground":"#a0a0a0","cursorColor":"#aa9175","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"baskerville","link":"https://github.com/baskerville/iTerm-2-Color-Themes"}]}},{"name":"neobones_dark","black":"#0f191f","red":"#de6e7c","green":"#90ff6b","yellow":"#b77e64","blue":"#8190d4","purple":"#b279a7","cyan":"#66a5ad","white":"#c6d5cf","brightBlack":"#263945","brightRed":"#e8838f","brightGreen":"#a0ff85","brightYellow":"#d68c67","brightBlue":"#92a0e2","brightPurple":"#cf86c1","brightCyan":"#65b8c1","brightWhite":"#98a39e","background":"#0f191f","foreground":"#c6d5cf","cursorColor":"#ceddd7","selectionBackground":"#3a3e3d","meta":{"isDark":true,"credits":null}},{"name":"neobones_light","black":"#e5ede6","red":"#a8334c","green":"#567a30","yellow":"#944927","blue":"#286486","purple":"#88507d","cyan":"#3b8992","white":"#202e18","brightBlack":"#b3c6b6","brightRed":"#94253e","brightGreen":"#3f5a22","brightYellow":"#803d1c","brightBlue":"#1d5573","brightPurple":"#7b3b70","brightCyan":"#2b747c","brightWhite":"#415934","background":"#e5ede6","foreground":"#202e18","cursorColor":"#202e18","selectionBackground":"#ade48c","meta":{"isDark":false,"credits":null}},{"name":"Neon","black":"#000000","red":"#ff3045","green":"#5ffa74","yellow":"#fffc7e","blue":"#0208cb","purple":"#f924e7","cyan":"#00fffc","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff5a5a","brightGreen":"#75ff88","brightYellow":"#fffd96","brightBlue":"#3c40cb","brightPurple":"#f15be5","brightCyan":"#88fffe","brightWhite":"#ffffff","background":"#14161a","foreground":"#00fffc","cursorColor":"#c7c7c7","selectionBackground":"#0013ff","meta":{"isDark":true,"credits":null}},{"name":"Neopolitan","black":"#000000","red":"#800000","green":"#61ce3c","yellow":"#fbde2d","blue":"#253b76","purple":"#ff0080","cyan":"#8da6ce","white":"#f8f8f8","brightBlack":"#000000","brightRed":"#800000","brightGreen":"#61ce3c","brightYellow":"#fbde2d","brightBlue":"#253b76","brightPurple":"#ff0080","brightCyan":"#8da6ce","brightWhite":"#f8f8f8","background":"#271f19","foreground":"#ffffff","cursorColor":"#ffffff","selectionBackground":"#253b76","meta":{"isDark":true,"credits":[{"name":"daytonn","link":"https://github.com/daytonn/iTerm2-Color-Schemes"}]}},{"name":"Neutron","black":"#23252b","red":"#b54036","green":"#5ab977","yellow":"#deb566","blue":"#6a7c93","purple":"#a4799d","cyan":"#3f94a8","white":"#e6e8ef","brightBlack":"#23252b","brightRed":"#b54036","brightGreen":"#5ab977","brightYellow":"#deb566","brightBlue":"#6a7c93","brightPurple":"#a4799d","brightCyan":"#3f94a8","brightWhite":"#ebedf2","background":"#1c1e22","foreground":"#e6e8ef","cursorColor":"#f6f7ec","selectionBackground":"#2f363e","meta":{"isDark":true,"credits":[{"name":"Ch4s3","link":"https://github.com/Ch4s3/iTerm2-Neutron"}]}},{"background":"#090819","black":"#283034","blue":"#E388FF","brightBlack":"#FF1998","brightBlue":"#42C6FF","brightCyan":"#3DD8FF","brightGreen":"#83FF52","brightPurple":"#FF2AFC","brightRed":"#FF006E","brightWhite":"#F4F6F9","brightYellow":"#E5FF00","cursorColor":"#00FFFF","cyan":"#00E5FF","foreground":"#6600FF","green":"#00FF80","name":"Night City","purple":"#9900FF","red":"#FF0000","selectionBackground":"#4A7AFF","white":"#6600FF","yellow":"#FFD400","meta":{"isDark":true,"credits":[{"name":"Thomas Lane","link":"https://github.com/tel0065"}]}},{"name":"Night Owlish Light","black":"#011627","red":"#d3423e","green":"#2aa298","yellow":"#daaa01","blue":"#4876d6","purple":"#403f53","cyan":"#08916a","white":"#7a8181","brightBlack":"#7a8181","brightRed":"#f76e6e","brightGreen":"#49d0c5","brightYellow":"#dac26b","brightBlue":"#5ca7e4","brightPurple":"#697098","brightCyan":"#00c990","brightWhite":"#989fb1","background":"#ffffff","foreground":"#403f53","cursorColor":"#403f53","selectionBackground":"#f2f2f2","meta":{"isDark":false,"credits":[{"name":"praveenpuglia","link":"https://github.com/praveenpuglia"},{"name":"sdras","link":"https://github.com/sdras"}]}},{"name":"nightfox","black":"#393b44","red":"#c94f6d","green":"#81b29a","yellow":"#dbc074","blue":"#719cd6","purple":"#9d79d6","cyan":"#63cdcf","white":"#dfdfe0","brightBlack":"#575860","brightRed":"#d16983","brightGreen":"#8ebaa4","brightYellow":"#e0c989","brightBlue":"#86abdc","brightPurple":"#baa1e2","brightCyan":"#7ad5d6","brightWhite":"#e4e4e5","background":"#192330","foreground":"#cdcecf","cursorColor":"#cdcecf","selectionBackground":"#2b3b51","meta":{"isDark":true,"credits":null}},{"name":"NightLion v1","black":"#4c4c4c","red":"#bb0000","green":"#5fde8f","yellow":"#f3f167","blue":"#276bd8","purple":"#bb00bb","cyan":"#00dadf","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#000000","foreground":"#bbbbbb","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"Curvve Media","link":"http://www.curvve.com/blog/category/themes/"}]}},{"name":"NightLion v2","black":"#4c4c4c","red":"#bb0000","green":"#04f623","yellow":"#f3f167","blue":"#64d0f0","purple":"#ce6fdb","cyan":"#00dadf","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#7df71d","brightYellow":"#ffff55","brightBlue":"#62cbe8","brightPurple":"#ff9bf5","brightCyan":"#00ccd8","brightWhite":"#ffffff","background":"#171717","foreground":"#bbbbbb","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"Curvve Media","link":"http://www.curvve.com/blog/category/themes/"}]}},{"name":"niji","black":"#333333","red":"#d23e08","green":"#54ca74","yellow":"#fff700","blue":"#2ab9ff","purple":"#ff50da","cyan":"#1ef9f5","white":"#ddd0c4","brightBlack":"#515151","brightRed":"#ffb7b7","brightGreen":"#c1ffae","brightYellow":"#fcffb8","brightBlue":"#8efff3","brightPurple":"#ffa2ed","brightCyan":"#bcffc7","brightWhite":"#ffffff","background":"#141515","foreground":"#ffffff","cursorColor":"#ffc663","selectionBackground":"#515151","meta":{"isDark":true,"credits":null}},{"name":"Nocturnal Winter","black":"#4d4d4d","red":"#f12d52","green":"#09cd7e","yellow":"#f5f17a","blue":"#3182e0","purple":"#ff2b6d","cyan":"#09c87a","white":"#fcfcfc","brightBlack":"#808080","brightRed":"#f16d86","brightGreen":"#0ae78d","brightYellow":"#fffc67","brightBlue":"#6096ff","brightPurple":"#ff78a2","brightCyan":"#0ae78d","brightWhite":"#ffffff","background":"#0d0d17","foreground":"#e6e5e5","cursorColor":"#e6e5e5","selectionBackground":"#adbdd0","meta":{"isDark":true,"credits":[{"name":"Shriram Balaji","link":"https://github.com/Shriram-Balaji"}]}},{"name":"nord","black":"#3b4252","red":"#bf616a","green":"#a3be8c","yellow":"#ebcb8b","blue":"#81a1c1","purple":"#b48ead","cyan":"#88c0d0","white":"#e5e9f0","brightBlack":"#4c566a","brightRed":"#bf616a","brightGreen":"#a3be8c","brightYellow":"#ebcb8b","brightBlue":"#81a1c1","brightPurple":"#b48ead","brightCyan":"#8fbcbb","brightWhite":"#eceff4","background":"#2e3440","foreground":"#d8dee9","cursorColor":"#eceff4","selectionBackground":"#eceff4","meta":{"isDark":true,"credits":[{"name":"Teraskull","link":"https://github.com/Teraskull"}]}},{"name":"nord-light","black":"#3b4252","red":"#bf616a","green":"#a3be8c","yellow":"#ebcb8b","blue":"#81a1c1","purple":"#b48ead","cyan":"#88c0d0","white":"#d8dee9","brightBlack":"#4c566a","brightRed":"#bf616a","brightGreen":"#a3be8c","brightYellow":"#ebcb8b","brightBlue":"#81a1c1","brightPurple":"#b48ead","brightCyan":"#8fbcbb","brightWhite":"#eceff4","background":"#e5e9f0","foreground":"#414858","cursorColor":"#88c0d0","selectionBackground":"#d8dee9","meta":{"isDark":false,"credits":null}},{"name":"Novel","black":"#000000","red":"#cc0000","green":"#009600","yellow":"#d06b00","blue":"#0000cc","purple":"#cc00cc","cyan":"#0087cc","white":"#cccccc","brightBlack":"#808080","brightRed":"#cc0000","brightGreen":"#009600","brightYellow":"#d06b00","brightBlue":"#0000cc","brightPurple":"#cc00cc","brightCyan":"#0087cc","brightWhite":"#ffffff","background":"#dfdbc3","foreground":"#3b2322","cursorColor":"#73635a","selectionBackground":"#a4a390","meta":{"isDark":false,"credits":null}},{"name":"NvimDark","black":"#07080d","red":"#ffc0b9","green":"#b3f6c0","yellow":"#fce094","blue":"#a6dbff","purple":"#ffcaff","cyan":"#8cf8f7","white":"#eef1f8","brightBlack":"#4f5258","brightRed":"#ffc0b9","brightGreen":"#b3f6c0","brightYellow":"#fce094","brightBlue":"#a6dbff","brightPurple":"#ffcaff","brightCyan":"#8cf8f7","brightWhite":"#eef1f8","background":"#14161b","foreground":"#e0e2ea","cursorColor":"#9b9ea4","selectionBackground":"#4f5258","meta":{"isDark":true,"credits":null}},{"name":"NvimLight","black":"#07080d","red":"#590008","green":"#005523","yellow":"#6b5300","blue":"#004c73","purple":"#470045","cyan":"#007373","white":"#eef1f8","brightBlack":"#4f5258","brightRed":"#590008","brightGreen":"#005523","brightYellow":"#6b5300","brightBlue":"#004c73","brightPurple":"#470045","brightCyan":"#007373","brightWhite":"#eef1f8","background":"#e0e2ea","foreground":"#14161b","cursorColor":"#9b9ea4","selectionBackground":"#9b9ea4","meta":{"isDark":false,"credits":null}},{"name":"Obsidian","black":"#000000","red":"#a60001","green":"#00bb00","yellow":"#fecd22","blue":"#3a9bdb","purple":"#bb00bb","cyan":"#00bbbb","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#ff0003","brightGreen":"#93c863","brightYellow":"#fef874","brightBlue":"#a1d7ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#283033","foreground":"#cdcdcd","cursorColor":"#c0cad0","selectionBackground":"#3e4c4f","meta":{"isDark":true,"credits":null}},{"name":"Ocean","black":"#000000","red":"#990000","green":"#00a600","yellow":"#999900","blue":"#0000b2","purple":"#b200b2","cyan":"#00a6b2","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#00d900","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#224fbc","foreground":"#ffffff","cursorColor":"#7f7f7f","selectionBackground":"#216dff","meta":{"isDark":true,"credits":null}},{"name":"Oceanic-Next","black":"#121c21","red":"#e44754","green":"#89bd82","yellow":"#f7bd51","blue":"#5486c0","purple":"#b77eb8","cyan":"#50a5a4","white":"#ffffff","brightBlack":"#52606b","brightRed":"#e44754","brightGreen":"#89bd82","brightYellow":"#f7bd51","brightBlue":"#5486c0","brightPurple":"#b77eb8","brightCyan":"#50a5a4","brightWhite":"#ffffff","background":"#121b21","foreground":"#b3b8c3","cursorColor":"#b3b8c3","selectionBackground":"#3e4953","meta":{"isDark":true,"credits":null}},{"name":"OceanicMaterial","black":"#000000","red":"#ee2b2a","green":"#40a33f","yellow":"#ffea2e","blue":"#1e80f0","purple":"#8800a0","cyan":"#16afca","white":"#a4a4a4","brightBlack":"#777777","brightRed":"#dc5c60","brightGreen":"#70be71","brightYellow":"#fff163","brightBlue":"#54a4f3","brightPurple":"#aa4dbc","brightCyan":"#42c7da","brightWhite":"#ffffff","background":"#1c262b","foreground":"#c2c8d7","cursorColor":"#b3b8c3","selectionBackground":"#6dc2b8","meta":{"isDark":true,"credits":[{"name":"rahulpatel","link":"https://github.com/rahulpatel"}]}},{"name":"Ollie","black":"#000000","red":"#ac2e31","green":"#31ac61","yellow":"#ac4300","blue":"#2d57ac","purple":"#b08528","cyan":"#1fa6ac","white":"#8a8eac","brightBlack":"#5b3725","brightRed":"#ff3d48","brightGreen":"#3bff99","brightYellow":"#ff5e1e","brightBlue":"#4488ff","brightPurple":"#ffc21d","brightCyan":"#1ffaff","brightWhite":"#5b6ea7","background":"#222125","foreground":"#8a8dae","cursorColor":"#5b6ea7","selectionBackground":"#1e3a66","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"OneDark","black":"#1e2127","red":"#e06c75","green":"#98c379","yellow":"#d19a66","blue":"#61afef","purple":"#c678dd","cyan":"#56b6c2","white":"#abb2bf","brightBlack":"#5c6370","brightRed":"#e06c75","brightGreen":"#98c379","brightYellow":"#d19a66","brightBlue":"#61afef","brightPurple":"#c678dd","brightCyan":"#56b6c2","brightWhite":"#ffffff","background":"#1e2127","foreground":"#abb2bf","meta":{"isDark":true,"credits":[{"name":"azrikahar","link":"https://github.com/azrikahar"}]}},{"name":"OneHalfDark","black":"#282c34","red":"#e06c75","green":"#98c379","yellow":"#e5c07b","blue":"#61afef","purple":"#c678dd","cyan":"#56b6c2","white":"#dcdfe4","brightBlack":"#282c34","brightRed":"#e06c75","brightGreen":"#98c379","brightYellow":"#e5c07b","brightBlue":"#61afef","brightPurple":"#c678dd","brightCyan":"#56b6c2","brightWhite":"#dcdfe4","background":"#282c34","foreground":"#dcdfe4","cursorColor":"#a3b3cc","selectionBackground":"#474e5d","meta":{"isDark":true,"credits":[{"name":"sonph","link":"https://github.com/sonph"}]}},{"name":"OneHalfLight","black":"#383a42","red":"#e45649","green":"#50a14f","yellow":"#c18401","blue":"#0184bc","purple":"#a626a4","cyan":"#0997b3","white":"#fafafa","brightBlack":"#4f525e","brightRed":"#e06c75","brightGreen":"#98c379","brightYellow":"#e5c07b","brightBlue":"#61afef","brightPurple":"#c678dd","brightCyan":"#56b6c2","brightWhite":"#ffffff","background":"#fafafa","foreground":"#383a42","cursorColor":"#bfceff","selectionBackground":"#bfceff","meta":{"isDark":false,"credits":[{"name":"sonph","link":"https://github.com/sonph"}]}},{"name":"OneStar","black":"#000000","red":"#d13b3b","green":"#0dbc79","yellow":"#dfdf44","blue":"#2472c8","purple":"#c42cc4","cyan":"#33a0bb","white":"#f1f1f1","brightBlack":"#666666","brightRed":"#fa4b4b","brightGreen":"#23d18b","brightYellow":"#fcfc5c","brightBlue":"#3b8eea","brightPurple":"#d861d8","brightCyan":"#29b8db","brightWhite":"#fafafa","background":"#0e0e0e","foreground":"#e4e4e4","meta":{"isDark":true,"credits":[{"name":"jos3s","link":"https://github.com/jos3s"}]}},{"name":"Operator Mono Dark","black":"#5a5a5a","red":"#ca372d","green":"#4d7b3a","yellow":"#d4d697","blue":"#4387cf","purple":"#b86cb4","cyan":"#72d5c6","white":"#ced4cd","brightBlack":"#9a9b99","brightRed":"#c37d62","brightGreen":"#83d0a2","brightYellow":"#fdfdc5","brightBlue":"#89d3f6","brightPurple":"#ff2c7a","brightCyan":"#82eada","brightWhite":"#fdfdf6","background":"#191919","foreground":"#c3cac2","cursorColor":"#fcdc08","selectionBackground":"#19273b","meta":{"isDark":true,"credits":[{"name":"vharadkou","link":"https://github.com/vharadkou/OperatorMonoDarkTheme"},{"name":"dreamyguy","link":"https://github.com/dreamyguy/iterm-theme-operator-mono-dark"}]}},{"name":"Overnight Slumber","black":"#0a1222","red":"#ffa7c4","green":"#85cc95","yellow":"#ffcb8b","blue":"#8dabe1","purple":"#c792eb","cyan":"#78ccf0","white":"#ffffff","brightBlack":"#575656","brightRed":"#ffa7c4","brightGreen":"#85cc95","brightYellow":"#ffcb8b","brightBlue":"#8dabe1","brightPurple":"#c792eb","brightCyan":"#ffa7c4","brightWhite":"#ffffff","background":"#0e1729","foreground":"#ced2d6","cursorColor":"#ffa7c4","selectionBackground":"#1f2b41","meta":{"isDark":true,"credits":[{"name":"Cristian Velasquez Ramos","link":"https://github.com/cevr/overnight"},{"name":"Gomah","link":"https://github.com/Gomah/overnight-slumber-iterm"}]}},{"name":"PaleNightHC","black":"#000000","red":"#f07178","green":"#c3e88d","yellow":"#ffcb6b","blue":"#82aaff","purple":"#c792ea","cyan":"#89ddff","white":"#ffffff","brightBlack":"#666666","brightRed":"#f6a9ae","brightGreen":"#dbf1ba","brightYellow":"#ffdfa6","brightBlue":"#b4ccff","brightPurple":"#ddbdf2","brightCyan":"#b8eaff","brightWhite":"#999999","background":"#3e4251","foreground":"#cccccc","cursorColor":"#ffcb6b","selectionBackground":"#717cb4","meta":{"isDark":true,"credits":[{"name":"Mattia Astorino","link":"https://github.com/equinusocio"},{"name":"Kasper","link":"https://github.com/Kasper-Liu"}]}},{"name":"Pandora","black":"#000000","red":"#ff4242","green":"#74af68","yellow":"#ffad29","blue":"#338f86","purple":"#9414e6","cyan":"#23d7d7","white":"#e2e2e2","brightBlack":"#3f5648","brightRed":"#ff3242","brightGreen":"#74cd68","brightYellow":"#ffb929","brightBlue":"#23d7d7","brightPurple":"#ff37ff","brightCyan":"#00ede1","brightWhite":"#ffffff","background":"#141e43","foreground":"#e1e1e1","cursorColor":"#43d58e","selectionBackground":"#2d37ff","meta":{"isDark":true,"credits":[{"name":"milosmatic","link":"https://github.com/milosmatic/Pandora-iterm"}]}},{"name":"Paraiso Dark","black":"#2f1e2e","red":"#ef6155","green":"#48b685","yellow":"#fec418","blue":"#06b6ef","purple":"#815ba4","cyan":"#5bc4bf","white":"#a39e9b","brightBlack":"#776e71","brightRed":"#ef6155","brightGreen":"#48b685","brightYellow":"#fec418","brightBlue":"#06b6ef","brightPurple":"#815ba4","brightCyan":"#5bc4bf","brightWhite":"#e7e9db","background":"#2f1e2e","foreground":"#a39e9b","cursorColor":"#a39e9b","selectionBackground":"#4f424c","meta":{"isDark":true,"credits":[{"name":"idleberg","link":"https://github.com/idleberg"}]}},{"name":"PaulMillr","black":"#2a2a2a","red":"#ff0000","green":"#79ff0f","yellow":"#e7bf00","blue":"#396bd7","purple":"#b449be","cyan":"#66ccff","white":"#bbbbbb","brightBlack":"#666666","brightRed":"#ff0080","brightGreen":"#66ff66","brightYellow":"#f3d64e","brightBlue":"#709aed","brightPurple":"#db67e6","brightCyan":"#7adff2","brightWhite":"#ffffff","background":"#000000","foreground":"#f2f2f2","cursorColor":"#4d4d4d","selectionBackground":"#414141","meta":{"isDark":true,"credits":[{"name":"paulmillr","link":"https://github.com/paulmillr/dotfiles/tree/master/terminal"}]}},{"name":"PencilDark","black":"#212121","red":"#c30771","green":"#10a778","yellow":"#a89c14","blue":"#008ec4","purple":"#523c79","cyan":"#20a5ba","white":"#d9d9d9","brightBlack":"#424242","brightRed":"#fb007a","brightGreen":"#5fd7af","brightYellow":"#f3e430","brightBlue":"#20bbfc","brightPurple":"#6855de","brightCyan":"#4fb8cc","brightWhite":"#f1f1f1","background":"#212121","foreground":"#f1f1f1","cursorColor":"#20bbfc","selectionBackground":"#b6d6fd","meta":{"isDark":true,"credits":[{"name":"mattly","link":"https://github.com/mattly/iterm-colors-pencil"}]}},{"name":"PencilLight","black":"#212121","red":"#c30771","green":"#10a778","yellow":"#a89c14","blue":"#008ec4","purple":"#523c79","cyan":"#20a5ba","white":"#d9d9d9","brightBlack":"#424242","brightRed":"#fb007a","brightGreen":"#5fd7af","brightYellow":"#f3e430","brightBlue":"#20bbfc","brightPurple":"#6855de","brightCyan":"#4fb8cc","brightWhite":"#f1f1f1","background":"#f1f1f1","foreground":"#424242","cursorColor":"#20bbfc","selectionBackground":"#b6d6fd","meta":{"isDark":false,"credits":[{"name":"mattly","link":"https://github.com/mattly/iterm-colors-pencil"}]}},{"name":"Peppermint","black":"#353535","red":"#e74669","green":"#89d287","yellow":"#dab853","blue":"#449fd0","purple":"#da62dc","cyan":"#65aaaf","white":"#b4b4b4","brightBlack":"#535353","brightRed":"#e4859b","brightGreen":"#a3cca2","brightYellow":"#e1e487","brightBlue":"#6fbce2","brightPurple":"#e586e7","brightCyan":"#96dcdb","brightWhite":"#dfdfdf","background":"#000000","foreground":"#c8c8c8","cursorColor":"#bbbbbb","selectionBackground":"#e6e6e6","meta":{"isDark":true,"credits":null}},{"name":"Piatto Light","black":"#414141","red":"#b23771","green":"#66781e","yellow":"#cd6f34","blue":"#3c5ea8","purple":"#a454b2","cyan":"#66781e","white":"#ffffff","brightBlack":"#3f3f3f","brightRed":"#db3365","brightGreen":"#829429","brightYellow":"#cd6f34","brightBlue":"#3c5ea8","brightPurple":"#a454b2","brightCyan":"#829429","brightWhite":"#f2f2f2","background":"#ffffff","foreground":"#414141","cursorColor":"#5e77c8","selectionBackground":"#706b4e","meta":{"isDark":false,"credits":[{"name":"kovv","link":"https://github.com/kovv"}]}},{"name":"Pnevma","black":"#2f2e2d","red":"#a36666","green":"#90a57d","yellow":"#d7af87","blue":"#7fa5bd","purple":"#c79ec4","cyan":"#8adbb4","white":"#d0d0d0","brightBlack":"#4a4845","brightRed":"#d78787","brightGreen":"#afbea2","brightYellow":"#e4c9af","brightBlue":"#a1bdce","brightPurple":"#d7beda","brightCyan":"#b1e7dd","brightWhite":"#efefef","background":"#1c1c1c","foreground":"#d0d0d0","cursorColor":"#e4c9af","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"baskerville","link":"https://github.com/baskerville/iTerm-2-Color-Themes"}]}},{"name":"Popping and Locking","black":"#1d2021","red":"#cc241d","green":"#98971a","yellow":"#d79921","blue":"#458588","purple":"#b16286","cyan":"#689d6a","white":"#a89984","brightBlack":"#928374","brightRed":"#f42c3e","brightGreen":"#b8bb26","brightYellow":"#fabd2f","brightBlue":"#99c6ca","brightPurple":"#d3869b","brightCyan":"#7ec16e","brightWhite":"#ebdbb2","background":"#181921","foreground":"#ebdbb2","cursorColor":"#c7c7c7","selectionBackground":"#ebdbb2","meta":{"isDark":true,"credits":[{"name":"Hedinn Eiriksson","link":"https://github.com/hedinne"},{"name":"didierbroska","link":"https://github.com/didierbroska"}]}},{"name":"primary","black":"#000000","red":"#db4437","green":"#0f9d58","yellow":"#f4b400","blue":"#4285f4","purple":"#db4437","cyan":"#4285f4","white":"#ffffff","brightBlack":"#000000","brightRed":"#db4437","brightGreen":"#0f9d58","brightYellow":"#f4b400","brightBlue":"#4285f4","brightPurple":"#4285f4","brightCyan":"#0f9d58","brightWhite":"#ffffff","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#656565","meta":{"isDark":false,"credits":[{"name":"jayanthkoushik","link":"https://github.com/jayanthkoushik"},{"name":"google","link":"https://github.com/google/vim-colorscheme-primary"}]}},{"name":"Primer","black":"#000000","red":"#ea4a5a","green":"#34d058","yellow":"#ffdf5d","blue":"#2188ff","purple":"#8a63d2","cyan":"#15e2e2","white":"#ecf0f1","brightBlack":"#4f5861","brightRed":"#fdaeb7","brightGreen":"#bef5cb","brightYellow":"#fff5b1","brightBlue":"#c8e1ff","brightPurple":"#d1bcf9","brightCyan":"#a2ecec","brightWhite":"#ffffff","background":"#1a2b3c","foreground":"#ffffff","meta":{"isDark":true,"credits":null}},{"name":"Pro","black":"#000000","red":"#990000","green":"#00a600","yellow":"#999900","blue":"#2009db","purple":"#b200b2","cyan":"#00a6b2","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#00d900","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#000000","foreground":"#f2f2f2","cursorColor":"#4d4d4d","selectionBackground":"#414141","meta":{"isDark":true,"credits":null}},{"name":"Pro Light","black":"#000000","red":"#e5492b","green":"#50d148","yellow":"#c6c440","blue":"#3b75ff","purple":"#ed66e8","cyan":"#4ed2de","white":"#dcdcdc","brightBlack":"#9f9f9f","brightRed":"#ff6640","brightGreen":"#61ef57","brightYellow":"#f2f156","brightBlue":"#0082ff","brightPurple":"#ff7eff","brightCyan":"#61f7f8","brightWhite":"#f2f2f2","background":"#ffffff","foreground":"#191919","cursorColor":"#4d4d4d","selectionBackground":"#c1ddff","meta":{"isDark":false,"credits":[{"name":"crowsonkb","link":"https://github.com/crowsonkb"},{"name":"iterm_schemer","link":"https://github.com/crowsonkb/iterm_schemer"}]}},{"name":"Purple Rain","black":"#000000","red":"#ff260e","green":"#9be205","yellow":"#ffc400","blue":"#00a2fa","purple":"#815bb5","cyan":"#00deef","white":"#ffffff","brightBlack":"#565656","brightRed":"#ff4250","brightGreen":"#b8e36e","brightYellow":"#ffd852","brightBlue":"#00a6ff","brightPurple":"#ac7bf0","brightCyan":"#74fdf3","brightWhite":"#ffffff","background":"#21084a","foreground":"#fffbf6","cursorColor":"#ff271d","selectionBackground":"#287691","meta":{"isDark":true,"credits":[{"name":"msorre2","link":"https://github.com/msorre2"}]}},{"name":"purplepeter","black":"#0a0520","red":"#ff796d","green":"#99b481","yellow":"#efdfac","blue":"#66d9ef","purple":"#e78fcd","cyan":"#ba8cff","white":"#ffba81","brightBlack":"#100b23","brightRed":"#f99f92","brightGreen":"#b4be8f","brightYellow":"#f2e9bf","brightBlue":"#79daed","brightPurple":"#ba91d4","brightCyan":"#a0a0d6","brightWhite":"#b9aed3","background":"#2a1a4a","foreground":"#ece7fa","cursorColor":"#c7c7c7","selectionBackground":"#8689c2","meta":{"isDark":true,"credits":[{"name":"DeChamp","link":"https://github.com/dechamp"}]}},{"background":"#000027","black":"#000000","blue":"#054663","brightBlack":"#626262","brightBlue":"#457693","brightCyan":"#00586C","brightGreen":"#55CE55","brightPurple":"#934593","brightRed":"#D8624E","brightWhite":"#D8D8D8","brightYellow":"#FFA700","cursorColor":"#D8D8D8","cyan":"#00485C","foreground":"#D8D8D8","green":"#157E15","name":"QB64 Super Dark Blue","purple":"#631563","red":"#98220E","selectionBackground":"#00586C","white":"#989898","yellow":"#808000","meta":{"isDark":true,"credits":[{"name":"jmmv","link":"https://github.com/jmmv"}]}},{"name":"Rapture","black":"#000000","red":"#fc644d","green":"#7afde1","yellow":"#fff09b","blue":"#6c9bf5","purple":"#ff4fa1","cyan":"#64e0ff","white":"#c0c9e5","brightBlack":"#304b66","brightRed":"#fc644d","brightGreen":"#7afde1","brightYellow":"#fff09b","brightBlue":"#6c9bf5","brightPurple":"#ff4fa1","brightCyan":"#64e0ff","brightWhite":"#ffffff","background":"#111e2a","foreground":"#c0c9e5","cursorColor":"#ffffff","selectionBackground":"#304b66","meta":{"isDark":true,"credits":[{"name":"Pustur","link":"https://github.com/Pustur"}]}},{"name":"Raycast_Dark","black":"#000000","red":"#ff5360","green":"#59d499","yellow":"#ffc531","blue":"#56c2ff","purple":"#cf2f98","cyan":"#52eee5","white":"#ffffff","brightBlack":"#000000","brightRed":"#ff6363","brightGreen":"#59d499","brightYellow":"#ffc531","brightBlue":"#56c2ff","brightPurple":"#cf2f98","brightCyan":"#52eee5","brightWhite":"#ffffff","background":"#1a1a1a","foreground":"#ffffff","cursorColor":"#cccccc","selectionBackground":"#333333","meta":{"isDark":true,"credits":[{"name":"thomaspaulmann","link":"https://github.com/thomaspaulmann"},{"name":"itsnwa","link":"https://github.com/itsnwa"}]}},{"name":"Raycast_Light","black":"#000000","red":"#b12424","green":"#006b4f","yellow":"#f8a300","blue":"#138af2","purple":"#9a1b6e","cyan":"#3eb8bf","white":"#ffffff","brightBlack":"#000000","brightRed":"#b12424","brightGreen":"#006b4f","brightYellow":"#f8a300","brightBlue":"#138af2","brightPurple":"#9a1b6e","brightCyan":"#3eb8bf","brightWhite":"#ffffff","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#e5e5e5","meta":{"isDark":false,"credits":[{"name":"thomaspaulmann","link":"https://github.com/thomaspaulmann"},{"name":"itsnwa","link":"https://github.com/itsnwa"}]}},{"name":"rebecca","black":"#12131e","red":"#dd7755","green":"#04dbb5","yellow":"#f2e7b7","blue":"#7aa5ff","purple":"#bf9cf9","cyan":"#56d3c2","white":"#e4e3e9","brightBlack":"#666699","brightRed":"#ff92cd","brightGreen":"#01eac0","brightYellow":"#fffca8","brightBlue":"#69c0fa","brightPurple":"#c17ff8","brightCyan":"#8bfde1","brightWhite":"#f4f2f9","background":"#292a44","foreground":"#e8e6ed","cursorColor":"#b89bf9","selectionBackground":"#663399","meta":{"isDark":true,"credits":[{"name":"vic","link":"https://github.com/vic"}]}},{"name":"Red Alert","black":"#000000","red":"#d62e4e","green":"#71be6b","yellow":"#beb86b","blue":"#489bee","purple":"#e979d7","cyan":"#6bbeb8","white":"#d6d6d6","brightBlack":"#262626","brightRed":"#e02553","brightGreen":"#aff08c","brightYellow":"#dfddb7","brightBlue":"#65aaf1","brightPurple":"#ddb7df","brightCyan":"#b7dfdd","brightWhite":"#ffffff","background":"#762423","foreground":"#ffffff","cursorColor":"#ffffff","selectionBackground":"#073642","meta":{"isDark":true,"credits":null}},{"name":"Red Planet","black":"#202020","red":"#8c3432","green":"#728271","yellow":"#e8bf6a","blue":"#69819e","purple":"#896492","cyan":"#5b8390","white":"#b9aa99","brightBlack":"#676767","brightRed":"#b55242","brightGreen":"#869985","brightYellow":"#ebeb91","brightBlue":"#60827e","brightPurple":"#de4974","brightCyan":"#38add8","brightWhite":"#d6bfb8","background":"#222222","foreground":"#c2b790","cursorColor":"#c2b790","selectionBackground":"#1b324a","meta":{"isDark":true,"credits":[{"name":"ibrokemypie","link":"https://github.com/ibrokemypie"},{"name":"eliquious","link":"https://github.com/eliquious"}]}},{"name":"Red Sands","black":"#000000","red":"#ff3f00","green":"#00bb00","yellow":"#e7b000","blue":"#0072ff","purple":"#bb00bb","cyan":"#00bbbb","white":"#bbbbbb","brightBlack":"#555555","brightRed":"#bb0000","brightGreen":"#00bb00","brightYellow":"#e7b000","brightBlue":"#0072ae","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#7a251e","foreground":"#d7c9a7","cursorColor":"#ffffff","selectionBackground":"#a4a390","meta":{"isDark":true,"credits":null}},{"name":"Relaxed","black":"#151515","red":"#bc5653","green":"#909d63","yellow":"#ebc17a","blue":"#6a8799","purple":"#b06698","cyan":"#c9dfff","white":"#d9d9d9","brightBlack":"#636363","brightRed":"#bc5653","brightGreen":"#a0ac77","brightYellow":"#ebc17a","brightBlue":"#7eaac7","brightPurple":"#b06698","brightCyan":"#acbbd0","brightWhite":"#f7f7f7","background":"#353a44","foreground":"#d9d9d9","cursorColor":"#d9d9d9","selectionBackground":"#6a7985","meta":{"isDark":true,"credits":null}},{"name":"Retro","black":"#13a10e","red":"#13a10e","green":"#13a10e","yellow":"#13a10e","blue":"#13a10e","purple":"#13a10e","cyan":"#13a10e","white":"#13a10e","brightBlack":"#16ba10","brightRed":"#16ba10","brightGreen":"#16ba10","brightYellow":"#16ba10","brightBlue":"#16ba10","brightPurple":"#16ba10","brightCyan":"#16ba10","brightWhite":"#16ba10","background":"#000000","foreground":"#13a10e","cursorColor":"#13a10e","selectionBackground":"#ffffff","meta":{"isDark":true,"credits":null}},{"name":"Retrowave","background":"#070825","foreground":"#46BDFF","cyan":"#df81fc","brightYellow":"#ffffff","brightBlack":"#FF16B0","brightGreen":"#fcee54","green":"#929292","brightRed":"#f85353","brightWhite":"#ffffff","blue":"#46BDFF","brightBlue":"#46BDFF","brightCyan":"#ff901f","brightPurple":"#FF92DF","purple":"#FF92DF","red":"#FF16B0","white":"#FFFFFF","black":"#181A1F","yellow":"#fcee54","meta":{"isDark":true,"credits":[{"name":"Chrissy LeMaire","link":"https://github.com/potatoqualitee"}]}},{"name":"Rippedcasts","black":"#000000","red":"#cdaf95","green":"#a8ff60","yellow":"#bfbb1f","blue":"#75a5b0","purple":"#ff73fd","cyan":"#5a647e","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#eecbad","brightGreen":"#bcee68","brightYellow":"#e5e500","brightBlue":"#86bdc9","brightPurple":"#e500e5","brightCyan":"#8c9bc4","brightWhite":"#e5e5e5","background":"#2b2b2b","foreground":"#ffffff","cursorColor":"#7f7f7f","selectionBackground":"#5a647e","meta":{"isDark":true,"credits":[{"name":"mdw123","link":"https://github.com/mdw123/rippedcasts"}]}},{"name":"Rose Pine","black":"#706e86","red":"#eb6f92","green":"#9ccfd8","yellow":"#f6c177","blue":"#31748f","purple":"#c4a7e7","cyan":"#ebbcba","white":"#e0def4","brightBlack":"#706e86","brightRed":"#eb6f92","brightGreen":"#9ccfd8","brightYellow":"#f6c177","brightBlue":"#31748f","brightPurple":"#c4a7e7","brightCyan":"#ebbcba","brightWhite":"#e0def4","background":"#191724","foreground":"#e0def4","meta":{"isDark":true,"credits":null}},{"name":"rose-pine","black":"#26233a","red":"#eb6f92","green":"#9ccfd8","yellow":"#f6c177","blue":"#31748f","purple":"#c4a7e7","cyan":"#ebbcba","white":"#e0def4","brightBlack":"#6e6a86","brightRed":"#eb6f92","brightGreen":"#9ccfd8","brightYellow":"#f6c177","brightBlue":"#31748f","brightPurple":"#c4a7e7","brightCyan":"#ebbcba","brightWhite":"#e0def4","background":"#191724","foreground":"#e0def4","cursorColor":"#e0def4","selectionBackground":"#191724","meta":{"isDark":true,"credits":null}},{"name":"rose-pine-dawn","black":"#f2e9e1","red":"#b4637a","green":"#56949f","yellow":"#ea9d34","blue":"#286983","purple":"#907aa9","cyan":"#d7827e","white":"#575279","brightBlack":"#9893a5","brightRed":"#b4637a","brightGreen":"#56949f","brightYellow":"#ea9d34","brightBlue":"#286983","brightPurple":"#907aa9","brightCyan":"#d7827e","brightWhite":"#575279","background":"#faf4ed","foreground":"#575279","cursorColor":"#575279","selectionBackground":"#faf4ed","meta":{"isDark":false,"credits":null}},{"name":"rose-pine-moon","black":"#393552","red":"#eb6f92","green":"#9ccfd8","yellow":"#f6c177","blue":"#3e8fb0","purple":"#c4a7e7","cyan":"#ea9a97","white":"#e0def4","brightBlack":"#6e6a86","brightRed":"#eb6f92","brightGreen":"#9ccfd8","brightYellow":"#f6c177","brightBlue":"#3e8fb0","brightPurple":"#c4a7e7","brightCyan":"#ea9a97","brightWhite":"#e0def4","background":"#232136","foreground":"#e0def4","cursorColor":"#e0def4","selectionBackground":"#232136","meta":{"isDark":true,"credits":null}},{"name":"Rouge 2","black":"#5d5d6b","red":"#c6797e","green":"#969e92","yellow":"#dbcdab","blue":"#6e94b9","purple":"#4c4e78","cyan":"#8ab6c1","white":"#e8e8ea","brightBlack":"#616274","brightRed":"#c6797e","brightGreen":"#e6dcc4","brightYellow":"#e6dcc4","brightBlue":"#98b3cd","brightPurple":"#8283a1","brightCyan":"#abcbd3","brightWhite":"#e8e8ea","background":"#17182b","foreground":"#a2a3aa","cursorColor":"#969e92","selectionBackground":"#5d5d6b","meta":{"isDark":true,"credits":[{"name":"Josef Aidt","link":"https://github.com/josefaidt/rouge-theme"},{"name":"Sam Rose","link":"https://github.com/samrose3"}]}},{"name":"Royal","black":"#241f2b","red":"#91284c","green":"#23801c","yellow":"#b49d27","blue":"#6580b0","purple":"#674d96","cyan":"#8aaabe","white":"#524966","brightBlack":"#312d3d","brightRed":"#d5356c","brightGreen":"#2cd946","brightYellow":"#fde83b","brightBlue":"#90baf9","brightPurple":"#a479e3","brightCyan":"#acd4eb","brightWhite":"#9e8cbd","background":"#100815","foreground":"#514968","cursorColor":"#524966","selectionBackground":"#1f1d2b","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Ryuuko","black":"#2c3941","red":"#865f5b","green":"#66907d","yellow":"#b1a990","blue":"#6a8e95","purple":"#b18a73","cyan":"#88b2ac","white":"#ececec","brightBlack":"#5d7079","brightRed":"#865f5b","brightGreen":"#66907d","brightYellow":"#b1a990","brightBlue":"#6a8e95","brightPurple":"#b18a73","brightCyan":"#88b2ac","brightWhite":"#ececec","background":"#2c3941","foreground":"#ececec","cursorColor":"#ececec","selectionBackground":"#002831","meta":{"isDark":true,"credits":[{"name":"dylanaraps","link":"https://github.com/dylanaraps"},{"name":"iandrewt","link":"https://github.com/iandrewt"}]}},{"name":"Sakura","black":"#000000","red":"#d52370","green":"#41af1a","yellow":"#bc7053","blue":"#6964ab","purple":"#c71fbf","cyan":"#939393","white":"#998eac","brightBlack":"#786d69","brightRed":"#f41d99","brightGreen":"#22e529","brightYellow":"#f59574","brightBlue":"#9892f1","brightPurple":"#e90cdd","brightCyan":"#eeeeee","brightWhite":"#cbb6ff","background":"#18131e","foreground":"#dd7bdc","cursorColor":"#ff65fd","selectionBackground":"#c05cbf","meta":{"isDark":true,"credits":[{"name":"0xN0ri","link":"https://github.com/0xN0ri"},{"name":"zdj","link":"https://github.com/zdj"}]}},{"name":"Scarlet Protocol","black":"#101116","red":"#ff0051","green":"#00dc84","yellow":"#faf945","blue":"#0271b6","purple":"#ca30c7","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#ff6e67","brightGreen":"#5ffa68","brightYellow":"#fffc67","brightBlue":"#6871ff","brightPurple":"#bd35ec","brightCyan":"#60fdff","brightWhite":"#ffffff","background":"#1c153d","foreground":"#e41951","cursorColor":"#76ff9f","selectionBackground":"#c1deff","meta":{"isDark":true,"credits":[{"name":"ReagentX","link":"https://github.com/ReagentX"}]}},{"name":"Seafoam Pastel","black":"#757575","red":"#825d4d","green":"#728c62","yellow":"#ada16d","blue":"#4d7b82","purple":"#8a7267","cyan":"#729494","white":"#e0e0e0","brightBlack":"#8a8a8a","brightRed":"#cf937a","brightGreen":"#98d9aa","brightYellow":"#fae79d","brightBlue":"#7ac3cf","brightPurple":"#d6b2a1","brightCyan":"#ade0e0","brightWhite":"#e0e0e0","background":"#243435","foreground":"#d4e7d4","cursorColor":"#57647a","selectionBackground":"#ffffff","meta":{"isDark":true,"credits":null}},{"name":"SeaShells","black":"#17384c","red":"#d15123","green":"#027c9b","yellow":"#fca02f","blue":"#1e4950","purple":"#68d4f1","cyan":"#50a3b5","white":"#deb88d","brightBlack":"#434b53","brightRed":"#d48678","brightGreen":"#628d98","brightYellow":"#fdd39f","brightBlue":"#1bbcdd","brightPurple":"#bbe3ee","brightCyan":"#87acb4","brightWhite":"#fee4ce","background":"#09141b","foreground":"#deb88d","cursorColor":"#fca02f","selectionBackground":"#1e4962","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"seoulbones_dark","black":"#4b4b4b","red":"#e388a3","green":"#98bd99","yellow":"#ffdf9b","blue":"#97bdde","purple":"#a5a6c5","cyan":"#6fbdbe","white":"#dddddd","brightBlack":"#6c6465","brightRed":"#eb99b1","brightGreen":"#8fcd92","brightYellow":"#ffe5b3","brightBlue":"#a2c8e9","brightPurple":"#b2b3da","brightCyan":"#6bcacb","brightWhite":"#a8a8a8","background":"#4b4b4b","foreground":"#dddddd","cursorColor":"#e2e2e2","selectionBackground":"#777777","meta":{"isDark":true,"credits":null}},{"name":"seoulbones_light","black":"#e2e2e2","red":"#dc5284","green":"#628562","yellow":"#c48562","blue":"#0084a3","purple":"#896788","cyan":"#008586","white":"#555555","brightBlack":"#bfbabb","brightRed":"#be3c6d","brightGreen":"#487249","brightYellow":"#a76b48","brightBlue":"#006f89","brightPurple":"#7f4c7e","brightCyan":"#006f70","brightWhite":"#777777","background":"#e2e2e2","foreground":"#555555","cursorColor":"#555555","selectionBackground":"#cccccc","meta":{"isDark":false,"credits":null}},{"name":"Serendipity Midnight","background":"#1C1E2D","foreground":"#DEE0EF","cursorColor":"#6B6D7C","selectionBackground":"#2C2E3D","black":"#232534","brightBlack":"#8D8F9E","blue":"#5BA2D0","brightBlue":"#5BA2D0","cyan":"#94B8FF","brightCyan":"#94B8FF","purple":"#A78BFA","brightPurple":"#A78BFA","white":"#DEE0EF","brightWhite":"#DEE0EF","green":"#9CCFD8","brightGreen":"#9CCFD8","red":"#EE8679","brightRed":"#EE8679","yellow":"#F8D2C9","brightYellow":"#F8D2C9","meta":{"isDark":true,"credits":[{"name":"Michael Andreuzza","link":"https://github.com/michael-andreuzza"},{"name":"Chaphasilor","link":"https://github.com/Chaphasilor"}]}},{"name":"Serendipity Morning","background":"#FFFAF3","foreground":"#575279","cursorColor":"#9893A5","selectionBackground":"#F4EFEA","black":"#F2E9DE","brightBlack":"#6E6A86","blue":"#3788BE","brightBlue":"#3788BE","cyan":"#7397DE","brightCyan":"#7397DE","purple":"#886CDB","brightPurple":"#886CDB","white":"#575279","brightWhite":"#575279","green":"#77AAB3","brightGreen":"#77AAB3","red":"#D26A5D","brightRed":"#D26A5D","yellow":"#C8A299","brightYellow":"#C8A299","meta":{"isDark":false,"credits":[{"name":"Michael Andreuzza","link":"https://github.com/michael-andreuzza"},{"name":"Chaphasilor","link":"https://github.com/Chaphasilor"}]}},{"name":"Serendipity Sunset","background":"#272938","foreground":"#DEE0EF","cursorColor":"#8D8F9E","selectionBackground":"#313342","black":"#363847","brightBlack":"#6B6D7C","blue":"#709BBD","brightBlue":"#709BBD","cyan":"#A0B6E8","brightCyan":"#A0B6E8","purple":"#A392DC","brightPurple":"#A392DC","white":"#DEE0EF","brightWhite":"#DEE0EF","green":"#AAC9D4","brightGreen":"#AAC9D4","red":"#D1918F","brightRed":"#D1918F","yellow":"#EDD5D6","brightYellow":"#EDD5D6","meta":{"isDark":true,"credits":[{"name":"Michael Andreuzza","link":"https://github.com/michael-andreuzza"},{"name":"Chaphasilor","link":"https://github.com/Chaphasilor"}]}},{"name":"Seti","black":"#323232","red":"#c22832","green":"#8ec43d","yellow":"#e0c64f","blue":"#43a5d5","purple":"#8b57b5","cyan":"#8ec43d","white":"#eeeeee","brightBlack":"#323232","brightRed":"#c22832","brightGreen":"#8ec43d","brightYellow":"#e0c64f","brightBlue":"#43a5d5","brightPurple":"#8b57b5","brightCyan":"#8ec43d","brightWhite":"#ffffff","background":"#111213","foreground":"#cacecd","cursorColor":"#e3bf21","selectionBackground":"#303233","meta":{"isDark":true,"credits":[{"name":"jesseweed","link":"https://github.com/jesseweed/seti-syntax/"},{"name":"philduffy","link":"https://github.com/willmanduffy/seti-iterm"}]}},{"name":"shades-of-purple","black":"#000000","red":"#d90429","green":"#3ad900","yellow":"#ffe700","blue":"#6943ff","purple":"#ff2c70","cyan":"#00c5c7","white":"#c7c7c7","brightBlack":"#686868","brightRed":"#f92a1c","brightGreen":"#43d426","brightYellow":"#f1d000","brightBlue":"#6871ff","brightPurple":"#ff77ff","brightCyan":"#79e8fb","brightWhite":"#ffffff","background":"#1e1d40","foreground":"#ffffff","cursorColor":"#fad000","selectionBackground":"#b362ff","meta":{"isDark":true,"credits":[{"name":"ahmadawais","link":"https://github.com/ahmadawais/shades-of-purple-iterm2"},{"name":"fr3fou","link":"https://github.com/fr3fou"}]}},{"name":"Shaman","black":"#012026","red":"#b2302d","green":"#00a941","yellow":"#5e8baa","blue":"#449a86","purple":"#00599d","cyan":"#5d7e19","white":"#405555","brightBlack":"#384451","brightRed":"#ff4242","brightGreen":"#2aea5e","brightYellow":"#8ed4fd","brightBlue":"#61d5ba","brightPurple":"#1298ff","brightCyan":"#98d028","brightWhite":"#58fbd6","background":"#001015","foreground":"#405555","cursorColor":"#4afcd6","selectionBackground":"#415555","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Slate","black":"#222222","red":"#e2a8bf","green":"#81d778","yellow":"#c4c9c0","blue":"#264b49","purple":"#a481d3","cyan":"#15ab9c","white":"#02c5e0","brightBlack":"#ffffff","brightRed":"#ffcdd9","brightGreen":"#beffa8","brightYellow":"#d0ccca","brightBlue":"#7ab0d2","brightPurple":"#c5a7d9","brightCyan":"#8cdfe0","brightWhite":"#e0e0e0","background":"#222222","foreground":"#35b1d2","cursorColor":"#87d3c4","selectionBackground":"#0f3754","meta":{"isDark":true,"credits":[{"name":"deneshshan","link":"https://github.com/deneshshan"}]}},{"name":"SleepyHollow","black":"#572100","red":"#ba3934","green":"#91773f","yellow":"#b55600","blue":"#5f63b4","purple":"#a17c7b","cyan":"#8faea9","white":"#af9a91","brightBlack":"#4e4b61","brightRed":"#d9443f","brightGreen":"#d6b04e","brightYellow":"#f66813","brightBlue":"#8086ef","brightPurple":"#e2c2bb","brightCyan":"#a4dce7","brightWhite":"#d2c7a9","background":"#121214","foreground":"#af9a91","cursorColor":"#af9a91","selectionBackground":"#575256","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Smyck","black":"#000000","red":"#b84131","green":"#7da900","yellow":"#c4a500","blue":"#62a3c4","purple":"#ba8acc","cyan":"#207383","white":"#a1a1a1","brightBlack":"#7a7a7a","brightRed":"#d6837c","brightGreen":"#c4f137","brightYellow":"#fee14d","brightBlue":"#8dcff0","brightPurple":"#f79aff","brightCyan":"#6ad9cf","brightWhite":"#f7f7f7","background":"#1b1b1b","foreground":"#f7f7f7","cursorColor":"#bbbbbb","selectionBackground":"#207483","meta":{"isDark":true,"credits":[{"name":"hukl","link":"https://github.com/hukl/Smyck-Color-Scheme"}]}},{"name":"Snazzy","black":"#000000","red":"#fc4346","green":"#50fb7c","yellow":"#f0fb8c","blue":"#49baff","purple":"#fc4cb4","cyan":"#8be9fe","white":"#ededec","brightBlack":"#555555","brightRed":"#fc4346","brightGreen":"#50fb7c","brightYellow":"#f0fb8c","brightBlue":"#49baff","brightPurple":"#fc4cb4","brightCyan":"#8be9fe","brightWhite":"#ededec","background":"#1e1f29","foreground":"#ebece6","cursorColor":"#e4e4e4","selectionBackground":"#81aec6","meta":{"isDark":true,"credits":null}},{"name":"SoftServer","black":"#000000","red":"#a2686a","green":"#9aa56a","yellow":"#a3906a","blue":"#6b8fa3","purple":"#6a71a3","cyan":"#6ba58f","white":"#99a3a2","brightBlack":"#666c6c","brightRed":"#dd5c60","brightGreen":"#bfdf55","brightYellow":"#deb360","brightBlue":"#62b1df","brightPurple":"#606edf","brightCyan":"#64e39c","brightWhite":"#d2e0de","background":"#242626","foreground":"#99a3a2","cursorColor":"#d2e0de","selectionBackground":"#7f8786","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Solarized Darcula","black":"#25292a","red":"#f24840","green":"#629655","yellow":"#b68800","blue":"#2075c7","purple":"#797fd4","cyan":"#15968d","white":"#d2d8d9","brightBlack":"#25292a","brightRed":"#f24840","brightGreen":"#629655","brightYellow":"#b68800","brightBlue":"#2075c7","brightPurple":"#797fd4","brightCyan":"#15968d","brightWhite":"#d2d8d9","background":"#3d3f41","foreground":"#d2d8d9","cursorColor":"#708284","selectionBackground":"#214283","meta":{"isDark":true,"credits":[{"name":"@rickhanlonii","link":"https://github.com/rickhanlonii"}]}},{"name":"Solarized Dark - Patched","black":"#002831","red":"#d11c24","green":"#738a05","yellow":"#a57706","blue":"#2176c7","purple":"#c61c6f","cyan":"#259286","white":"#eae3cb","brightBlack":"#475b62","brightRed":"#bd3613","brightGreen":"#475b62","brightYellow":"#536870","brightBlue":"#708284","brightPurple":"#5956ba","brightCyan":"#819090","brightWhite":"#fcf4dc","background":"#001e27","foreground":"#708284","cursorColor":"#708284","selectionBackground":"#002831","meta":{"isDark":true,"credits":null}},{"name":"Solarized Dark Higher Contrast","black":"#002831","red":"#d11c24","green":"#6cbe6c","yellow":"#a57706","blue":"#2176c7","purple":"#c61c6f","cyan":"#259286","white":"#eae3cb","brightBlack":"#006488","brightRed":"#f5163b","brightGreen":"#51ef84","brightYellow":"#b27e28","brightBlue":"#178ec8","brightPurple":"#e24d8e","brightCyan":"#00b39e","brightWhite":"#fcf4dc","background":"#001e27","foreground":"#9cc2c3","cursorColor":"#f34b00","selectionBackground":"#003748","meta":{"isDark":true,"credits":[{"name":"heisters","link":"https://gist.github.com/heisters/1015503"}]}},{"name":"Sonoran Gothic","foreground":"#EAF4DE","background":"#241F17","cursorColor":"#EAF4DE","black":"#867F6E","red":"#EB6f6f","green":"#669C50","yellow":"#F2D696","blue":"#227B4d","purple":"#A5ABDA","cyan":"#E18F62","white":"#EAF4DE","brightBlack":"#867F6E","brightRed":"#EB6f6f","brightGreen":"#669C50","brightYellow":"#F2D696","brightBlue":"#227B4D","brightPurple":"#A5ABDA","brightCyan":"#E18F62","brightWhite":"#EAF4DE","meta":{"isDark":true,"credits":[{"name":"d-mckee","link":"https://github.com/d-mckee"}]}},{"name":"Sonoran Sunrise","foreground":"#61543E","background":"#F9FAE3","cursorColor":"#61543E","selectionBackground":"#a4f017","black":"#F9FAE3","red":"#EB6f6f","green":"#669C50","yellow":"#F2C55C","blue":"#227B4D","purple":"#7189D9","cyan":"#E07941","white":"#665E4B","brightBlack":"#F9FAE3","brightRed":"#EB6f6f","brightGreen":"#669C50","brightYellow":"#F2C55C","brightBlue":"#227B4D","brightPurple":"#7189D9","brightCyan":"#E07941","brightWhite":"#665E4B","meta":{"isDark":false,"credits":[{"name":"d-mckee","link":"https://github.com/d-mckee"}]}},{"name":"Spacedust","black":"#6e5346","red":"#e35b00","green":"#5cab96","yellow":"#e3cd7b","blue":"#0f548b","purple":"#e35b00","cyan":"#06afc7","white":"#f0f1ce","brightBlack":"#684c31","brightRed":"#ff8a3a","brightGreen":"#aecab8","brightYellow":"#ffc878","brightBlue":"#67a0ce","brightPurple":"#ff8a3a","brightCyan":"#83a7b4","brightWhite":"#fefff1","background":"#0a1e24","foreground":"#ecf0c1","cursorColor":"#708284","selectionBackground":"#0a385c","meta":{"isDark":true,"credits":[{"name":"mhallendal","link":"https://github.com/mhallendal/spacedust-theme"},{"name":"Couto","link":"https://github.com/Couto"}]}},{"name":"SpaceGray","black":"#000000","red":"#b04b57","green":"#87b379","yellow":"#e5c179","blue":"#7d8fa4","purple":"#a47996","cyan":"#85a7a5","white":"#b3b8c3","brightBlack":"#000000","brightRed":"#b04b57","brightGreen":"#87b379","brightYellow":"#e5c179","brightBlue":"#7d8fa4","brightPurple":"#a47996","brightCyan":"#85a7a5","brightWhite":"#ffffff","background":"#20242d","foreground":"#b3b8c3","cursorColor":"#b3b8c3","selectionBackground":"#16181e","meta":{"isDark":true,"credits":[{"name":"ryentzer","link":"https://github.com/ryentzer/SpaceGray-iTerm"}]}},{"name":"SpaceGray Eighties","black":"#15171c","red":"#ec5f67","green":"#81a764","yellow":"#fec254","blue":"#5486c0","purple":"#bf83c1","cyan":"#57c2c1","white":"#efece7","brightBlack":"#555555","brightRed":"#ff6973","brightGreen":"#93d493","brightYellow":"#ffd256","brightBlue":"#4d84d1","brightPurple":"#ff55ff","brightCyan":"#83e9e4","brightWhite":"#ffffff","background":"#222222","foreground":"#bdbaae","cursorColor":"#bbbbbb","selectionBackground":"#272e35","meta":{"isDark":true,"credits":[{"name":"mhkeller","link":"https://github.com/mhkeller/spacegray-eighties-iterm"}]}},{"name":"SpaceGray Eighties Dull","black":"#15171c","red":"#b24a56","green":"#92b477","yellow":"#c6735a","blue":"#7c8fa5","purple":"#a5789e","cyan":"#80cdcb","white":"#b3b8c3","brightBlack":"#555555","brightRed":"#ec5f67","brightGreen":"#89e986","brightYellow":"#fec254","brightBlue":"#5486c0","brightPurple":"#bf83c1","brightCyan":"#58c2c1","brightWhite":"#ffffff","background":"#222222","foreground":"#c9c6bc","cursorColor":"#bbbbbb","selectionBackground":"#272e36","meta":{"isDark":true,"credits":[{"name":"mhkeller","link":"https://github.com/mhkeller/spacegray-eighties-iterm"}]}},{"name":"Spiderman","black":"#1b1d1e","red":"#e60813","green":"#e22928","yellow":"#e24756","blue":"#2c3fff","purple":"#2435db","cyan":"#3256ff","white":"#fffef6","brightBlack":"#505354","brightRed":"#ff0325","brightGreen":"#ff3338","brightYellow":"#fe3a35","brightBlue":"#1d50ff","brightPurple":"#747cff","brightCyan":"#6184ff","brightWhite":"#fffff9","background":"#1b1d1e","foreground":"#e3e3e3","cursorColor":"#2c3fff","selectionBackground":"#070e50","meta":{"isDark":true,"credits":[{"name":"pyrophos","link":"https://github.com/pyrophos"}]}},{"name":"Spring","black":"#000000","red":"#ff4d83","green":"#1f8c3b","yellow":"#1fc95b","blue":"#1dd3ee","purple":"#8959a8","cyan":"#3e999f","white":"#ffffff","brightBlack":"#000000","brightRed":"#ff0021","brightGreen":"#1fc231","brightYellow":"#d5b807","brightBlue":"#15a9fd","brightPurple":"#8959a8","brightCyan":"#3e999f","brightWhite":"#ffffff","background":"#ffffff","foreground":"#4d4d4c","cursorColor":"#4d4d4c","selectionBackground":"#d6d6d6","meta":{"isDark":false,"credits":[{"name":"t3chnoboy","link":"https://github.com/t3chnoboy/spring-iTerm"}]}},{"name":"Square","black":"#050505","red":"#e9897c","green":"#b6377d","yellow":"#ecebbe","blue":"#a9cdeb","purple":"#75507b","cyan":"#c9caec","white":"#f2f2f2","brightBlack":"#141414","brightRed":"#f99286","brightGreen":"#c3f786","brightYellow":"#fcfbcc","brightBlue":"#b6defb","brightPurple":"#ad7fa8","brightCyan":"#d7d9fc","brightWhite":"#e2e2e2","background":"#1a1a1a","foreground":"#acacab","cursorColor":"#fcfbcc","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"baskerville","link":"https://github.com/baskerville/iTerm-2-Color-Themes"}]}},{"name":"Sublette","black":"#253045","red":"#ee5577","green":"#55ee77","yellow":"#ffdd88","blue":"#5588ff","purple":"#ff77cc","cyan":"#44eeee","white":"#f5f5da","brightBlack":"#405570","brightRed":"#ee6655","brightGreen":"#99ee77","brightYellow":"#ffff77","brightBlue":"#77bbff","brightPurple":"#aa88ff","brightCyan":"#55ffbb","brightWhite":"#ffffee","background":"#202535","foreground":"#ccced0","cursorColor":"#ccced0","selectionBackground":"#ccced0","meta":{"isDark":true,"credits":[{"name":"sublee","link":"https://github.com/sublee"}]}},{"name":"Subliminal","black":"#7f7f7f","red":"#e15a60","green":"#a9cfa4","yellow":"#ffe2a9","blue":"#6699cc","purple":"#f1a5ab","cyan":"#5fb3b3","white":"#d4d4d4","brightBlack":"#7f7f7f","brightRed":"#e15a60","brightGreen":"#a9cfa4","brightYellow":"#ffe2a9","brightBlue":"#6699cc","brightPurple":"#f1a5ab","brightCyan":"#5fb3b3","brightWhite":"#d4d4d4","background":"#282c35","foreground":"#d4d4d4","cursorColor":"#c7c7c7","selectionBackground":"#484e5b","meta":{"isDark":true,"credits":[{"name":"gdsrosa","link":"https://github.com/gdsrosa/subliminal-itermcolors"}]}},{"name":"Sundried","black":"#302b2a","red":"#a7463d","green":"#587744","yellow":"#9d602a","blue":"#485b98","purple":"#864651","cyan":"#9c814f","white":"#c9c9c9","brightBlack":"#4d4e48","brightRed":"#aa000c","brightGreen":"#128c21","brightYellow":"#fc6a21","brightBlue":"#7999f7","brightPurple":"#fd8aa1","brightCyan":"#fad484","brightWhite":"#ffffff","background":"#1a1818","foreground":"#c9c9c9","cursorColor":"#ffffff","selectionBackground":"#302b2a","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Symfonic","black":"#000000","red":"#dc322f","green":"#56db3a","yellow":"#ff8400","blue":"#0084d4","purple":"#b729d9","cyan":"#ccccff","white":"#ffffff","brightBlack":"#1b1d21","brightRed":"#dc322f","brightGreen":"#56db3a","brightYellow":"#ff8400","brightBlue":"#0084d4","brightPurple":"#b729d9","brightCyan":"#ccccff","brightWhite":"#ffffff","background":"#000000","foreground":"#ffffff","cursorColor":"#dc322f","selectionBackground":"#073642","meta":{"isDark":true,"credits":[{"name":"Symfony","link":"http://symfony.com/doc/current/book/index.html"}]}},{"name":"synthwave","black":"#000000","red":"#f6188f","green":"#1ebb2b","yellow":"#fdf834","blue":"#2186ec","purple":"#f85a21","cyan":"#12c3e2","white":"#ffffff","brightBlack":"#000000","brightRed":"#f841a0","brightGreen":"#25c141","brightYellow":"#fdf454","brightBlue":"#2f9ded","brightPurple":"#f97137","brightCyan":"#19cde6","brightWhite":"#ffffff","background":"#000000","foreground":"#dad9c7","cursorColor":"#19cde6","selectionBackground":"#19cde6","meta":{"isDark":true,"credits":[{"name":"brettstil","link":"https://github.com/brettstil/"}]}},{"name":"synthwave-everything","black":"#fefefe","red":"#f97e72","green":"#72f1b8","yellow":"#fede5d","blue":"#6d77b3","purple":"#c792ea","cyan":"#f772e0","white":"#fefefe","brightBlack":"#fefefe","brightRed":"#f88414","brightGreen":"#72f1b8","brightYellow":"#fff951","brightBlue":"#36f9f6","brightPurple":"#e1acff","brightCyan":"#f92aad","brightWhite":"#fefefe","background":"#2a2139","foreground":"#f0eff1","cursorColor":"#72f1b8","selectionBackground":"#181521","meta":{"isDark":true,"credits":[{"name":"smithbm2316","link":"https://github.com/smithbm2316"},{"name":"robb0wen","link":"https://github.com/robb0wen"}]}},{"name":"SynthwaveAlpha","black":"#241b30","red":"#e60a70","green":"#00986c","yellow":"#adad3e","blue":"#6e29ad","purple":"#b300ad","cyan":"#00b0b1","white":"#b9b1bc","brightBlack":"#7f7094","brightRed":"#e60a70","brightGreen":"#0ae4a4","brightYellow":"#f9f972","brightBlue":"#aa54f9","brightPurple":"#ff00f6","brightCyan":"#00fbfd","brightWhite":"#f2f2e3","background":"#241b30","foreground":"#f2f2e3","cursorColor":"#f2f2e3","selectionBackground":"#6e29ad","meta":{"isDark":true,"credits":null}},{"name":"Tango Adapted","black":"#000000","red":"#ff0000","green":"#59d600","yellow":"#f0cb00","blue":"#00a2ff","purple":"#c17ecc","cyan":"#00d0d6","white":"#e6ebe1","brightBlack":"#8f928b","brightRed":"#ff0013","brightGreen":"#93ff00","brightYellow":"#fff121","brightBlue":"#88c9ff","brightPurple":"#e9a7e1","brightCyan":"#00feff","brightWhite":"#f6f6f4","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#c1deff","meta":{"isDark":false,"credits":[{"name":"crowsonkb","link":"https://github.com/crowsonkb"},{"name":"iterm_schemer","link":"https://github.com/crowsonkb/iterm_schemer"}]}},{"name":"Tango Half Adapted","black":"#000000","red":"#ff0000","green":"#4cc300","yellow":"#e2c000","blue":"#008ef6","purple":"#a96cb3","cyan":"#00bdc3","white":"#e0e5db","brightBlack":"#797d76","brightRed":"#ff0013","brightGreen":"#8af600","brightYellow":"#ffec00","brightBlue":"#76bfff","brightPurple":"#d898d1","brightCyan":"#00f6fa","brightWhite":"#f4f4f2","background":"#ffffff","foreground":"#000000","cursorColor":"#000000","selectionBackground":"#c1deff","meta":{"isDark":false,"credits":[{"name":"crowsonkb","link":"https://github.com/crowsonkb"},{"name":"iterm_schemer","link":"https://github.com/crowsonkb/iterm_schemer"}]}},{"name":"Teerb","black":"#1c1c1c","red":"#d68686","green":"#aed686","yellow":"#d7af87","blue":"#86aed6","purple":"#d6aed6","cyan":"#8adbb4","white":"#d0d0d0","brightBlack":"#1c1c1c","brightRed":"#d68686","brightGreen":"#aed686","brightYellow":"#e4c9af","brightBlue":"#86aed6","brightPurple":"#d6aed6","brightCyan":"#b1e7dd","brightWhite":"#efefef","background":"#262626","foreground":"#d0d0d0","cursorColor":"#e4c9af","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"Teerb","link":"https://gist.github.com/teerb/1360453"}]}},{"name":"terafox","black":"#2f3239","red":"#e85c51","green":"#7aa4a1","yellow":"#fda47f","blue":"#5a93aa","purple":"#ad5c7c","cyan":"#a1cdd8","white":"#ebebeb","brightBlack":"#4e5157","brightRed":"#eb746b","brightGreen":"#8eb2af","brightYellow":"#fdb292","brightBlue":"#73a3b7","brightPurple":"#b97490","brightCyan":"#afd4de","brightWhite":"#eeeeee","background":"#152528","foreground":"#e6eaea","cursorColor":"#e6eaea","selectionBackground":"#293e40","meta":{"isDark":true,"credits":null}},{"name":"Terminal Basic","black":"#000000","red":"#990000","green":"#00a600","yellow":"#999900","blue":"#0000b2","purple":"#b200b2","cyan":"#00a6b2","white":"#bfbfbf","brightBlack":"#666666","brightRed":"#e50000","brightGreen":"#00d900","brightYellow":"#e5e500","brightBlue":"#0000ff","brightPurple":"#e500e5","brightCyan":"#00e5e5","brightWhite":"#e5e5e5","background":"#ffffff","foreground":"#000000","cursorColor":"#7f7f7f","selectionBackground":"#a4c9ff","meta":{"isDark":false,"credits":null}},{"name":"Thayer Bright","black":"#1b1d1e","red":"#f92672","green":"#4df840","yellow":"#f4fd22","blue":"#2757d6","purple":"#8c54fe","cyan":"#38c8b5","white":"#ccccc6","brightBlack":"#505354","brightRed":"#ff5995","brightGreen":"#b6e354","brightYellow":"#feed6c","brightBlue":"#3f78ff","brightPurple":"#9e6ffe","brightCyan":"#23cfd5","brightWhite":"#f8f8f2","background":"#1b1d1e","foreground":"#f8f8f8","cursorColor":"#fc971f","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"t3chnoboy","link":"https://github.com/t3chnoboy/thayer-bright-iTerm"}]}},{"name":"The Hulk","black":"#1b1d1e","red":"#269d1b","green":"#13ce30","yellow":"#63e457","blue":"#2525f5","purple":"#641f74","cyan":"#378ca9","white":"#d9d8d1","brightBlack":"#505354","brightRed":"#8dff2a","brightGreen":"#48ff77","brightYellow":"#3afe16","brightBlue":"#506b95","brightPurple":"#72589d","brightCyan":"#4085a6","brightWhite":"#e5e6e1","background":"#1b1d1e","foreground":"#b5b5b5","cursorColor":"#16b61b","selectionBackground":"#4d504c","meta":{"isDark":true,"credits":[{"name":"pyrophos","link":"https://github.com/pyrophos"}]}},{"name":"Tinacious Design (Dark)","black":"#1d1d26","red":"#ff3399","green":"#00d364","yellow":"#ffcc66","blue":"#00cbff","purple":"#cc66ff","cyan":"#00ceca","white":"#cbcbf0","brightBlack":"#636667","brightRed":"#ff2f92","brightGreen":"#00d364","brightYellow":"#ffd479","brightBlue":"#00cbff","brightPurple":"#d783ff","brightCyan":"#00d5d4","brightWhite":"#d5d6f3","background":"#1d1d26","foreground":"#cbcbf0","cursorColor":"#cbcbf0","selectionBackground":"#ff3399","meta":{"isDark":true,"credits":[{"name":"Tina Holly","link":"https://tinaciousdesign.com"}]}},{"name":"Tinacious Design (Light)","black":"#1d1d26","red":"#ff3399","green":"#00d364","yellow":"#ffcc66","blue":"#00cbff","purple":"#cc66ff","cyan":"#00ceca","white":"#cbcbf0","brightBlack":"#636667","brightRed":"#ff2f92","brightGreen":"#00d364","brightYellow":"#ffd479","brightBlue":"#00cbff","brightPurple":"#d783ff","brightCyan":"#00d5d4","brightWhite":"#d5d6f3","background":"#f8f8ff","foreground":"#1d1d26","cursorColor":"#cbcbf0","selectionBackground":"#ff3399","meta":{"isDark":false,"credits":[{"name":"Tina Holly","link":"https://tinaciousdesign.com"}]}},{"name":"TokyoNight","black":"#363b54","red":"#f7768e","green":"#41a6b5","yellow":"#e0af68","blue":"#7aa2f7","purple":"#bb9af7","cyan":"#7dcfff","white":"#787c99","brightBlack":"#363b54","brightRed":"#f7768e","brightGreen":"#41a6b5","brightYellow":"#e0af68","brightBlue":"#7aa2f7","brightPurple":"#bb9af7","brightCyan":"#7dcfff","brightWhite":"#acb0d0","background":"#16161e","foreground":"#787c99","meta":{"isDark":true,"credits":null}},{"name":"tokyonight","black":"#15161e","red":"#f7768e","green":"#9ece6a","yellow":"#e0af68","blue":"#7aa2f7","purple":"#bb9af7","cyan":"#7dcfff","white":"#a9b1d6","brightBlack":"#414868","brightRed":"#f7768e","brightGreen":"#9ece6a","brightYellow":"#e0af68","brightBlue":"#7aa2f7","brightPurple":"#bb9af7","brightCyan":"#7dcfff","brightWhite":"#c0caf5","background":"#1a1b26","foreground":"#c0caf5","cursorColor":"#c0caf5","selectionBackground":"#33467c","meta":{"isDark":true,"credits":null}},{"name":"tokyonight-day","black":"#e9e9ed","red":"#f52a65","green":"#587539","yellow":"#8c6c3e","blue":"#2e7de9","purple":"#9854f1","cyan":"#007197","white":"#6172b0","brightBlack":"#a1a6c5","brightRed":"#f52a65","brightGreen":"#587539","brightYellow":"#8c6c3e","brightBlue":"#2e7de9","brightPurple":"#9854f1","brightCyan":"#007197","brightWhite":"#3760bf","background":"#e1e2e7","foreground":"#3760bf","cursorColor":"#3760bf","selectionBackground":"#99a7df","meta":{"isDark":false,"credits":null}},{"name":"tokyonight-storm","black":"#1d202f","red":"#f7768e","green":"#9ece6a","yellow":"#e0af68","blue":"#7aa2f7","purple":"#bb9af7","cyan":"#7dcfff","white":"#a9b1d6","brightBlack":"#414868","brightRed":"#f7768e","brightGreen":"#9ece6a","brightYellow":"#e0af68","brightBlue":"#7aa2f7","brightPurple":"#bb9af7","brightCyan":"#7dcfff","brightWhite":"#c0caf5","background":"#24283b","foreground":"#c0caf5","cursorColor":"#c0caf5","selectionBackground":"#364a82","meta":{"isDark":true,"credits":null}},{"name":"TokyoNightLight","black":"#0f0f14","red":"#8c4351","green":"#33635c","yellow":"#8f5e15","blue":"#34548a","purple":"#5a4a78","cyan":"#0f4b6e","white":"#828594","brightBlack":"#0f0f14","brightRed":"#8c4351","brightGreen":"#33635c","brightYellow":"#8f5e15","brightBlue":"#34548a","brightPurple":"#5a4a78","brightCyan":"#0f4b6e","brightWhite":"#828594","background":"#cbccd1","foreground":"#4c505e","meta":{"isDark":false,"credits":null}},{"name":"TokyoNightStorm","black":"#3b4261","red":"#f7768e","green":"#73daca","yellow":"#e0af68","blue":"#7aa2f7","purple":"#bb9af7","cyan":"#7dcfff","white":"#7982a9","brightBlack":"#3b4261","brightRed":"#f7768e","brightGreen":"#73daca","brightYellow":"#e0af68","brightBlue":"#7aa2f7","brightPurple":"#bb9af7","brightCyan":"#7dcfff","brightWhite":"#a9b1d6","background":"#1f2335","foreground":"#7982a9","meta":{"isDark":true,"credits":null}},{"name":"Tomorrow","black":"#000000","red":"#c82829","green":"#718c00","yellow":"#eab700","blue":"#4271ae","purple":"#8959a8","cyan":"#3e999f","white":"#ffffff","brightBlack":"#000000","brightRed":"#c82829","brightGreen":"#718c00","brightYellow":"#eab700","brightBlue":"#4271ae","brightPurple":"#8959a8","brightCyan":"#3e999f","brightWhite":"#ffffff","background":"#ffffff","foreground":"#4d4d4c","cursorColor":"#4d4d4c","selectionBackground":"#d6d6d6","meta":{"isDark":false,"credits":[{"name":"chriskempson","link":"https://github.com/chriskempson/tomorrow-theme/tree/master/iTerm2"}]}},{"name":"Tomorrow Night","black":"#000000","red":"#cc6666","green":"#b5bd68","yellow":"#f0c674","blue":"#81a2be","purple":"#b294bb","cyan":"#8abeb7","white":"#ffffff","brightBlack":"#000000","brightRed":"#cc6666","brightGreen":"#b5bd68","brightYellow":"#f0c674","brightBlue":"#81a2be","brightPurple":"#b294bb","brightCyan":"#8abeb7","brightWhite":"#ffffff","background":"#1d1f21","foreground":"#c5c8c6","cursorColor":"#c5c8c6","selectionBackground":"#373b41","meta":{"isDark":true,"credits":[{"name":"ashwinv11","link":"https://github.com/ashwinv11/"}]}},{"name":"Tomorrow Night Blue","black":"#000000","red":"#ff9da4","green":"#d1f1a9","yellow":"#ffeead","blue":"#bbdaff","purple":"#ebbbff","cyan":"#99ffff","white":"#ffffff","brightBlack":"#000000","brightRed":"#ff9da4","brightGreen":"#d1f1a9","brightYellow":"#ffeead","brightBlue":"#bbdaff","brightPurple":"#ebbbff","brightCyan":"#99ffff","brightWhite":"#ffffff","background":"#002451","foreground":"#ffffff","cursorColor":"#ffffff","selectionBackground":"#003f8e","meta":{"isDark":true,"credits":null}},{"name":"Tomorrow Night Bright","black":"#000000","red":"#d54e53","green":"#b9ca4a","yellow":"#e7c547","blue":"#7aa6da","purple":"#c397d8","cyan":"#70c0b1","white":"#ffffff","brightBlack":"#000000","brightRed":"#d54e53","brightGreen":"#b9ca4a","brightYellow":"#e7c547","brightBlue":"#7aa6da","brightPurple":"#c397d8","brightCyan":"#70c0b1","brightWhite":"#ffffff","background":"#000000","foreground":"#eaeaea","cursorColor":"#eaeaea","selectionBackground":"#424242","meta":{"isDark":true,"credits":null}},{"name":"Tomorrow Night Burns","black":"#252525","red":"#832e31","green":"#a63c40","yellow":"#d3494e","blue":"#fc595f","purple":"#df9395","cyan":"#ba8586","white":"#f5f5f5","brightBlack":"#5d6f71","brightRed":"#832e31","brightGreen":"#a63c40","brightYellow":"#d2494e","brightBlue":"#fc595f","brightPurple":"#df9395","brightCyan":"#ba8586","brightWhite":"#f5f5f5","background":"#151515","foreground":"#a1b0b8","cursorColor":"#ff443e","selectionBackground":"#b0bec5","meta":{"isDark":true,"credits":[{"name":"ashwinv11","link":"https://github.com/ashwinv11/"}]}},{"name":"Tomorrow Night Eighties","black":"#000000","red":"#f2777a","green":"#99cc99","yellow":"#ffcc66","blue":"#6699cc","purple":"#cc99cc","cyan":"#66cccc","white":"#ffffff","brightBlack":"#000000","brightRed":"#f2777a","brightGreen":"#99cc99","brightYellow":"#ffcc66","brightBlue":"#6699cc","brightPurple":"#cc99cc","brightCyan":"#66cccc","brightWhite":"#ffffff","background":"#2d2d2d","foreground":"#cccccc","cursorColor":"#cccccc","selectionBackground":"#515151","meta":{"isDark":true,"credits":null}},{"name":"ToyChest","black":"#2c3f58","red":"#be2d26","green":"#1a9172","yellow":"#db8e27","blue":"#325d96","purple":"#8a5edc","cyan":"#35a08f","white":"#23d183","brightBlack":"#336889","brightRed":"#dd5944","brightGreen":"#31d07b","brightYellow":"#e7d84b","brightBlue":"#34a6da","brightPurple":"#ae6bdc","brightCyan":"#42c3ae","brightWhite":"#d5d5d5","background":"#24364b","foreground":"#31d07b","cursorColor":"#d5d5d5","selectionBackground":"#5f217a","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Treehouse","black":"#321300","red":"#b2270e","green":"#44a900","yellow":"#aa820c","blue":"#58859a","purple":"#97363d","cyan":"#b25a1e","white":"#786b53","brightBlack":"#433626","brightRed":"#ed5d20","brightGreen":"#55f238","brightYellow":"#f2b732","brightBlue":"#85cfed","brightPurple":"#e14c5a","brightCyan":"#f07d14","brightWhite":"#ffc800","background":"#191919","foreground":"#786b53","cursorColor":"#fac814","selectionBackground":"#786b53","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Twilight","black":"#141414","red":"#c06d44","green":"#afb97a","yellow":"#c2a86c","blue":"#44474a","purple":"#b4be7c","cyan":"#778385","white":"#ffffd4","brightBlack":"#262626","brightRed":"#de7c4c","brightGreen":"#ccd88c","brightYellow":"#e2c47e","brightBlue":"#5a5e62","brightPurple":"#d0dc8e","brightCyan":"#8a989b","brightWhite":"#ffffd4","background":"#141414","foreground":"#ffffd4","cursorColor":"#ffffff","selectionBackground":"#313131","meta":{"isDark":true,"credits":[{"name":"stefri","link":"https://gist.github.com/stefri/1183140"}]}},{"name":"Ubuntu","black":"#2e3436","red":"#cc0000","green":"#4e9a06","yellow":"#c4a000","blue":"#3465a4","purple":"#75507b","cyan":"#06989a","white":"#d3d7cf","brightBlack":"#555753","brightRed":"#ef2929","brightGreen":"#8ae234","brightYellow":"#fce94f","brightBlue":"#729fcf","brightPurple":"#ad7fa8","brightCyan":"#34e2e2","brightWhite":"#eeeeec","background":"#300a24","foreground":"#eeeeec","cursorColor":"#bbbbbb","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"Maximus","link":"http://superuser.com/questions/497240/ubuntu-purple-terminal-colors-in-conemu"},{"name":"stepin","link":"https://github.com/stepin"}]}},{"name":"UltraDark","black":"#000000","red":"#f07178","green":"#c3e88d","yellow":"#ffcb6b","blue":"#82aaff","purple":"#c792ea","cyan":"#89ddff","white":"#cccccc","brightBlack":"#333333","brightRed":"#f6a9ae","brightGreen":"#dbf1ba","brightYellow":"#ffdfa6","brightBlue":"#b4ccff","brightPurple":"#ddbdf2","brightCyan":"#b8eaff","brightWhite":"#ffffff","background":"#000000","foreground":"#ffffff","cursorColor":"#fefefe","selectionBackground":"#222222","meta":{"isDark":true,"credits":null}},{"name":"UltraViolent","black":"#242728","red":"#ff0090","green":"#b6ff00","yellow":"#fff727","blue":"#47e0fb","purple":"#d731ff","cyan":"#0effbb","white":"#e1e1e1","brightBlack":"#636667","brightRed":"#fb58b4","brightGreen":"#deff8c","brightYellow":"#ebe087","brightBlue":"#7fecff","brightPurple":"#e681ff","brightCyan":"#69fcd3","brightWhite":"#f9f9f5","background":"#242728","foreground":"#c1c1c1","cursorColor":"#c1c1c1","selectionBackground":"#574c49","meta":{"isDark":true,"credits":null}},{"name":"UnderTheSea","black":"#022026","red":"#b2302d","green":"#00a941","yellow":"#59819c","blue":"#459a86","purple":"#00599d","cyan":"#5d7e19","white":"#405555","brightBlack":"#384451","brightRed":"#ff4242","brightGreen":"#2aea5e","brightYellow":"#8ed4fd","brightBlue":"#61d5ba","brightPurple":"#1298ff","brightCyan":"#98d028","brightWhite":"#58fbd6","background":"#011116","foreground":"#ffffff","cursorColor":"#4afcd6","selectionBackground":"#415555","meta":{"isDark":true,"credits":[{"name":"peterpme","link":"https://github.com/peterpme"}]}},{"background":"#202020","black":"#808080","blue":"#65AEF7","brightBlack":"#808080","brightBlue":"#569CD6","brightCyan":"#9CDCFE","brightGreen":"#B5CEA8","brightPurple":"#AE81FF","brightRed":"#D16969","brightWhite":"#FFFFFF","brightYellow":"#DCDCAA","cursorColor":"#F8F8F0","cyan":"#9CDCFE","foreground":"#F8F8F2","green":"#608B4E","name":"Unholy","purple":"#AE81FF","red":"#D16969","selectionBackground":"#616161","white":"#FFFFFF","yellow":"#FDD877","meta":{"isDark":true,"credits":null}},{"name":"Unikitty","black":"#0c0c0c","red":"#a80f20","green":"#bafc8b","yellow":"#eedf4b","blue":"#145fcd","purple":"#ff36a2","cyan":"#6bd1bc","white":"#e2d7e1","brightBlack":"#434343","brightRed":"#d91329","brightGreen":"#d3ffaf","brightYellow":"#ffef50","brightBlue":"#0075ea","brightPurple":"#fdd5e5","brightCyan":"#79ecd5","brightWhite":"#fff3fe","background":"#ff8cd9","foreground":"#0b0b0b","cursorColor":"#bafc8b","selectionBackground":"#3ea9fe","meta":{"isDark":false,"credits":[{"name":"jakebathman","link":"https://github.com/jakebathman"}]}},{"name":"Urple","black":"#000000","red":"#b0425b","green":"#37a415","yellow":"#ad5c42","blue":"#564d9b","purple":"#6c3ca1","cyan":"#808080","white":"#87799c","brightBlack":"#5d3225","brightRed":"#ff6388","brightGreen":"#29e620","brightYellow":"#f08161","brightBlue":"#867aed","brightPurple":"#a05eee","brightCyan":"#eaeaea","brightWhite":"#bfa3ff","background":"#1b1b23","foreground":"#877a9b","cursorColor":"#a063eb","selectionBackground":"#a063eb","meta":{"isDark":true,"credits":[{"name":"zdj","link":"https://github.com/zdj/themes/tree/master/iterm2"}]}},{"name":"Vaughn","black":"#25234f","red":"#705050","green":"#60b48a","yellow":"#dfaf8f","blue":"#5555ff","purple":"#f08cc3","cyan":"#8cd0d3","white":"#709080","brightBlack":"#709080","brightRed":"#dca3a3","brightGreen":"#60b48a","brightYellow":"#f0dfaf","brightBlue":"#5555ff","brightPurple":"#ec93d3","brightCyan":"#93e0e3","brightWhite":"#ffffff","background":"#25234f","foreground":"#dcdccc","cursorColor":"#ff5555","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":null}},{"name":"Vesper","black":"#101010","red":"#f5a191","green":"#90b99f","yellow":"#e6b99d","blue":"#aca1cf","purple":"#e29eca","cyan":"#ea83a5","white":"#a0a0a0","brightBlack":"#7e7e7e","brightRed":"#ff8080","brightGreen":"#99ffe4","brightYellow":"#ffc799","brightBlue":"#b9aeda","brightPurple":"#ecaad6","brightCyan":"#f591b2","brightWhite":"#ffffff","background":"#101010","foreground":"#ffffff","cursorColor":"#acb1ab","selectionBackground":"#988049","meta":{"isDark":true,"credits":null}},{"name":"VibrantInk","black":"#878787","red":"#ff6600","green":"#ccff04","yellow":"#ffcc00","blue":"#44b4cc","purple":"#9933cc","cyan":"#44b4cc","white":"#f5f5f5","brightBlack":"#555555","brightRed":"#ff0000","brightGreen":"#00ff00","brightYellow":"#ffff00","brightBlue":"#0000ff","brightPurple":"#ff00ff","brightCyan":"#00ffff","brightWhite":"#e5e5e5","background":"#000000","foreground":"#ffffff","cursorColor":"#ffffff","selectionBackground":"#b5d5ff","meta":{"isDark":true,"credits":[{"name":"asanghi","link":"https://github.com/asanghi/vibrantinklion"}]}},{"name":"vimbones","black":"#f0f0ca","red":"#a8334c","green":"#4f6c31","yellow":"#944927","blue":"#286486","purple":"#88507d","cyan":"#3b8992","white":"#353535","brightBlack":"#c6c6a3","brightRed":"#94253e","brightGreen":"#3f5a22","brightYellow":"#803d1c","brightBlue":"#1d5573","brightPurple":"#7b3b70","brightCyan":"#2b747c","brightWhite":"#5c5c5c","background":"#f0f0ca","foreground":"#353535","cursorColor":"#353535","selectionBackground":"#d7d7d7","meta":{"isDark":false,"credits":null}},{"name":"Violet Dark","black":"#56595c","red":"#c94c22","green":"#85981c","yellow":"#b4881d","blue":"#2e8bce","purple":"#d13a82","cyan":"#32a198","white":"#c9c6bd","brightBlack":"#45484b","brightRed":"#bd3613","brightGreen":"#738a04","brightYellow":"#a57705","brightBlue":"#2176c7","brightPurple":"#c61c6f","brightCyan":"#259286","brightWhite":"#c9c6bd","background":"#1c1d1f","foreground":"#708284","cursorColor":"#708284","selectionBackground":"#595ab7","meta":{"isDark":true,"credits":[{"name":"ashfinal","link":"https://github.com/ashfinal/vim-colors-violet"}]}},{"name":"Violet Light","black":"#56595c","red":"#c94c22","green":"#85981c","yellow":"#b4881d","blue":"#2e8bce","purple":"#d13a82","cyan":"#32a198","white":"#d3d0c9","brightBlack":"#45484b","brightRed":"#bd3613","brightGreen":"#738a04","brightYellow":"#a57705","brightBlue":"#2176c7","brightPurple":"#c61c6f","brightCyan":"#259286","brightWhite":"#c9c6bd","background":"#fcf4dc","foreground":"#536870","cursorColor":"#536870","selectionBackground":"#595ab7","meta":{"isDark":false,"credits":[{"name":"ashfinal","link":"https://github.com/ashfinal/vim-colors-violet"}]}},{"name":"WarmNeon","black":"#000000","red":"#e24346","green":"#39b13a","yellow":"#dae145","blue":"#4261c5","purple":"#f920fb","cyan":"#2abbd4","white":"#d0b8a3","brightBlack":"#fefcfc","brightRed":"#e97071","brightGreen":"#9cc090","brightYellow":"#ddda7a","brightBlue":"#7b91d6","brightPurple":"#f674ba","brightCyan":"#5ed1e5","brightWhite":"#d8c8bb","background":"#404040","foreground":"#afdab6","cursorColor":"#30ff24","selectionBackground":"#b0ad21","meta":{"isDark":true,"credits":[{"name":"PyCharm","link":"http://www.jetbrains.com/pycharm/"},{"name":"firewut","link":"https://github.com/firewut"}]}},{"name":"Wez","black":"#000000","red":"#cc5555","green":"#55cc55","yellow":"#cdcd55","blue":"#5555cc","purple":"#cc55cc","cyan":"#7acaca","white":"#cccccc","brightBlack":"#555555","brightRed":"#ff5555","brightGreen":"#55ff55","brightYellow":"#ffff55","brightBlue":"#5555ff","brightPurple":"#ff55ff","brightCyan":"#55ffff","brightWhite":"#ffffff","background":"#000000","foreground":"#b3b3b3","cursorColor":"#53ae71","selectionBackground":"#4d52f8","meta":{"isDark":true,"credits":[{"name":"wez","link":"https://gist.github.com/wez/850268/"}]}},{"name":"Whimsy","black":"#535178","red":"#ef6487","green":"#5eca89","yellow":"#fdd877","blue":"#65aef7","purple":"#aa7ff0","cyan":"#43c1be","white":"#ffffff","brightBlack":"#535178","brightRed":"#ef6487","brightGreen":"#5eca89","brightYellow":"#fdd877","brightBlue":"#65aef7","brightPurple":"#aa7ff0","brightCyan":"#43c1be","brightWhite":"#ffffff","background":"#29283b","foreground":"#b3b0d6","cursorColor":"#b3b0d6","selectionBackground":"#3d3c58","meta":{"isDark":true,"credits":[{"name":"Rod","link":"https://github.com/rod"}]}},{"name":"WildCherry","black":"#000507","red":"#d94085","green":"#2ab250","yellow":"#ffd16f","blue":"#883cdc","purple":"#ececec","cyan":"#c1b8b7","white":"#fff8de","brightBlack":"#009cc9","brightRed":"#da6bac","brightGreen":"#f4dca5","brightYellow":"#eac066","brightBlue":"#308cba","brightPurple":"#ae636b","brightCyan":"#ff919d","brightWhite":"#e4838d","background":"#1f1726","foreground":"#dafaff","cursorColor":"#dd00ff","selectionBackground":"#002831","meta":{"isDark":true,"credits":[{"name":"mashaal","link":"https://github.com/mashaal/wild-cherry"}]}},{"name":"wilmersdorf","black":"#34373e","red":"#e06383","green":"#7ebebd","yellow":"#cccccc","blue":"#a6c1e0","purple":"#e1c1ee","cyan":"#5b94ab","white":"#ababab","brightBlack":"#434750","brightRed":"#fa7193","brightGreen":"#8fd7d6","brightYellow":"#d1dfff","brightBlue":"#b2cff0","brightPurple":"#efccfd","brightCyan":"#69abc5","brightWhite":"#d3d3d3","background":"#282b33","foreground":"#c6c6c6","cursorColor":"#7ebebd","selectionBackground":"#1f2024","meta":{"isDark":true,"credits":null}},{"name":"Wombat","black":"#000000","red":"#ff615a","green":"#b1e969","yellow":"#ebd99c","blue":"#5da9f6","purple":"#e86aff","cyan":"#82fff7","white":"#dedacf","brightBlack":"#313131","brightRed":"#f58c80","brightGreen":"#ddf88f","brightYellow":"#eee5b2","brightBlue":"#a5c7ff","brightPurple":"#ddaaff","brightCyan":"#b7fff9","brightWhite":"#ffffff","background":"#171717","foreground":"#dedacf","cursorColor":"#bbbbbb","selectionBackground":"#453b39","meta":{"isDark":true,"credits":[{"name":"djoyner","link":"https://github.com/djoyner/iTerm2-wombat"}]}},{"name":"Wryan","black":"#333333","red":"#8c4665","green":"#287373","yellow":"#7c7c99","blue":"#395573","purple":"#5e468c","cyan":"#31658c","white":"#899ca1","brightBlack":"#3d3d3d","brightRed":"#bf4d80","brightGreen":"#53a6a6","brightYellow":"#9e9ecb","brightBlue":"#477ab3","brightPurple":"#7e62b3","brightCyan":"#6096bf","brightWhite":"#c0c0c0","background":"#101010","foreground":"#999993","cursorColor":"#9e9ecb","selectionBackground":"#4d4d4d","meta":{"isDark":true,"credits":[{"name":"baskerville","link":"https://github.com/baskerville/iTerm-2-Color-Themes"}]}},{"name":"zenbones","black":"#f0edec","red":"#a8334c","green":"#4f6c31","yellow":"#944927","blue":"#286486","purple":"#88507d","cyan":"#3b8992","white":"#2c363c","brightBlack":"#cfc1ba","brightRed":"#94253e","brightGreen":"#3f5a22","brightYellow":"#803d1c","brightBlue":"#1d5573","brightPurple":"#7b3b70","brightCyan":"#2b747c","brightWhite":"#4f5e68","background":"#f0edec","foreground":"#2c363c","cursorColor":"#2c363c","selectionBackground":"#cbd9e3","meta":{"isDark":false,"credits":null}},{"name":"zenbones_dark","black":"#1c1917","red":"#de6e7c","green":"#819b69","yellow":"#b77e64","blue":"#6099c0","purple":"#b279a7","cyan":"#66a5ad","white":"#b4bdc3","brightBlack":"#403833","brightRed":"#e8838f","brightGreen":"#8bae68","brightYellow":"#d68c67","brightBlue":"#61abda","brightPurple":"#cf86c1","brightCyan":"#65b8c1","brightWhite":"#888f94","background":"#1c1917","foreground":"#b4bdc3","cursorColor":"#c4cacf","selectionBackground":"#3d4042","meta":{"isDark":true,"credits":null}},{"name":"zenbones_light","black":"#f0edec","red":"#a8334c","green":"#4f6c31","yellow":"#944927","blue":"#286486","purple":"#88507d","cyan":"#3b8992","white":"#2c363c","brightBlack":"#cfc1ba","brightRed":"#94253e","brightGreen":"#3f5a22","brightYellow":"#803d1c","brightBlue":"#1d5573","brightPurple":"#7b3b70","brightCyan":"#2b747c","brightWhite":"#4f5e68","background":"#f0edec","foreground":"#2c363c","cursorColor":"#2c363c","selectionBackground":"#cbd9e3","meta":{"isDark":false,"credits":null}},{"name":"Zenburn","black":"#4d4d4d","red":"#705050","green":"#60b48a","yellow":"#f0dfaf","blue":"#506070","purple":"#dc8cc3","cyan":"#8cd0d3","white":"#dcdccc","brightBlack":"#709080","brightRed":"#dca3a3","brightGreen":"#c3bf9f","brightYellow":"#e0cf9f","brightBlue":"#94bff3","brightPurple":"#ec93d3","brightCyan":"#93e0e3","brightWhite":"#ffffff","background":"#3f3f3f","foreground":"#dcdccc","cursorColor":"#73635a","selectionBackground":"#21322f","meta":{"isDark":true,"credits":[{"name":"Zenburn","link":"http://sunaku.github.io/zenburn-terminal-color-scheme.html"}]}},{"name":"zenburned","black":"#404040","red":"#e3716e","green":"#819b69","yellow":"#b77e64","blue":"#6099c0","purple":"#b279a7","cyan":"#66a5ad","white":"#f0e4cf","brightBlack":"#625a5b","brightRed":"#ec8685","brightGreen":"#8bae68","brightYellow":"#d68c67","brightBlue":"#61abda","brightPurple":"#cf86c1","brightCyan":"#65b8c1","brightWhite":"#c0ab86","background":"#404040","foreground":"#f0e4cf","cursorColor":"#f3eadb","selectionBackground":"#746956","meta":{"isDark":true,"credits":null}},{"name":"zenwritten_dark","black":"#191919","red":"#de6e7c","green":"#819b69","yellow":"#b77e64","blue":"#6099c0","purple":"#b279a7","cyan":"#66a5ad","white":"#bbbbbb","brightBlack":"#3d3839","brightRed":"#e8838f","brightGreen":"#8bae68","brightYellow":"#d68c67","brightBlue":"#61abda","brightPurple":"#cf86c1","brightCyan":"#65b8c1","brightWhite":"#8e8e8e","background":"#191919","foreground":"#bbbbbb","cursorColor":"#c9c9c9","selectionBackground":"#404040","meta":{"isDark":true,"credits":null}},{"name":"zenwritten_light","black":"#eeeeee","red":"#a8334c","green":"#4f6c31","yellow":"#944927","blue":"#286486","purple":"#88507d","cyan":"#3b8992","white":"#353535","brightBlack":"#c6c3c3","brightRed":"#94253e","brightGreen":"#3f5a22","brightYellow":"#803d1c","brightBlue":"#1d5573","brightPurple":"#7b3b70","brightCyan":"#2b747c","brightWhite":"#5c5c5c","background":"#eeeeee","foreground":"#353535","cursorColor":"#353535","selectionBackground":"#d7d7d7","meta":{"isDark":false,"credits":null}},{"background":"#01001D","black":"#0C0C0C","blue":"#3E31F5","brightBlack":"#686868","brightBlue":"#737CFF","brightCyan":"#7FFFFF","brightGreen":"#6BFF6B","brightPurple":"#FF70FF","brightRed":"#FF6E6E","brightWhite":"#FFFFFF","brightYellow":"#FFFF6B","cursorColor":"#FFFFFF","cyan":"#13D4D4","foreground":"#FFFFFF","green":"#21C221","name":"Zeonica","purple":"#D918B9","red":"#CC2929","selectionBackground":"#242272","white":"#B2B2B2","yellow":"#D6C315","meta":{"isDark":true,"credits":null}}]\ No newline at end of file@@ -2,23 +2,25 @@ package ui
22 33 import (44 "charm.land/bubbles/v2/list"5+ "github.com/FelineStateMachine/puzzletea/theme"56 )67 7-// InitList creates a styled list widget with the standard puzzletea theme.8+// InitList creates a styled list widget with the active theme's colors.89 // The list title is hidden because lists are rendered inside Panel frames910 // that provide their own styled title.1011 func InitList(items []list.Item, title string) list.Model {12+ p := theme.Current()1113 d := list.NewDefaultDelegate()1214 d.Styles.SelectedTitle = d.Styles.SelectedTitle.13- Foreground(MenuAccent).14- BorderLeftForeground(MenuAccent)15+ Foreground(p.Accent).16+ BorderLeftForeground(p.Accent)1517 d.Styles.SelectedDesc = d.Styles.SelectedDesc.16- Foreground(MenuAccentLight).17- BorderLeftForeground(MenuAccent)18+ Foreground(p.AccentSoft).19+ BorderLeftForeground(p.Accent)1820 d.Styles.NormalTitle = d.Styles.NormalTitle.19- Foreground(MenuText)21+ Foreground(p.FG)2022 d.Styles.NormalDesc = d.Styles.NormalDesc.21- Foreground(MenuTextDim)23+ Foreground(p.TextDim)2224 2325 l := list.New(items, d, 64, 64)2426 l.Title = title@@ -31,6 +33,62 @@ func InitList(items []list.Item, title string) list.Model {
3133 return l3234 }3335 36+// InitThemeList creates a styled list widget for the theme picker with37+// a fixed-width delegate so the list column doesn't shift as the cursor38+// moves across names of different lengths.39+func InitThemeList(items []list.Item, width, height int) list.Model {40+ p := theme.Current()41+ d := list.NewDefaultDelegate()42+ d.Styles.SelectedTitle = d.Styles.SelectedTitle.43+ Foreground(p.Accent).44+ BorderLeftForeground(p.Accent).45+ Width(width)46+ d.Styles.SelectedDesc = d.Styles.SelectedDesc.47+ Foreground(p.AccentSoft).48+ BorderLeftForeground(p.Accent).49+ Width(width)50+ d.Styles.NormalTitle = d.Styles.NormalTitle.51+ Foreground(p.FG).52+ Width(width)53+ d.Styles.NormalDesc = d.Styles.NormalDesc.54+ Foreground(p.TextDim).55+ Width(width)56+57+ l := list.New(items, d, width, height)58+ l.SetShowTitle(false)59+ l.DisableQuitKeybindings()60+ l.SetFilteringEnabled(true)61+ l.SetShowHelp(false)62+ l.SetShowStatusBar(false)63+ return l64+}65+66+// UpdateThemeListStyles refreshes the delegate colors on an existing theme67+// list so that live-preview theme changes are reflected immediately.68+func UpdateThemeListStyles(l *list.Model) {69+ p := theme.Current()70+ d := list.NewDefaultDelegate()71+72+ // Preserve the width that was set when the list was created.73+ w := l.Width()74+ d.Styles.SelectedTitle = d.Styles.SelectedTitle.75+ Foreground(p.Accent).76+ BorderLeftForeground(p.Accent).77+ Width(w)78+ d.Styles.SelectedDesc = d.Styles.SelectedDesc.79+ Foreground(p.AccentSoft).80+ BorderLeftForeground(p.Accent).81+ Width(w)82+ d.Styles.NormalTitle = d.Styles.NormalTitle.83+ Foreground(p.FG).84+ Width(w)85+ d.Styles.NormalDesc = d.Styles.NormalDesc.86+ Foreground(p.TextDim).87+ Width(w)88+89+ l.SetDelegate(d)90+}91+3492 // ListHeight returns the minimum height needed to display all items in a3593 // single page, avoiding pagination. The bubbles list component has a3694 // circular dependency between pagination visibility and PerPage calculation@@ -46,27 +46,11 @@ func (m MainMenu) Selected() MenuItem {
4646 4747 // View renders the main menu as a framed panel with logo and items.4848 func (m MainMenu) View() string {49- styledLogo := LogoStyle.Render(logo)49+ styledLogo := LogoStyle().Render(logo)5050 51- var itemLines []string52- for i, item := range m.items {53- var line, cursor, title string54- if i == m.cursor {55- cursor = CursorStyle.Render("⦾ ")56- title = SelectedItemStyle.Render(item.ItemTitle)57-58- } else {59- cursor = CursorStyle.Render("◦ ")60- title = NormalItemStyle.Render(item.ItemTitle)51+ items := m.renderItems()6152 62- }63- desc := DimItemStyle.Render("\n " + item.Desc)64- line = cursor + title + desc + "\n"65- itemLines = append(itemLines, line)66- }67- items := strings.Join(itemLines, "\n")68-69- footer := FooterHint.Render("↑/↓ navigate • enter select • ctrl+c quit")53+ footer := FooterHint().Render("↑/↓ navigate • enter select • ctrl+c quit")7054 7155 inner := lipgloss.JoinVertical(lipgloss.Left,7256 styledLogo,@@ -76,5 +60,31 @@ func (m MainMenu) View() string {
7660 footer,7761 )7862 79- return inner63+ return HeavyPanel(inner)64+}65+66+// ViewAsPanel renders the menu items inside a rounded-border Panel,67+// suitable for submenus that should look visually distinct from the68+// root main menu.69+func (m MainMenu) ViewAsPanel(title string) string {70+ return Panel(title, m.renderItems(), "↑/↓ navigate • enter select • esc back")71+}72+73+// renderItems returns the styled item list shared by View and ViewAsPanel.74+func (m MainMenu) renderItems() string {75+ var itemLines []string76+ for i, item := range m.items {77+ var line, cursor, title string78+ if i == m.cursor {79+ cursor = CursorStyle().Render("⦾ ")80+ title = SelectedItemStyle().Render(item.ItemTitle)81+ } else {82+ cursor = CursorStyle().Render("◦ ")83+ title = NormalItemStyle().Render(item.ItemTitle)84+ }85+ desc := DimItemStyle().Render("\n " + item.Desc)86+ line = cursor + title + desc + "\n"87+ itemLines = append(itemLines, line)88+ }89+ return strings.Join(itemLines, "\n")8090 }@@ -7,8 +7,8 @@ import (
77 // Panel wraps content in a bordered frame with a styled title and footer hint.88 // It uses RoundedBorder by default, suitable for sub-menus and secondary views.99 func Panel(title, content, footer string) string {10- titleLine := PanelTitle.Render(title)11- footerLine := FooterHint.Render(footer)10+ titleLine := PanelTitle().Render(title)11+ footerLine := FooterHint().Render(footer)1212 1313 inner := lipgloss.JoinVertical(lipgloss.Left,1414 titleLine,@@ -18,10 +18,10 @@ func Panel(title, content, footer string) string {
1818 footerLine,1919 )2020 21- return PanelFrame.Render(inner)21+ return PanelFrame().Render(inner)2222 }2323 2424 // HeavyPanel wraps content in a double-border frame, used for the main menu.2525 func HeavyPanel(content string) string {26- return MainMenuFrame.Render(content)26+ return MainMenuFrame().Render(content)2727 }@@ -2,75 +2,92 @@ package ui
22 33 import (44 "charm.land/lipgloss/v2"5- "charm.land/lipgloss/v2/compat"5+ "github.com/FelineStateMachine/puzzletea/theme"66 )77 8-// Earth-tone palette for menus — ANSI 256 colors with light/dark adaptivity.9-var (10- MenuAccent = compat.AdaptiveColor{Light: lipgloss.Color("130"), Dark: lipgloss.Color("173")}11- MenuAccentLight = compat.AdaptiveColor{Light: lipgloss.Color("137"), Dark: lipgloss.Color("180")}12- MenuText = compat.AdaptiveColor{Light: lipgloss.Color("235"), Dark: lipgloss.Color("252")}13- MenuTextDim = compat.AdaptiveColor{Light: lipgloss.Color("243"), Dark: lipgloss.Color("243")}14- MenuDim = compat.AdaptiveColor{Light: lipgloss.Color("250"), Dark: lipgloss.Color("238")}15- MenuTableHeader = compat.AdaptiveColor{Light: lipgloss.Color("130"), Dark: lipgloss.Color("180")}8+// MenuAccent returns the primary accent color from the active theme.9+func MenuAccent() lipgloss.Style { return lipgloss.NewStyle().Foreground(theme.Current().Accent) }1610 17- DebugStyle = lipgloss.NewStyle().18- Border(lipgloss.RoundedBorder(), true).19- BorderForeground(compat.AdaptiveColor{Light: lipgloss.Color("124"), Dark: lipgloss.Color("124")})11+// DebugStyle returns the style for the debug overlay border.12+func DebugStyle() lipgloss.Style {13+ return lipgloss.NewStyle().14+ Border(lipgloss.RoundedBorder(), true).15+ BorderForeground(theme.Current().Error)16+}2017 21- // LogoStyle renders the ASCII art brand logo.22- LogoStyle = lipgloss.NewStyle().23- Bold(true).24- Foreground(MenuText).25- Background(MenuAccent).26- Padding(0, 1).27- Margin(1, 0)18+// LogoStyle returns the style for the ASCII art brand logo.19+func LogoStyle() lipgloss.Style {20+ p := theme.Current()21+ return lipgloss.NewStyle().22+ Bold(true).23+ Foreground(p.FG).24+ Background(p.Accent).25+ Padding(0, 1).26+ Margin(1, 0)27+}2828 29- // MainMenuFrame wraps the main menu in a heavy double border.30- MainMenuFrame = lipgloss.NewStyle().31- Border(lipgloss.DoubleBorder()).32- BorderForeground(MenuAccent).33- Padding(2, 4)29+// MainMenuFrame returns the double-border frame for the main menu.30+func MainMenuFrame() lipgloss.Style {31+ return lipgloss.NewStyle().32+ Border(lipgloss.DoubleBorder()).33+ BorderForeground(theme.Current().Accent).34+ Padding(2, 4)35+}3436 35- // PanelFrame wraps sub-menus in a lighter rounded border.36- PanelFrame = lipgloss.NewStyle().37- Border(lipgloss.RoundedBorder()).38- BorderForeground(MenuDim).39- Padding(1, 2)37+// PanelFrame returns the rounded-border frame for sub-menus.38+func PanelFrame() lipgloss.Style {39+ return lipgloss.NewStyle().40+ Border(lipgloss.RoundedBorder()).41+ BorderForeground(theme.Current().Border).42+ Padding(1, 2)43+}4044 41- // PanelTitle styles the title line inside a panel.42- PanelTitle = lipgloss.NewStyle().43- Bold(true).44- Foreground(MenuAccent)45+// PanelTitle returns the style for panel title text.46+func PanelTitle() lipgloss.Style {47+ return lipgloss.NewStyle().48+ Bold(true).49+ Foreground(theme.Current().Accent)50+}4551 46- // FooterHint styles the navigation hint line at the bottom of panels.47- FooterHint = lipgloss.NewStyle().48- Foreground(MenuTextDim)52+// FooterHint returns the style for navigation hint text.53+func FooterHint() lipgloss.Style {54+ return lipgloss.NewStyle().55+ Foreground(theme.Current().TextDim)56+}4957 50- // CursorStyle styles the active cursor indicator.51- CursorStyle = lipgloss.NewStyle().52- Foreground(MenuAccent).53- Bold(true)58+// CursorStyle returns the style for the active cursor indicator in menus.59+func CursorStyle() lipgloss.Style {60+ return lipgloss.NewStyle().61+ Foreground(theme.Current().Accent).62+ Bold(true)63+}5464 55- // SelectedItemStyle styles the currently highlighted menu item title.56- SelectedItemStyle = lipgloss.NewStyle().57- Foreground(MenuAccent).58- Bold(true)65+// SelectedItemStyle returns the style for the highlighted menu item title.66+func SelectedItemStyle() lipgloss.Style {67+ return lipgloss.NewStyle().68+ Foreground(theme.Current().Accent).69+ Bold(true)70+}5971 60- // NormalItemStyle styles non-selected menu item titles.61- NormalItemStyle = lipgloss.NewStyle().62- Foreground(MenuText)72+// NormalItemStyle returns the style for non-selected menu item titles.73+func NormalItemStyle() lipgloss.Style {74+ return lipgloss.NewStyle().75+ Foreground(theme.Current().FG)76+}6377 64- // DimItemStyle styles descriptions and secondary text.65- DimItemStyle = lipgloss.NewStyle().66- Foreground(MenuTextDim)78+// DimItemStyle returns the style for descriptions and secondary text.79+func DimItemStyle() lipgloss.Style {80+ return lipgloss.NewStyle().81+ Foreground(theme.Current().TextDim)82+}6783 68- // GeneratingFrame wraps the generating spinner in a small box.69- GeneratingFrame = lipgloss.NewStyle().70- Border(lipgloss.RoundedBorder()).71- BorderForeground(MenuAccent).72- Padding(1, 3)73-)84+// GeneratingFrame returns the frame style for the generating spinner box.85+func GeneratingFrame() lipgloss.Style {86+ return lipgloss.NewStyle().87+ Border(lipgloss.RoundedBorder()).88+ BorderForeground(theme.Current().Accent).89+ Padding(1, 3)90+}7491 7592 // CenterView wraps content in centered placement within the available area.7693 func CenterView(width, height int, content string) string {@@ -6,8 +6,8 @@ import (
66 77 "charm.land/bubbles/v2/table"88 "charm.land/lipgloss/v2"9- "charm.land/lipgloss/v2/compat"109 "github.com/FelineStateMachine/puzzletea/store"10+ "github.com/FelineStateMachine/puzzletea/theme"1111 )1212 1313 // MaxTableRows is the maximum number of rows visible in the continue table.@@ -62,6 +62,8 @@ func InitContinueTable(s *store.Store, height int) (table.Model, []store.GameRec
6262 // Account for column gaps (2 chars between each column).6363 tableWidth += (len(columns) - 1) * 26464 65+ p := theme.Current()66+6567 visibleRows := min(len(rows), MaxTableRows)6668 t := table.New(6769 table.WithColumns(columns),@@ -74,16 +76,16 @@ func InitContinueTable(s *store.Store, height int) (table.Model, []store.GameRec
7476 st := table.DefaultStyles()7577 st.Header = st.Header.7678 Bold(true).77- Foreground(MenuTableHeader).79+ Foreground(p.Accent).7880 BorderStyle(lipgloss.NormalBorder()).7981 BorderBottom(true).80- BorderForeground(MenuDim)82+ BorderForeground(p.Border)8183 st.Selected = st.Selected.82- Foreground(compat.AdaptiveColor{Light: lipgloss.Color("255"), Dark: lipgloss.Color("255")}).83- Background(MenuAccent).84+ Foreground(p.AccentText).85+ Background(p.Accent).8486 Bold(true)8587 st.Cell = st.Cell.86- Foreground(MenuText)88+ Foreground(p.FG)8789 t.SetStyles(st)8890 8991 return t, games@@ -110,5 +112,5 @@ func TablePagination(t table.Model) string {
110112 start = end - height111113 }112114 113- return FooterHint.Render(fmt.Sprintf("%d–%d of %d", start+1, end, total))115+ return FooterHint().Render(fmt.Sprintf("%d–%d of %d", start+1, end, total))114116 }Binary file.
Binary file.
Binary file.
Binary file.
Binary file.
@@ -26,7 +26,7 @@ Sleep 500ms
2626 Enter2727 Sleep 2s2828 29-# Browse main menu (Daily Puzzle, Generate, Continue, Quit)29+# Browse main menu (Play, Stats, Options, Quit)3030 Down3131 Sleep 500ms3232 Down@@ -38,7 +38,23 @@ Up
3838 Up3939 Sleep 500ms4040 41-# Select "Generate" (second item)41+# Select "Play" (first item)42+Enter43+Sleep 1s44+45+# Browse Play submenu (Daily Puzzle, Generate, Continue, Find)46+Down47+Sleep 500ms48+Down49+Sleep 500ms50+Down51+Sleep 500ms52+Up53+Up54+Up55+Sleep 500ms56+57+# Select "Generate" (second item in Play submenu)4258 Down4359 Enter4460 Sleep 1s@@ -53,8 +69,7 @@ Sleep 400ms
5369 Down5470 Sleep 400ms5571 56-# Select Nonogram (third item)57-Up72+# Select Nonogram (fourth item)5873 Up5974 Enter6075 Sleep 1s@@ -78,6 +93,23 @@ Sleep 600ms
7893 # Go back through menus7994 Escape8095 Sleep 1s96+Escape97+Sleep 500ms98+Escape99+Sleep 500ms100+101+# Show Options submenu102+Down103+Down104+Enter105+Sleep 1s106+107+# Browse Options (Theme, Guides)108+Down109+Sleep 500ms110+Up111+Sleep 500ms112+81113 Escape82114 Sleep 500ms83115 Binary file.
Binary file.
Binary file.
Binary file.
Binary file.
Binary file.
@@ -7,6 +7,7 @@ import (
77 "charm.land/lipgloss/v2"88 "charm.land/lipgloss/v2/compat"99 "github.com/FelineStateMachine/puzzletea/game"10+ "github.com/FelineStateMachine/puzzletea/theme"1011 )1112 1213 var (@@ -14,11 +15,9 @@ var (
1415 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("236"), Dark: lipgloss.Color("252")}).1516 Background(compat.AdaptiveColor{Light: lipgloss.Color("254"), Dark: lipgloss.Color("236")})1617 17- cursorStyle = game.CursorStyle18+ // cursorStyle resolved at render time via game.CursorStyle().1819 19- selectionStyle = lipgloss.NewStyle().20- Foreground(compat.AdaptiveColor{Light: lipgloss.Color("235"), Dark: lipgloss.Color("235")}).21- Background(compat.AdaptiveColor{Light: lipgloss.Color("172"), Dark: lipgloss.Color("180")})20+ // selectionStyle resolved at render time via selectionStyle().2221 2322 foundStyle = lipgloss.NewStyle().2423 Foreground(compat.AdaptiveColor{Light: lipgloss.Color("22"), Dark: lipgloss.Color("151")}).@@ -34,7 +33,7 @@ var (
3433 Strikethrough(true)3534 3635 unfoundWordStyle = lipgloss.NewStyle().37- Foreground(compat.AdaptiveColor{Light: lipgloss.Color("137"), Dark: lipgloss.Color("137")})36+ Foreground(compat.AdaptiveColor{Light: lipgloss.Color("95"), Dark: lipgloss.Color("180")})3837 3938 borderFG = compat.AdaptiveColor{Light: lipgloss.Color("250"), Dark: lipgloss.Color("240")}4039 gridBG = compat.AdaptiveColor{Light: lipgloss.Color("254"), Dark: lipgloss.Color("236")}@@ -61,6 +60,15 @@ var (
6160 Padding(0, 1)6261 )6362 63+// selectionStyle returns the style for cells in the active drag selection,64+// using the current theme's Highlight color for the background.65+func selectionStyle() lipgloss.Style {66+ bg := theme.Current().Highlight67+ return lipgloss.NewStyle().68+ Foreground(theme.TextOnBG(bg)).69+ Background(bg)70+}71+6472 func renderView(m Model) string {6573 title := game.TitleBarView("Word Search", m.modeTitle, m.solved)6674 gridContent := renderGrid(m)@@ -89,9 +97,9 @@ func renderView(m Model) string {
8997 9098 func statusBarView(showFullHelp bool) string {9199 if showFullHelp {92- return game.StatusBarStyle.Render("arrows/wasd: move enter/space: select esc: cancel mouse: click & drag ctrl+n: menu ctrl+r: reset ctrl+h: help")100+ return game.StatusBarStyle().Render("arrows/wasd: move enter/space: select esc: cancel mouse: click & drag ctrl+n: menu ctrl+r: reset ctrl+h: help")93101 }94- return game.StatusBarStyle.Render("enter/space: select esc: cancel mouse: click & drag")102+ return game.StatusBarStyle().Render("enter/space: select esc: cancel mouse: click & drag")95103 }96104 97105 func renderGrid(m Model) string {@@ -115,12 +123,12 @@ func getCellStyle(m Model, x, y int) lipgloss.Style {
115123 116124 // Check if cursor position117125 if m.cursor.X == x && m.cursor.Y == y {118- return cursorStyle126+ return game.CursorStyle()119127 }120128 121129 // Check if in current selection122130 if m.selection == startSelected && isInSelection(m, x, y) {123- return selectionStyle131+ return selectionStyle()124132 }125133 126134 // Check if part of found word