vim9script const dark = { bg0: ['#282828', 235], bg1: ['#3c3836', 237], bg2: ['#504945', 239], bg4: ['#7c6f64', 243], fg1: ['#ebdbb2', 187], fg4: ['#a89984', 137], green: ['#98971a', 100], yellow: ['#d79921', 172], blue: ['#458588', 66], aqua: ['#689d6a', 71], orange: ['#d65d0e', 166], red: ['#fb4934', 203], } const light = { bg0: ['#fbf1c7', 230], bg1: ['#ebdbb2', 187], bg2: ['#d5c4a1', 187], bg4: ['#a89984', 137], fg1: ['#3c3836', 237], fg4: ['#7c6f64', 243], green: ['#98971a', 100], yellow: ['#d79921', 172], blue: ['#458588', 66], aqua: ['#689d6a', 71], orange: ['#d65d0e', 166], red: ['#9d0006', 124], } def ToCrystalline(fg: list, bg: list): list return [ [fg[1], bg[1]], [fg[0], bg[0]], '' ] enddef def MakeTheme(c: dict>): dict> var theme = { A: ToCrystalline(c.bg0, c.bg4), B: ToCrystalline(c.fg4, c.bg2), Fill: ToCrystalline(c.fg4, c.bg1), InactiveA: ToCrystalline(c.bg4, c.bg1), InactiveB: ToCrystalline(c.bg4, c.bg1), InactiveFill: ToCrystalline(c.bg4, c.bg1), InsertModeA: ToCrystalline(c.bg0, c.blue), InsertModeFill: ToCrystalline(c.fg4, c.bg2), VisualModeA: ToCrystalline(c.bg0, c.orange), ReplaceModeA: ToCrystalline(c.bg0, c.aqua), ReplaceModeFill: ToCrystalline(c.fg4, c.bg2), TerminalModeA: ToCrystalline(c.bg0, c.green), Modified: ToCrystalline(c.red, c.bg1), InsertModeModified: ToCrystalline(c.red, c.bg2), TabSel: ToCrystalline(c.bg0, c.fg4), ModifiedSel: ToCrystalline(c.bg1, c.fg4), } theme->extend({ Tab: theme.Fill, NormalModeModified: theme.Modified, CommandModeModified: theme.Modified, VisualModeModified: theme.Modified, ReplaceModeModified: theme.InsertModeModified, }) return theme enddef export def GetThemeColours(): dict> return &background ==# 'dark' ? dark : light enddef export def SetTheme(): void GetThemeColours()->MakeTheme()->g:crystalline#GenerateTheme() enddef