commit cfca786ef2529da49bfd6ff9bfea1003c51077d7
parent 78befd05842d86ac8e6a21699103c97ba97d5c4a
Author: Thomas Frössman <thomasf@jossystem.se>
Date: Wed, 6 Nov 2019 02:25:30 +0100
Improved diff/merge palettes + color handling improvements
- colors are now blended using LAB
- external program generates palettes (for now), basic elisp version supported
as well.
Diffstat:
11 files changed, 1378 insertions(+), 185 deletions(-)
diff --git a/colorlab/go.mod b/colorlab/go.mod
@@ -0,0 +1,8 @@
+module github.com/bbatsov/solarized-emacs/colorlab
+
+go 1.13
+
+require (
+ github.com/davecgh/go-spew v1.1.1
+ github.com/lucasb-eyer/go-colorful v1.0.2
+)
diff --git a/colorlab/go.sum b/colorlab/go.sum
@@ -0,0 +1,6 @@
+github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08=
+github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4=
+github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
diff --git a/colorlab/main.go b/colorlab/main.go
@@ -0,0 +1,828 @@
+// this is just a WIP where color.el can be a bit cumbersome and it *might* not
+// have every color feature we need so at least initial experimentation is done
+// here. If the process can be automated or needs manual ajdustments or needs
+// porting of colorspace code to elisp we don't know.
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "log"
+ "math"
+ "os"
+ "sort"
+ "strconv"
+ "strings"
+
+ "bytes"
+
+ colorful "github.com/lucasb-eyer/go-colorful"
+)
+
+var palettes = []Palette{
+ {
+ Name: "solarized-dark",
+ Solarized: solarized,
+ },
+ {
+ Name: "solarized-light",
+ Solarized: solarized,
+ Inverse: true,
+ },
+ {
+ Name: "solarized-dark-high-contrast",
+ Solarized: solarizedDarkHighContrast,
+ },
+ {
+ Name: "solarized-light-high-contrast",
+ Solarized: solarizedLightHighContrast,
+ Inverse: true,
+ },
+ {
+ Name: "gruvbox-dark",
+ Solarized: gruvboxDark,
+ },
+ {
+ Name: "gruvbox-light",
+ Solarized: gruvboxLight,
+ Inverse: true,
+ },
+}
+
+func main() {
+
+ for _, pal := range palettes {
+ pal.Generate()
+ }
+ fmt.Println("\n-----\n")
+}
+
+func (p Palette) Generate() {
+
+ pal := p.Solarized
+
+ corrected := pal
+ if p.Inverse {
+ corrected = pal.Inverse()
+ }
+ bgs, fgs := createComplementaryColors(corrected, 0.85, 0.3, 0.01)
+ // hbgs, hfgs := createComplementaryColors(corrected, 0.7, 0.2, -0.05)
+ hbgs, hfgs := createComplementaryColors(corrected, 0.6, 0.45, 0.04)
+ cols := Merge(
+ pal.NamedColors(),
+ oldLightAccents.NamedColors().WithSuffix("-l"),
+ oldDarkAccents.NamedColors().WithSuffix("-d"),
+ fgs.NamedColors().WithSuffix("-1fg"),
+ bgs.NamedColors().WithSuffix("-1bg"),
+ hfgs.NamedColors().WithSuffix("-2fg"),
+ hbgs.NamedColors().WithSuffix("-2bg"),
+ )
+ rewriteTheme(cols, p.Name)
+
+}
+
+func createComplementaryColors(sol Solarized, blendBg, blendFg, gamma float64) (accentBgs, accentFgs Accents) {
+ sol = sol.Clone()
+ cs := sol.Accents.Colors()
+
+ light := func(c colorful.Color) float64 {
+ l, _, _ := c.Lab()
+ return l
+ }
+ var bgs, fgs [8]colorful.Color
+ for idx, v := range cs {
+ fmt.Println(" ")
+
+ blendBgColor := sol.Base03.Color()
+ blendFgColor := sol.Base0.Color()
+ brightOnDark := true
+ if light(blendFgColor) < light(blendBgColor) {
+ brightOnDark = false
+ }
+ for _, v := range sol.Base.Colors() {
+ if brightOnDark {
+ if light(v) > light(blendFgColor) {
+ blendFgColor = v
+ }
+ if light(v) < light(blendBgColor) {
+ blendBgColor = v
+ }
+ } else {
+ if light(v) < light(blendFgColor) {
+ blendFgColor = v
+ }
+ if light(v) > light(blendBgColor) {
+ blendBgColor = v
+ }
+ }
+ }
+
+ bg := v.BlendLab(blendBgColor, blendBg)
+ fg := v.BlendLab(blendFgColor, blendFg)
+ {
+ l, _, _ := blendBgColor.Lab()
+ fmt.Printf(" | b1 %.2f %s", l, sol.Base03)
+ }
+ {
+ l, _, _ := blendFgColor.Lab()
+ fmt.Printf(" f1 %.2f %s", l, sol.Base0)
+ }
+
+ lFg := light(blendFgColor)
+ lBg := light(blendBgColor)
+
+ lc := lFg - lBg
+ fmt.Printf(" lc %.2f", lc)
+ bl, ba, bb := bg.Lab()
+ fl, fa, fb := fg.Lab()
+
+ fmt.Printf(" | b2 %.2f %s", bl, bg.Clamped().Hex())
+ fmt.Printf(" f2 %.2f %s", fl, fg.Clamped().Hex())
+ fmt.Printf(" lc %.2f", fl-bl)
+
+ // nlb := bl + (fl-bl)*0.5 + lc*0.5
+ // nlf := bl + (fl-bl)*0.5 - lc*0.5
+ // nlf := lFg
+ // nlb := lBg
+
+ nlb := bl
+ nlf := fl
+ if fl > bl {
+ nlb = nlb - gamma
+ nlf = nlf - gamma
+ } else {
+ nlb = nlb + gamma
+ nlf = nlf + gamma
+ }
+
+ const minimumLightnessDiff = 0.35
+ // const minimumLightnessDiff = 0.45
+ if (math.Max(nlf, nlb) - math.Min(nlf, nlb)) < minimumLightnessDiff {
+ diff := (minimumLightnessDiff - (math.Max(math.Abs(nlf), math.Abs(nlb)) - math.Min(math.Abs(nlf), math.Abs(nlb))))
+ m := 1.0
+ if bl > fl {
+ m = -1
+ }
+ nlf = nlf + nlf/1*diff*m
+ nlb = nlb - nlb/1*diff*m
+ fmt.Printf(" adj %.2f ", diff)
+ } else {
+ fmt.Printf(" ")
+ }
+
+ fg = colorful.Lab(nlf, fa, fb)
+ bg = colorful.Lab(nlb, ba, bb)
+
+ fmt.Printf(" | b3 %.2f %s", nlb, bg.Clamped().Hex())
+ fmt.Printf(" f3 %.2f %s", nlf, fg.Clamped().Hex())
+ fmt.Printf(" lc %.2f", nlf-nlb)
+
+ bgs[idx] = bg
+ fgs[idx] = fg
+
+ }
+ fmt.Println("\n\n")
+ return NewAccents(bgs), NewAccents(fgs)
+}
+
+func createComplementaryColorsPrev(sol Solarized, blendBg, blendFg float64) (accentBgs, accentFgs Accents) {
+ sol = sol.Clone()
+ cs := sol.Accents.Colors()
+
+ light := func(c colorful.Color) float64 {
+ l, _, _ := c.Lab()
+ return l
+ }
+ var bgs, fgs [8]colorful.Color
+ for idx, v := range cs {
+ fmt.Println(" ")
+ bg := v.BlendLab(sol.Base03.Color(), blendBg)
+ fg := v.BlendLab(sol.Base0.Color(), blendFg)
+
+ {
+ l, _, _ := sol.Base03.Color().Lab()
+ fmt.Printf(" | b1 %.2f %s", l, sol.Base03)
+ }
+
+ {
+ l, _, _ := sol.Base0.Color().Lab()
+ fmt.Printf(" f1 %.2f %s", l, sol.Base0)
+ }
+
+ lFg := light(sol.Base0.Color())
+ lBg := light(sol.Base03.Color())
+
+ lc := lFg - lBg
+ fmt.Printf(" lc %.2f", lc)
+ bl, ba, bb := bg.Lab()
+ fl, fa, fb := fg.Lab()
+
+ fmt.Printf(" | b2 %.2f %s", bl, bg.Clamped().Hex())
+ fmt.Printf(" f2 %.2f %s", fl, fg.Clamped().Hex())
+ fmt.Printf(" lc %.2f", fl-bl)
+
+ // nlb := bl + (fl-bl)*0.5 + lc*0.5
+ // nlf := bl + (fl-bl)*0.5 - lc*0.5
+ // nlf := lFg
+ // nlb := lBg
+
+ nlb := bl
+ nlf := fl
+ if bl < fl {
+ nlb = nlb + 0.01
+ nlf = nlf + 0.01
+ } else {
+ nlb = nlb - 0.01
+ nlf = nlf - 0.01
+ }
+
+ fg = colorful.Lab(nlf, fa, fb)
+ bg = colorful.Lab(nlb, ba, bb)
+
+ fmt.Printf(" | b3 %.2f %s", nlb, bg.Clamped().Hex())
+ fmt.Printf(" f3 %.2f %s", nlf, fg.Clamped().Hex())
+ fmt.Printf(" lc %.2f", nlf-nlb)
+
+ bgs[idx] = bg
+ fgs[idx] = fg
+
+ }
+ fmt.Println("\n\n")
+ return NewAccents(bgs), NewAccents(fgs)
+}
+
+type Solarized struct {
+ Base
+ Accents
+ // AccentsBg Accents
+ // AccentsFg Accents
+}
+
+func (s Solarized) Clone() Solarized {
+ return Solarized{
+ Base: s.Base.Clone(),
+ Accents: s.Accents.Clone(),
+ // AccentsFg: s.AccentsFg,
+ // AccentsBg: s.AccentsBg,
+ }
+}
+
+func (s Solarized) Inverse() Solarized {
+ return Solarized{
+ Base: s.Base.Inverse(),
+ Accents: s.Accents.Clone(),
+ // AccentsFg: s.AccentsFg,
+ // AccentsBg: s.AccentsBg,
+ }
+}
+func (s Solarized) NamedColors() NamedColors {
+ return Merge(s.Base.NamedColors(), s.Accents.NamedColors())
+
+}
+
+type HexColor string
+
+func (h HexColor) Color() colorful.Color {
+ col, err := colorful.Hex(string(h))
+ if err != nil {
+ panic(err)
+ }
+ return col
+}
+
+type Base struct {
+ Base03 HexColor
+ Base02 HexColor
+ Base01 HexColor
+ Base00 HexColor
+ Base0 HexColor
+ Base1 HexColor
+ Base2 HexColor
+ Base3 HexColor
+}
+
+func NewBase(bc [8]colorful.Color) Base {
+ return Base{
+ Base03: HexColor(bc[0].Clamped().Hex()),
+ Base02: HexColor(bc[1].Clamped().Hex()),
+ Base01: HexColor(bc[2].Clamped().Hex()),
+ Base00: HexColor(bc[3].Clamped().Hex()),
+ Base0: HexColor(bc[4].Clamped().Hex()),
+ Base1: HexColor(bc[5].Clamped().Hex()),
+ Base2: HexColor(bc[6].Clamped().Hex()),
+ Base3: HexColor(bc[7].Clamped().Hex()),
+ }
+}
+func (s Base) Clone() Base {
+ return Base{
+ Base03: s.Base03,
+ Base02: s.Base02,
+ Base01: s.Base01,
+ Base00: s.Base00,
+ Base0: s.Base0,
+ Base1: s.Base1,
+ Base2: s.Base2,
+ Base3: s.Base3,
+ }
+}
+func (s Base) NamedColors() NamedColors {
+ nc := make(NamedColors, 8)
+ arr := s.colorArray()
+ for idx, hex := range arr {
+ nc[baseNames[idx]] = hex
+ }
+ return nc
+}
+
+func (s Base) Colors() BaseColors {
+ a := s.colorArray()
+ return [8]colorful.Color{
+ a[0].Color(),
+ a[1].Color(),
+ a[2].Color(),
+ a[3].Color(),
+ a[4].Color(),
+ a[5].Color(),
+ a[6].Color(),
+ a[7].Color(),
+ }
+}
+func (s Base) colorArray() [8]HexColor {
+ return [8]HexColor{
+ s.Base03,
+ s.Base02,
+ s.Base01,
+ s.Base00,
+ s.Base0,
+ s.Base1,
+ s.Base2,
+ s.Base3,
+ }
+}
+
+var baseNames = [8]string{
+ 0: "base03",
+ 1: "base02",
+ 2: "base01",
+ 3: "base00",
+ 4: "base0",
+ 5: "base1",
+ 6: "base2",
+ 7: "base3",
+}
+
+type BaseColors [8]colorful.Color
+
+func (s Base) Inverse() Base {
+ return Base{
+ Base03: s.Base3,
+ Base02: s.Base2,
+ Base01: s.Base1,
+ Base00: s.Base0,
+ Base0: s.Base00,
+ Base1: s.Base01,
+ Base2: s.Base02,
+ Base3: s.Base03,
+ }
+}
+func (b Base) ChangeLightness(amountFgs, amountBgs float64) Base {
+ cc := b.Colors()
+ lightness := func(c colorful.Color, v float64) colorful.Color {
+ l, a, b := c.Lab()
+ l = l + v
+ return colorful.Lab(l, a, b)
+ }
+ cc[0] = lightness(cc[0], amountBgs)
+ cc[1] = lightness(cc[1], amountBgs)
+ cc[2] = lightness(cc[2], amountFgs)
+ cc[3] = lightness(cc[3], amountBgs)
+ cc[4] = lightness(cc[4], amountFgs)
+ cc[5] = lightness(cc[5], amountFgs)
+ cc[6] = lightness(cc[6], amountFgs)
+ cc[7] = lightness(cc[7], amountFgs)
+ return NewBase(cc)
+}
+
+// Accents .
+type Accents struct {
+ Yellow HexColor
+ Orange HexColor
+ Red HexColor
+ Magenta HexColor
+ Violet HexColor
+ Blue HexColor
+ Cyan HexColor
+ Green HexColor
+}
+
+func NewAccents(cc [8]colorful.Color) Accents {
+ return Accents{
+ Yellow: HexColor(cc[0].Clamped().Hex()),
+ Orange: HexColor(cc[1].Clamped().Hex()),
+ Red: HexColor(cc[2].Clamped().Hex()),
+ Magenta: HexColor(cc[3].Clamped().Hex()),
+ Violet: HexColor(cc[4].Clamped().Hex()),
+ Blue: HexColor(cc[5].Clamped().Hex()),
+ Cyan: HexColor(cc[6].Clamped().Hex()),
+ Green: HexColor(cc[7].Clamped().Hex()),
+ }
+}
+func (s Accents) Clone() Accents {
+ return Accents{
+ Yellow: s.Yellow,
+ Orange: s.Orange,
+ Red: s.Red,
+ Magenta: s.Magenta,
+ Violet: s.Violet,
+ Blue: s.Blue,
+ Cyan: s.Cyan,
+ Green: s.Green,
+ }
+}
+
+func (s Accents) Colors() AccentColors {
+ a := s.colorArray()
+ return [8]colorful.Color{
+ a[0].Color(),
+ a[1].Color(),
+ a[2].Color(),
+ a[3].Color(),
+ a[4].Color(),
+ a[5].Color(),
+ a[6].Color(),
+ a[7].Color(),
+ }
+}
+func (a Accents) ChangeLightness(amount float64) Accents {
+ cc := a.Colors()
+ lightness := func(c colorful.Color, v float64) colorful.Color {
+ l, a, b := c.Lab()
+ l = l + v
+ return colorful.Lab(l, a, b)
+ }
+ cc[0] = lightness(cc[0], amount)
+ cc[1] = lightness(cc[1], amount)
+ cc[2] = lightness(cc[2], amount)
+ cc[3] = lightness(cc[3], amount)
+ cc[4] = lightness(cc[4], amount)
+ cc[5] = lightness(cc[5], amount)
+ cc[6] = lightness(cc[6], amount)
+ cc[7] = lightness(cc[7], amount)
+ return NewAccents(cc)
+}
+func (ac Accents) NamedColors() NamedColors {
+ nc := make(NamedColors, 8)
+ arr := ac.colorArray()
+ for idx, hex := range arr {
+ nc[accentNames[idx]] = hex
+ }
+ return nc
+}
+
+func (s Accents) colorArray() [8]HexColor {
+ return [8]HexColor{
+ s.Yellow,
+ s.Orange,
+ s.Red,
+ s.Magenta,
+ s.Violet,
+ s.Blue,
+ s.Cyan,
+ s.Green,
+ }
+}
+
+var accentNames = [8]string{
+ 0: "yellow",
+ 1: "orange",
+ 2: "red",
+ 3: "magenta",
+ 4: "violet",
+ 5: "blue",
+ 6: "cyan",
+ 7: "green",
+}
+
+type AccentColors [8]colorful.Color
+
+type NamedColors map[string]HexColor
+
+func (n NamedColors) WithPrefix(prefix string) NamedColors {
+ nc := make(NamedColors, len(n))
+ for k, v := range n {
+ nc[fmt.Sprintf("%s%s", prefix, k)] = v
+ }
+ return nc
+}
+
+func (n NamedColors) WithSuffix(suffix string) NamedColors {
+ nc := make(NamedColors, len(n))
+ for k, v := range n {
+ nc[fmt.Sprintf("%s%s", k, suffix)] = v
+ }
+ return nc
+}
+
+func (n NamedColors) PrintAlist(w io.Writer, indent int) (int, error) {
+ keys := n.OrderedKeys()
+ var longestKey int
+ for _, n := range keys {
+ l := len(n)
+ if l > longestKey {
+ longestKey = l
+ }
+ }
+ longestKey = longestKey
+ prefix := ""
+ for i := 0; i < indent; i++ {
+ prefix += " "
+
+ }
+ var nt int
+
+ for _, name := range keys {
+ n, err := fmt.Fprintf(w, "%s(%-"+strconv.Itoa(longestKey)+"s . \"%s\")\n", prefix, name, n[name])
+ n = n + nt
+ if err != nil {
+ return nt, err
+ }
+
+ }
+ return nt, nil
+}
+
+// Orderedkeys returns the keys in a order that is like how solarized names should be ordered.
+//
+// primary orer is:
+//
+// 1. base names
+// 2. accent colors
+// 3. names that contain base names
+// 4. names that contain accent color names
+// 5. the rest
+//
+// secondary sort order is by string comparison.
+//
+func (n NamedColors) OrderedKeys() []string {
+ var names []string
+ for k, _ := range n {
+ names = append(names, k)
+ }
+ sort.Sort(sort.StringSlice(names))
+
+ var allNames []string
+ for _, n := range baseNames {
+ allNames = append(allNames, n)
+ }
+ for _, n := range accentNames {
+ allNames = append(allNames, n)
+ }
+ score := func(idx int, exact bool) int {
+ s := (len(allNames) - idx) + 1
+ if exact {
+ s = s + len(allNames)
+ }
+ return s
+ }
+ sort.SliceStable(names, func(i int, j int) bool {
+ var is, js int // scores
+ in := names[i]
+ jn := names[j]
+ scoring:
+ for sortIdx, sortName := range allNames {
+ if is == 0 {
+ // log.Println(in, sortName)
+ if strings.Contains(in, sortName) {
+ is = score(sortIdx, in == sortName)
+ // fmt.Println("score in", in, sortName, is)
+ }
+ }
+ if js == 0 {
+ if strings.Contains(jn, sortName) {
+ js = score(sortIdx, jn == sortName)
+ // fmt.Println("score j", jn, sortName, js)
+ }
+ }
+ if is != 0 && js != 0 {
+ break scoring
+ }
+ }
+ // log.Println(is, js, in,jn)
+ return is > js
+ })
+ return names
+}
+
+func Merge(nc ...NamedColors) NamedColors {
+ res := make(NamedColors)
+ for _, nc := range nc {
+ for k, v := range nc {
+ res[k] = v
+ }
+ }
+ return res
+}
+
+var ( // The original solarized color palette
+ solarized = Solarized{
+ Base: Base{
+ Base03: SolarizedBase03,
+ Base02: SolarizedBase02,
+ Base01: SolarizedBase01,
+ Base00: SolarizedBase00,
+ Base0: SolarizedBase0,
+ Base1: SolarizedBase1,
+ Base2: SolarizedBase2,
+ Base3: SolarizedBase3,
+ },
+ Accents: Accents{
+ Blue: SolarizedBlue,
+ Cyan: SolarizedCyan,
+ Green: SolarizedGreen,
+ Magenta: SolarizedMagenta,
+ Orange: SolarizedOrange,
+ Red: SolarizedRed,
+ Violet: SolarizedViolet,
+ Yellow: SolarizedYellow,
+ },
+ }
+ solarizedDarkHighContrast = Solarized{
+ Base: solarized.Base.Clone().ChangeLightness(0.04, -0.02),
+ Accents: solarized.Accents.Clone().ChangeLightness(0.05),
+ }
+ solarizedLightHighContrast = Solarized{
+ Base: solarized.Base.Clone().ChangeLightness(0.02, -0.05),
+ Accents: solarized.Accents.Clone().ChangeLightness(-0.05),
+ }
+
+ // the current -d colors in the emacs theme
+ oldDarkAccents = Accents{
+ Blue: "#00629D",
+ Cyan: "#00736F",
+ Green: "#546E00",
+ Magenta: "#93115C",
+ Orange: "#8B2C02",
+ Red: "#990A1B",
+ Violet: "#3F4D91",
+ Yellow: "#7B6000",
+ }
+ // the current -l colors in the emacs theme
+ oldLightAccents = Accents{
+ Blue: "#69B7F0",
+ Cyan: "#69CABF",
+ Green: "#B4C342",
+ Magenta: "#F771AC",
+ Orange: "#F2804F",
+ Red: "#FF6E64",
+ Violet: "#9EA0E5",
+ Yellow: "#DEB542",
+ }
+ gruvboxDark = Solarized{
+ Base: Base{
+ Base03: GruvboxDark0,
+ Base02: GruvboxDark0Soft,
+ Base01: GruvboxDark4,
+ Base00: GruvboxDark0,
+ Base0: GruvboxLight4,
+ Base1: GruvboxLight3,
+ Base2: GruvboxLight4,
+ Base3: GruvboxLight0,
+ },
+ Accents: Accents{
+ Blue: GruvboxBlue,
+ Cyan: GruvboxAqua,
+ Green: GruvboxGreen,
+ Magenta: GruvboxBrightPurple,
+ Orange: GruvboxOrange,
+ Red: GruvboxBrightRed,
+ Violet: GruvboxPurple,
+ Yellow: GruvboxYellow,
+ },
+ }
+ // note: not inversed here
+ gruvboxLight = Solarized{
+ Base: Base{
+ Base03: GruvboxDark0,
+ Base02: GruvboxDark0Soft,
+ Base01: GruvboxDark3,
+ Base00: GruvboxDark4,
+ Base0: GruvboxDark1,
+ Base1: GruvboxLight4,
+ Base2: GruvboxLight1,
+ Base3: GruvboxLight0,
+ },
+ Accents: Accents{
+ Blue: GruvboxDarkBlue,
+ Cyan: GruvboxAqua,
+ Green: GruvboxGreen,
+ Magenta: GruvboxBrightPurple,
+ Orange: GruvboxDarkOrange,
+ Red: GruvboxDarkRed,
+ Violet: GruvboxDarkPurple,
+ Yellow: GruvboxDarkYellow,
+ },
+ }
+)
+
+const (
+ SolarizedBase03 = HexColor("#002b36")
+ SolarizedBase02 = HexColor("#073642")
+ SolarizedBase01 = HexColor("#586e75")
+ SolarizedBase00 = HexColor("#657b83")
+ SolarizedBase0 = HexColor("#839496")
+ SolarizedBase1 = HexColor("#93a1a1")
+ SolarizedBase2 = HexColor("#eee8d5")
+ SolarizedBase3 = HexColor("#fdf6e3")
+ SolarizedBlue = HexColor("#268bd2")
+ SolarizedCyan = HexColor("#2aa198")
+ SolarizedGreen = HexColor("#859900")
+ SolarizedMagenta = HexColor("#d33682")
+ SolarizedOrange = HexColor("#cb4b16")
+ SolarizedRed = HexColor("#dc322f")
+ SolarizedViolet = HexColor("#6c71c4")
+ SolarizedYellow = HexColor("#b58900")
+
+ GruvboxDark0Hard = HexColor("#1d2021")
+ GruvboxDark0 = HexColor("#282828")
+ GruvboxDark0Soft = HexColor("#32302f")
+ GruvboxDark1 = HexColor("#3c3836")
+ GruvboxDark2 = HexColor("#504945")
+ GruvboxDark3 = HexColor("#665c54")
+ GruvboxDark4 = HexColor("#7c6f64")
+ GruvboxGray = HexColor("#928374")
+ GruvboxLight0Hard = HexColor("#f9f5d7")
+ GruvboxLight0 = HexColor("#fbf1c7")
+ GruvboxLight0Soft = HexColor("#f2e5bc")
+ GruvboxLight1 = HexColor("#ebdbb2")
+ GruvboxLight2 = HexColor("#d5c4a1")
+ GruvboxLight3 = HexColor("#bdae93")
+ GruvboxLight4 = HexColor("#a89984")
+ GruvboxRed = HexColor("#cc241d")
+ GruvboxGreen = HexColor("#98971a")
+ GruvboxYellow = HexColor("#d79921")
+ GruvboxBlue = HexColor("#458588")
+ GruvboxPurple = HexColor("#b16286")
+ GruvboxAqua = HexColor("#689d6a")
+ GruvboxOrange = HexColor("#d65d0e")
+ GruvboxBrightRed = HexColor("#fb4933")
+ GruvboxBrightGreen = HexColor("#b8bb26")
+ GruvboxBrightYellow = HexColor("#fabd2f")
+ GruvboxBrightBlue = HexColor("#83a598")
+ GruvboxBrightPurple = HexColor("#d3869b")
+ GruvboxBrightAqua = HexColor("#8ec07c")
+ GruvboxBrightOrange = HexColor("#fe8019")
+ GruvboxDarkRed = HexColor("#9d0006")
+ GruvboxDarkGreen = HexColor("#79740e")
+ GruvboxDarkYellow = HexColor("#b57614")
+ GruvboxDarkBlue = HexColor("#076678")
+ GruvboxDarkPurple = HexColor("#8f3f71")
+ GruvboxDarkAqua = HexColor("#427b58")
+ GruvboxDarkOrange = HexColor("#af3a03")
+)
+
+// Palette .
+type Palette struct {
+ Name string
+ Inverse bool
+ Solarized Solarized
+}
+
+func rewriteTheme(nc NamedColors, paletteName string) {
+
+ var dst bytes.Buffer
+
+ file, err := os.Open("../solarized-palettes.el")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer file.Close()
+
+ scanner := bufio.NewScanner(file)
+ var insideReplacement bool
+ for scanner.Scan() {
+ txt := scanner.Text()
+ if insideReplacement && strings.HasSuffix(txt, ";; palette end") {
+ insideReplacement = false
+ }
+ if !insideReplacement {
+ dst.WriteString(txt)
+ dst.WriteString("\n")
+
+ }
+ if strings.HasSuffix(txt, fmt.Sprintf(";; %s palette", paletteName)) {
+ insideReplacement = true
+ nc.PrintAlist(&dst, 4)
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ log.Fatal(err)
+ }
+
+ file.Close()
+
+ ioutil.WriteFile("../solarized-palettes.el", dst.Bytes(), 0x776)
+
+}
diff --git a/minimal-init/init.el b/minimal-init/init.el
@@ -116,6 +116,10 @@
(dev-save-elisp-buffers)
(ignore-errors
(unload-feature 'solarized t))
+ (ignore-errors
+ (unload-feature 'solarized-faces t))
+ (ignore-errors
+ (unload-feature 'solarized-palettes t))
(dev-set-solarized-settings)
(load-library "solarized")
(let ((themes (reverse (or dev-reload-theme-last-setting
diff --git a/solarized-dark-high-contrast-theme.el b/solarized-dark-high-contrast-theme.el
@@ -23,24 +23,6 @@
(require 'solarized)
-(defvar solarized-dark-high-contrast-palette-alist
- (copy-alist solarized-color-palette-alist))
-
-(let ((p solarized-dark-high-contrast-palette-alist)
- (o solarized-color-palette-alist)
- (a 0.9)
- (a2 0.85)
- (white "#ffffe8")
- (black "#051018"))
- (setcdr (assq 'base03 p) (solarized-color-blend (alist-get 'base03 o) black a 2))
- (setcdr (assq 'base02 p) (solarized-color-blend (alist-get 'base02 o) black a 2))
- (setcdr (assq 'base01 p) (solarized-color-blend (alist-get 'base01 o) white a 2))
- (setcdr (assq 'base00 p) (solarized-color-blend (alist-get 'base00 o) white a2 2))
- (setcdr (assq 'base0 p) (solarized-color-blend (alist-get 'base0 o) white a2 2))
- (setcdr (assq 'base1 p) (solarized-color-blend (alist-get 'base1 o) white a2 2))
- (setcdr (assq 'base2 p) (solarized-color-blend (alist-get 'base2 o) black a 2))
- (setcdr (assq 'base3 p) (solarized-color-blend (alist-get 'base3 o) black a 2)))
-
(deftheme solarized-dark-high-contrast
"The dark variant of the Solarized colour theme with slightly higher text contrast")
diff --git a/solarized-dark-theme.el b/solarized-dark-theme.el
@@ -25,7 +25,8 @@
(deftheme solarized-dark "The dark variant of the Solarized colour theme")
-(solarized-create-theme 'dark 'solarized-dark)
+(solarized-definition 'dark 'solarized-dark
+ solarized-dark-color-palette-alist)
(provide-theme 'solarized-dark)
diff --git a/solarized-faces.el b/solarized-faces.el
@@ -1164,6 +1164,18 @@ customize the resulting theme."
`(markdown-bold-face ((,class (:inherit bold))))
`(markdown-code-face ((,class (:inherit fixed-pitch :foreground ,base01
:background unspecified))))
+
+ `(magit-diff-added ((,class (:background ,green-1bg :foreground ,green-1fg))))
+ `(magit-diff-added-highlight ((,class (:background ,green-2bg :foreground ,green-2fg))))
+ `(magit-diff-base ((,class (:background ,yellow-1bg :foreground ,yellow-1fg))))
+ `(magit-diff-base-highlight ((,class (:background ,yellow-2bg :foreground ,yellow-2bg))))
+
+ `(magit-diff-conflict-heading ((,class (:inherit magit-diff-hunk-heading))))
+ `(magit-diff-context ((,class (:foreground ,base0))))
+ `(magit-diff-removed ((,class (:background ,red-1bg :foreground ,red-1fg))))
+ `(magit-diff-removed-highlight ((,class (:background ,red-2bg :foreground ,red-2fg))))
+
+
`(markdown-comment-face ((,class (:foreground ,base01 :strike-through t))))
`(markdown-footnote-face ((,class (:inherit default))))
`(markdown-header-delimiter-face ((,class (:foreground ,base01))))
diff --git a/solarized-light-high-contrast-theme.el b/solarized-light-high-contrast-theme.el
@@ -23,26 +23,6 @@
(require 'solarized)
-(defvar solarized-light-high-contrast-palette-alist
- (copy-alist solarized-color-palette-alist))
-
-(let ((p solarized-light-high-contrast-palette-alist)
- (o solarized-color-palette-alist)
- (a 0.9)
- (a2 0.8)
- (a3 0.7)
- (white "#ffffe8")
- (black "#051018")
- (grey "#a0a0a0"))
- (setcdr (assq 'base03 p) (solarized-color-blend (alist-get 'base03 o) black a 2))
- (setcdr (assq 'base02 p) (solarized-color-blend (alist-get 'base02 o) black a 2))
- (setcdr (assq 'base01 p) (solarized-color-blend (alist-get 'base01 o) grey a3 2))
- (setcdr (assq 'base00 p) (solarized-color-blend (alist-get 'base00 o) black a 2))
- (setcdr (assq 'base0 p) (solarized-color-blend (alist-get 'base0 o) black a2 2))
- (setcdr (assq 'base1 p) (solarized-color-blend (alist-get 'base1 o) black a3 2))
- (setcdr (assq 'base2 p) (solarized-color-blend (alist-get 'base2 o) white a 2))
- (setcdr (assq 'base3 p) (solarized-color-blend (alist-get 'base3 o) white a 2)))
-
(deftheme solarized-light-high-contrast
"The light variant of the Solarized colour theme with slightly higher text contrast")
diff --git a/solarized-light-theme.el b/solarized-light-theme.el
@@ -25,7 +25,8 @@
(deftheme solarized-light "The light variant of the Solarized colour theme")
-(solarized-create-theme 'light 'solarized-light)
+(solarized-definition 'light 'solarized-light
+ solarized-light-color-palette-alist)
(provide-theme 'solarized-light)
diff --git a/solarized-palettes.el b/solarized-palettes.el
@@ -10,40 +10,282 @@
;;; Code:
-(defvar solarized-color-palette-alist
- '(;; solarized palette
- (base03 . "#002b36")
- (base02 . "#073642")
- (base01 . "#586e75")
- (base00 . "#657b83")
- (base0 . "#839496")
- (base1 . "#93a1a1")
- (base2 . "#eee8d5")
- (base3 . "#fdf6e3")
- (yellow . "#b58900")
- (orange . "#cb4b16")
- (red . "#dc322f")
- (magenta . "#d33682")
- (violet . "#6c71c4")
- (blue . "#268bd2")
- (cyan . "#2aa198")
- (green . "#859900")
- (yellow-d . "#7B6000")
- (yellow-l . "#DEB542")
- (orange-d . "#8B2C02")
- (orange-l . "#F2804F")
- (red-d . "#990A1B")
- (red-l . "#FF6E64")
- (magenta-d . "#93115C")
- (magenta-l . "#F771AC")
- (violet-d . "#3F4D91")
- (violet-l . "#9EA0E5")
- (blue-d . "#00629D")
- (blue-l . "#69B7F0")
- (cyan-d . "#00736F")
- (cyan-l . "#69CABF")
- (green-d . "#546E00")
- (green-l . "#B4C342")
+(defvar solarized-dark-color-palette-alist
+ '(;; solarized-dark palette
+ (base03 . "#002b36")
+ (base02 . "#073642")
+ (base01 . "#586e75")
+ (base00 . "#657b83")
+ (base0 . "#839496")
+ (base1 . "#93a1a1")
+ (base2 . "#eee8d5")
+ (base3 . "#fdf6e3")
+ (yellow . "#b58900")
+ (orange . "#cb4b16")
+ (red . "#dc322f")
+ (magenta . "#d33682")
+ (violet . "#6c71c4")
+ (blue . "#268bd2")
+ (cyan . "#2aa198")
+ (green . "#859900")
+ (yellow-1bg . "#273632")
+ (yellow-1fg . "#cca551")
+ (yellow-2bg . "#4a4527")
+ (yellow-2fg . "#cfad68")
+ (yellow-d . "#7B6000")
+ (yellow-l . "#DEB542")
+ (orange-1bg . "#2d3031")
+ (orange-1fg . "#df7d50")
+ (orange-2bg . "#553325")
+ (orange-2fg . "#df8f66")
+ (orange-d . "#8B2C02")
+ (orange-l . "#F2804F")
+ (red-1bg . "#302f33")
+ (red-1fg . "#ec745f")
+ (red-2bg . "#5b2e2c")
+ (red-2fg . "#e98871")
+ (red-d . "#990A1B")
+ (red-l . "#FF6E64")
+ (magenta-1bg . "#2a2f3e")
+ (magenta-1fg . "#e1769b")
+ (magenta-2bg . "#543049")
+ (magenta-2fg . "#e08aa2")
+ (magenta-d . "#93115C")
+ (magenta-l . "#F771AC")
+ (violet-1bg . "#0f3347")
+ (violet-1fg . "#9994cb")
+ (violet-2bg . "#233d61")
+ (violet-2fg . "#a6a0c8")
+ (violet-d . "#3F4D91")
+ (violet-l . "#9EA0E5")
+ (blue-1bg . "#003649")
+ (blue-1fg . "#7ca7d5")
+ (blue-2bg . "#004666")
+ (blue-2fg . "#92aecf")
+ (blue-d . "#00629D")
+ (blue-l . "#69B7F0")
+ (cyan-1bg . "#013941")
+ (cyan-1fg . "#76b8ab")
+ (cyan-2bg . "#004e52")
+ (cyan-2fg . "#8cbcae")
+ (cyan-d . "#00736F")
+ (cyan-l . "#69CABF")
+ (green-1bg . "#1d3732")
+ (green-1fg . "#a8b152")
+ (green-2bg . "#374a27")
+ (green-2fg . "#b2b769")
+ (green-d . "#546E00")
+ (green-l . "#B4C342")
+ ;; palette end
+ )
+ "The solarized color palette alist.")
+
+(defvar solarized-light-color-palette-alist
+ '(;; solarized-light palette
+ (base03 . "#002b36")
+ (base02 . "#073642")
+ (base01 . "#586e75")
+ (base00 . "#657b83")
+ (base0 . "#839496")
+ (base1 . "#93a1a1")
+ (base2 . "#eee8d5")
+ (base3 . "#fdf6e3")
+ (yellow . "#b58900")
+ (orange . "#cb4b16")
+ (red . "#dc322f")
+ (magenta . "#d33682")
+ (violet . "#6c71c4")
+ (blue . "#268bd2")
+ (cyan . "#2aa198")
+ (green . "#859900")
+ (yellow-1bg . "#f8e8c6")
+ (yellow-1fg . "#876d26")
+ (yellow-2bg . "#f1d49b")
+ (yellow-2fg . "#766634")
+ (yellow-d . "#7B6000")
+ (yellow-l . "#DEB542")
+ (orange-1bg . "#fedfc5")
+ (orange-1fg . "#974727")
+ (orange-2bg . "#ffbd99")
+ (orange-2fg . "#854a33")
+ (orange-d . "#8B2C02")
+ (orange-l . "#F2804F")
+ (red-1bg . "#ffdec8")
+ (red-1fg . "#a33c35")
+ (red-2bg . "#ffb9a1")
+ (red-2fg . "#8e433d")
+ (red-d . "#990A1B")
+ (red-l . "#FF6E64")
+ (magenta-1bg . "#fdded7")
+ (magenta-1fg . "#9a3f6c")
+ (magenta-2bg . "#fdbac6")
+ (magenta-2fg . "#854568")
+ (magenta-d . "#93115C")
+ (magenta-l . "#F771AC")
+ (violet-1bg . "#ebe4e2")
+ (violet-1fg . "#4f5e99")
+ (violet-2bg . "#d1c9e3")
+ (violet-2fg . "#475a8b")
+ (violet-d . "#3F4D91")
+ (violet-l . "#9EA0E5")
+ (blue-1bg . "#e7e8e4")
+ (blue-1fg . "#1e6fa2")
+ (blue-2bg . "#c3d5e9")
+ (blue-2fg . "#246792")
+ (blue-d . "#00629D")
+ (blue-l . "#69B7F0")
+ (cyan-1bg . "#e4ecda")
+ (cyan-1fg . "#207e7b")
+ (cyan-2bg . "#bedfcf")
+ (cyan-2fg . "#247374")
+ (cyan-d . "#00736F")
+ (cyan-l . "#69CABF")
+ (green-1bg . "#efeac7")
+ (green-1fg . "#657827")
+ (green-2bg . "#dbdb9c")
+ (green-2fg . "#5b6e35")
+ (green-d . "#546E00")
+ (green-l . "#B4C342")
+ ;; palette end
+ )
+ "The solarized color palette alist.")
+
+(defvar solarized-dark-high-contrast-palette-alist
+ '(;; solarized-dark-high-contrast palette
+ (base03 . "#002732")
+ (base02 . "#01323d")
+ (base01 . "#62787f")
+ (base00 . "#60767e")
+ (base0 . "#8d9fa1")
+ (base1 . "#9eacac")
+ (base2 . "#faf3e0")
+ (base3 . "#ffffee")
+ (yellow . "#c49619")
+ (orange . "#db5823")
+ (red . "#ec423a")
+ (magenta . "#e2468f")
+ (violet . "#7a7ed2")
+ (blue . "#3c98e0")
+ (cyan . "#3cafa5")
+ (green . "#93a61a")
+ (yellow-1bg . "#273430")
+ (yellow-1fg . "#d7b15d")
+ (yellow-2bg . "#4d4729")
+ (yellow-2fg . "#d8b974")
+ (yellow-d . "#7B6000")
+ (yellow-l . "#DEB542")
+ (orange-1bg . "#2d2e2f")
+ (orange-1fg . "#eb895c")
+ (orange-2bg . "#583427")
+ (orange-2fg . "#e99a72")
+ (orange-d . "#8B2C02")
+ (orange-l . "#F2804F")
+ (red-1bg . "#2f2d32")
+ (red-1fg . "#f8806a")
+ (red-2bg . "#5e302e")
+ (red-2fg . "#f4937c")
+ (red-d . "#990A1B")
+ (red-l . "#FF6E64")
+ (magenta-1bg . "#2a2d3d")
+ (magenta-1fg . "#ed82a8")
+ (magenta-2bg . "#57324c")
+ (magenta-2fg . "#e995ae")
+ (magenta-d . "#93115C")
+ (magenta-l . "#F771AC")
+ (violet-1bg . "#113145")
+ (violet-1fg . "#a2a0d8")
+ (violet-2bg . "#273f63")
+ (violet-2fg . "#aeabd4")
+ (violet-d . "#3F4D91")
+ (violet-l . "#9EA0E5")
+ (blue-1bg . "#023447")
+ (blue-1fg . "#85b3e2")
+ (blue-2bg . "#014868")
+ (blue-2fg . "#99badc")
+ (blue-d . "#00629D")
+ (blue-l . "#69B7F0")
+ (cyan-1bg . "#03373f")
+ (cyan-1fg . "#7fc4b8")
+ (cyan-2bg . "#055054")
+ (cyan-2fg . "#93c8ba")
+ (cyan-d . "#00736F")
+ (cyan-l . "#69CABF")
+ (green-1bg . "#1e3531")
+ (green-1fg . "#b3bd5f")
+ (green-2bg . "#3a4c29")
+ (green-2fg . "#bbc275")
+ (green-d . "#546E00")
+ (green-l . "#B4C342")
+ ;; palette end
+ )
+ "The solarized color palette alist.")
+
+(defvar solarized-light-high-contrast-palette-alist
+ '(;; solarized-light-high-contrast palette
+ (base03 . "#00212b")
+ (base02 . "#002b37")
+ (base01 . "#5d737a")
+ (base00 . "#596e76")
+ (base0 . "#88999b")
+ (base1 . "#98a6a6")
+ (base2 . "#f4eedb")
+ (base3 . "#fffce9")
+ (yellow . "#a67c00")
+ (orange . "#bb3e06")
+ (red . "#cc1f24")
+ (magenta . "#c42475")
+ (violet . "#5e65b6")
+ (blue . "#007ec4")
+ (cyan . "#11948b")
+ (green . "#778c00")
+ (yellow-1bg . "#f7ebcb")
+ (yellow-1fg . "#7a6120")
+ (yellow-2bg . "#ecd29c")
+ (yellow-2fg . "#6b5a2c")
+ (yellow-d . "#7B6000")
+ (yellow-l . "#DEB542")
+ (orange-1bg . "#fee2c8")
+ (orange-1fg . "#8a3b1c")
+ (orange-2bg . "#fabc97")
+ (orange-2fg . "#793e28")
+ (orange-d . "#8B2C02")
+ (orange-l . "#F2804F")
+ (red-1bg . "#ffe1cb")
+ (red-1fg . "#952f2a")
+ (red-2bg . "#ffb79f")
+ (red-2fg . "#823731")
+ (red-d . "#990A1B")
+ (red-l . "#FF6E64")
+ (magenta-1bg . "#fce1da")
+ (magenta-1fg . "#8e3160")
+ (magenta-2bg . "#f9b9c4")
+ (magenta-2fg . "#7a395c")
+ (magenta-d . "#93115C")
+ (magenta-l . "#F771AC")
+ (violet-1bg . "#ebe7e5")
+ (violet-1fg . "#44528c")
+ (violet-2bg . "#cdc8e1")
+ (violet-2fg . "#3d4f7e")
+ (violet-d . "#3F4D91")
+ (violet-l . "#9EA0E5")
+ (blue-1bg . "#e6ebe7")
+ (blue-1fg . "#0a6395")
+ (blue-2bg . "#bfd2e6")
+ (blue-2fg . "#185b85")
+ (blue-d . "#00629D")
+ (blue-l . "#69B7F0")
+ (cyan-1bg . "#e4efdd")
+ (cyan-1fg . "#10716f")
+ (cyan-2bg . "#b9ddcd")
+ (cyan-2fg . "#196767")
+ (cyan-d . "#00736F")
+ (cyan-l . "#69CABF")
+ (green-1bg . "#eeedcb")
+ (green-1fg . "#596c21")
+ (green-2bg . "#d5d99d")
+ (green-2fg . "#51622d")
+ (green-d . "#546E00")
+ (green-l . "#B4C342")
;; palette end
)
"The solarized color palette alist.")
@@ -94,78 +336,140 @@
(defvar solarized-gruvbox-dark-color-palette-alist
'(;; gruvbox-dark palette
- (base00 . (alist-get 'dark4 solarized-gruvbox-colors))
- (base01 . (alist-get 'dark3 solarized-gruvbox-colors))
- (base02 . (alist-get 'dark0_soft solarized-gruvbox-colors))
- (base03 . (alist-get 'dark0 solarized-gruvbox-colors))
- (base0 . (alist-get 'light4 solarized-gruvbox-colors))
- (base1 . (alist-get 'light3 solarized-gruvbox-colors))
- (base2 . (alist-get 'light4 solarized-gruvbox-colors))
- (base3 . (alist-get 'light0 solarized-gruvbox-colors))
- (yellow . (alist-get 'yellow solarized-gruvbox-colors))
- (orange . (alist-get 'orange solarized-gruvbox-colors))
- (red . (alist-get 'bright_red solarized-gruvbox-colors))
- (magenta . (alist-get 'bright_purple solarized-gruvbox-colors))
- (violet . (alist-get 'purple solarized-gruvbox-colors))
- (blue . (alist-get 'bright_blue solarized-gruvbox-colors))
- (cyan . (alist-get 'aqua solarized-gruvbox-colors))
- (green . (alist-get 'green solarized-gruvbox-colors))
-
- (yellow-d . (solarized-color-blend (alist-get 'dark_yellow solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (yellow-l . (solarized-color-blend (alist-get 'bright_yellow solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (orange-d . (solarized-color-blend (alist-get 'dark_orange solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (orange-l . (solarized-color-blend (alist-get 'bright_orange solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (red-d . (solarized-color-blend (alist-get 'dark_red solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (red-l . (solarized-color-blend (alist-get 'bright_red solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (magenta-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (magenta-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (violet-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (violet-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (blue-d . (solarized-color-blend (alist-get 'dark_blue solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (blue-l . (solarized-color-blend (alist-get 'bright_blue solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (cyan-d . (solarized-color-blend (alist-get 'dark_aqua solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (cyan-l . (solarized-color-blend (alist-get 'bright_aqua solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (green-d . (solarized-color-blend (alist-get 'dark_green solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (green-l . (solarized-color-blend (alist-get 'bright_green solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
+ (base03 . "#282828")
+ (base02 . "#32302f")
+ (base01 . "#7c6f64")
+ (base00 . "#282828")
+ (base0 . "#a89984")
+ (base1 . "#bdae93")
+ (base2 . "#a89984")
+ (base3 . "#fbf1c7")
+ (yellow . "#d79921")
+ (orange . "#d65d0e")
+ (red . "#fb4933")
+ (magenta . "#d3869b")
+ (violet . "#b16286")
+ (blue . "#458588")
+ (cyan . "#689d6a")
+ (green . "#98971a")
+ (yellow-1bg . "#3f3528")
+ (yellow-1fg . "#e2b055")
+ (yellow-2bg . "#614923")
+ (yellow-2fg . "#dfb566")
+ (yellow-d . "#7B6000")
+ (yellow-l . "#DEB542")
+ (orange-1bg . "#402e25")
+ (orange-1fg . "#e48847")
+ (orange-2bg . "#62351c")
+ (orange-2fg . "#e2965a")
+ (orange-d . "#8B2C02")
+ (orange-l . "#F2804F")
+ (red-1bg . "#452e28")
+ (red-1fg . "#ff815b")
+ (red-2bg . "#6f3125")
+ (red-2fg . "#f89169")
+ (red-d . "#990A1B")
+ (red-l . "#FF6E64")
+ (magenta-1bg . "#3d3335")
+ (magenta-1fg . "#dda3a6")
+ (magenta-2bg . "#5e434a")
+ (magenta-2fg . "#dbaba4")
+ (magenta-d . "#93115C")
+ (magenta-l . "#F771AC")
+ (violet-1bg . "#392f33")
+ (violet-1fg . "#c68a97")
+ (violet-2bg . "#523642")
+ (violet-2fg . "#c89798")
+ (violet-d . "#3F4D91")
+ (violet-l . "#9EA0E5")
+ (blue-1bg . "#2c3333")
+ (blue-1fg . "#7da298")
+ (blue-2bg . "#2d4243")
+ (blue-2fg . "#90aa99")
+ (blue-d . "#00629D")
+ (blue-l . "#69B7F0")
+ (cyan-1bg . "#2f362f")
+ (cyan-1fg . "#91b382")
+ (cyan-2bg . "#384a38")
+ (cyan-2fg . "#9fb888")
+ (cyan-d . "#00736F")
+ (cyan-l . "#69CABF")
+ (green-1bg . "#363527")
+ (green-1fg . "#b4ae51")
+ (green-2bg . "#4a4821")
+ (green-2fg . "#bab462")
+ (green-d . "#546E00")
+ (green-l . "#B4C342")
;; palette end
)
"The solarized gruvbox dark palette color alist.")
(defvar solarized-gruvbox-light-color-palette-alist
'(;; gruvbox-light palette
- (base00 . (alist-get 'dark4 solarized-gruvbox-colors))
- (base01 . (alist-get 'dark3 solarized-gruvbox-colors))
- (base02 . (alist-get 'dark0_soft solarized-gruvbox-colors))
- (base03 . (alist-get 'dark0 solarized-gruvbox-colors))
- (base0 . (alist-get 'dark1 solarized-gruvbox-colors))
- (base1 . (alist-get 'light4 solarized-gruvbox-colors))
- (base2 . (alist-get 'light1 solarized-gruvbox-colors))
- (base3 . (alist-get 'light0 solarized-gruvbox-colors))
- (yellow . (alist-get 'dark_yellow solarized-gruvbox-colors))
- (orange . (alist-get 'dark_orange solarized-gruvbox-colors))
- (red . (alist-get 'dark_red solarized-gruvbox-colors))
- (magenta . (alist-get 'bright_purple solarized-gruvbox-colors))
- (violet . (alist-get 'dark_purple solarized-gruvbox-colors))
- (blue . (alist-get 'blue solarized-gruvbox-colors))
- (cyan . (alist-get 'aqua solarized-gruvbox-colors))
- (green . (alist-get 'green solarized-gruvbox-colors))
-
- (yellow-d . (solarized-color-blend (alist-get 'dark_yellow solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (yellow-l . (solarized-color-blend (alist-get 'bright_yellow solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (orange-d . (solarized-color-blend (alist-get 'dark_orange solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (orange-l . (solarized-color-blend (alist-get 'bright_orange solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (red-d . (solarized-color-blend (alist-get 'dark_red solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (red-l . (solarized-color-blend (alist-get 'bright_red solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (magenta-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (magenta-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (violet-d . (solarized-color-blend (alist-get 'dark_purple solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (violet-l . (solarized-color-blend (alist-get 'bright_purple solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (blue-d . (solarized-color-blend (alist-get 'dark_blue solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (blue-l . (solarized-color-blend (alist-get 'bright_blue solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (cyan-d . (solarized-color-blend (alist-get 'dark_aqua solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (cyan-l . (solarized-color-blend (alist-get 'bright_aqua solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
- (green-d . (solarized-color-blend (alist-get 'dark_green solarized-gruvbox-colors) (alist-get 'dark0 solarized-gruvbox-colors) 0.80 2))
- (green-l . (solarized-color-blend (alist-get 'bright_green solarized-gruvbox-colors) (alist-get 'light0 solarized-gruvbox-colors) 0.80 2))
+ (base03 . "#282828")
+ (base02 . "#32302f")
+ (base01 . "#665c54")
+ (base00 . "#7c6f64")
+ (base0 . "#3c3836")
+ (base1 . "#a89984")
+ (base2 . "#ebdbb2")
+ (base3 . "#fbf1c7")
+ (yellow . "#b57614")
+ (orange . "#af3a03")
+ (red . "#9d0006")
+ (magenta . "#d3869b")
+ (violet . "#8f3f71")
+ (blue . "#076678")
+ (cyan . "#689d6a")
+ (green . "#98971a")
+ (yellow-1bg . "#f6e1af")
+ (yellow-1fg . "#8c6023")
+ (yellow-2bg . "#efc98b")
+ (yellow-2fg . "#7f5b2d")
+ (yellow-d . "#7B6000")
+ (yellow-l . "#DEB542")
+ (orange-1bg . "#f7d8ab")
+ (orange-1fg . "#893a18")
+ (orange-2bg . "#f0b382")
+ (orange-2fg . "#7e3e23")
+ (orange-d . "#8B2C02")
+ (orange-l . "#F2804F")
+ (red-1bg . "#f5d4aa")
+ (red-1fg . "#7e2115")
+ (red-2bg . "#eaa67f")
+ (red-2fg . "#752d21")
+ (red-d . "#990A1B")
+ (red-l . "#FF6E64")
+ (magenta-1bg . "#f9e4c3")
+ (magenta-1fg . "#9e6b78")
+ (magenta-2bg . "#f8d1c0")
+ (magenta-2fg . "#8c646e")
+ (magenta-d . "#93115C")
+ (magenta-l . "#F771AC")
+ (violet-1bg . "#eed8bd")
+ (violet-1fg . "#713c5c")
+ (violet-2bg . "#dcb3af")
+ (violet-2fg . "#694058")
+ (violet-d . "#3F4D91")
+ (violet-l . "#9EA0E5")
+ (blue-1bg . "#dedebe")
+ (blue-1fg . "#245561")
+ (blue-2bg . "#b1c2b2")
+ (blue-2fg . "#30535c")
+ (blue-d . "#00629D")
+ (blue-l . "#69B7F0")
+ (cyan-1bg . "#e7e7bb")
+ (cyan-1fg . "#577a58")
+ (cyan-2bg . "#cbdaab")
+ (cyan-2fg . "#556f55")
+ (cyan-d . "#00736F")
+ (cyan-l . "#69CABF")
+ (green-1bg . "#f0e6b1")
+ (green-1fg . "#787628")
+ (green-2bg . "#e0d78f")
+ (green-2fg . "#6f6c32")
+ (green-d . "#546E00")
+ (green-l . "#B4C342")
;; palette end
)
"The solarized gruvbox light color palette alist.")
diff --git a/solarized.el b/solarized.el
@@ -133,7 +133,7 @@ Related discussion: https://github.com/bbatsov/solarized-emacs/issues/158"
;;; Utilities
;;;###autoload
-(defun solarized-color-blend (color1 color2 alpha &optional digits-per-component)
+(defun solarized-color-blend-rgb (color1 color2 alpha &optional digits-per-component)
"Blends COLOR1 onto COLOR2 with ALPHA.
COLOR1 and COLOR2 should be color names (e.g. \"white\") or RGB
@@ -150,6 +150,37 @@ use the latter if you need a 24-bit specification of a color."
(color-name-to-rgb color2))
,digits-per-component)))
+(defun solarized-color-lightness (color)
+ "Returns the LAB lightness value of a color, the range is from 0-100."
+ (car (apply 'color-srgb-to-lab (color-name-to-rgb hexrgb))))
+
+(defun solarized-color-clamp-lab (lab)
+ "Restricts a LAB colorspace color if it is out of bounds."
+ (list (min (max (nth 0 lab) 0.0) 100.0)
+ (min (max (nth 1 lab) -128) 127)
+ (min (max (nth 2 lab) -128) 127)))
+
+(defun solarized-color-blend (color1 color2 alpha &optional digits-per-component)
+"Blends COLOR1 onto COLOR2 with ALPHA.
+
+COLOR1 and COLOR2 should be color names (e.g. \"white\") or RGB
+triplet strings (e.g. \"#ff12ec\").
+
+Alpha should be a float between 0 and 1.
+
+Optional argument DIGITS-PER-COMPONENT can be either 4 (the default) or 2;
+use the latter if you need a 24-bit specification of a color."
+ (apply 'color-rgb-to-hex
+ (nconc
+ (mapcar 'color-clamp
+ (apply 'color-lab-to-srgb
+ (solarized-color-clamp-lab
+ (cl-mapcar
+ '(lambda (v1 v2) (+ v1 (* alpha (- v2 v1))))
+ (apply 'color-srgb-to-lab (color-name-to-rgb color2))
+ (apply 'color-srgb-to-lab (color-name-to-rgb color1))))))
+ '(2))))
+
;;;###autoload
(defun solarized-create-color-palette (core-palette)
"Create color-palette from CORE-PALETTE.
@@ -165,6 +196,7 @@ The Returned color-palette has the same format as `solarized-color-palette'"
(blue (nth 7 core-palette))
(cyan (nth 8 core-palette))
(green (nth 9 core-palette)))
+
`((base03 . ,(solarized-color-blend darkest-base brightest-base 1.00 2))
(base02 . ,(solarized-color-blend darkest-base brightest-base 0.97 2))
(base01 . ,(solarized-color-blend darkest-base brightest-base 0.65 2))
@@ -186,22 +218,60 @@ The Returned color-palette has the same format as `solarized-color-palette'"
;; Darker and lighter accented colors
;; Only use these in exceptional circumstances!
- (yellow-d . ,(solarized-color-blend yellow darkest-base 0.80 2))
- (yellow-l . ,(solarized-color-blend yellow brightest-base 0.80 2))
- (orange-d . ,(solarized-color-blend orange darkest-base 0.80 2))
- (orange-l . ,(solarized-color-blend orange brightest-base 0.80 2))
- (red-d . ,(solarized-color-blend red darkest-base 0.80 2))
- (red-l . ,(solarized-color-blend red brightest-base 0.80 2))
- (magenta-d . ,(solarized-color-blend magenta darkest-base 0.80 2))
- (magenta-l . ,(solarized-color-blend magenta brightest-base 0.80 2))
- (violet-d . ,(solarized-color-blend violet darkest-base 0.80 2))
- (violet-l . ,(solarized-color-blend violet brightest-base 0.80 2))
- (blue-d . ,(solarized-color-blend blue darkest-base 0.80 2))
- (blue-l . ,(solarized-color-blend blue brightest-base 0.80 2))
- (cyan-d . ,(solarized-color-blend cyan darkest-base 0.80 2))
- (cyan-l . ,(solarized-color-blend cyan brightest-base 0.80 2))
- (green-d . ,(solarized-color-blend green darkest-base 0.80 2))
- (green-l . ,(solarized-color-blend green brightest-base 0.80 2)))))
+ (yellow-d . ,(solarized-color-blend darkest-base yellow 0.80 2))
+ (yellow-l . ,(solarized-color-blend brightest-base yellow 0.80 2))
+ (orange-d . ,(solarized-color-blend darkest-base orange 0.80 2))
+ (orange-l . ,(solarized-color-blend brightest-base orange 0.80 2))
+ (red-d . ,(solarized-color-blend darkest-base red 0.80 2))
+ (red-l . ,(solarized-color-blend brightest-base red 0.80 2))
+ (magenta-d . ,(solarized-color-blend darkest-base magenta 0.80 2))
+ (magenta-l . ,(solarized-color-blend brightest-base magenta 0.80 2))
+ (violet-d . ,(solarized-color-blend darkest-base violet 0.80 2))
+ (violet-l . ,(solarized-color-blend brightest-base violet 0.80 2))
+ (blue-d . ,(solarized-color-blend darkest-base blue 0.80 2))
+ (blue-l . ,(solarized-color-blend brightest-base blue 0.80 2))
+ (cyan-d . ,(solarized-color-blend darkest-base cyan 0.80 2))
+ (cyan-l . ,(solarized-color-blend brightest-base cyan 0.80 2))
+ (green-d . ,(solarized-color-blend darkest-base green 0.80 2))
+ (green-l . ,(solarized-color-blend brightest-base green 0.80 2))
+
+ (yellow-1bg . ,(solarized-color-blend darkest-base yellow 0.85 2))
+ (orange-1bg . ,(solarized-color-blend darkest-base orange 0.85 2))
+ (red-1bg . ,(solarized-color-blend darkest-base red 0.85 2))
+ (magenta-1bg . ,(solarized-color-blend darkest-base magenta 0.85 2))
+ (blue-1bg . ,(solarized-color-blend darkest-base blue 0.85 2))
+ (cyan-1bg . ,(solarized-color-blend darkest-base cyan 0.85 2))
+ (green-1bg . ,(solarized-color-blend darkest-base green 0.85 2))
+ (violet-1bg . ,(solarized-color-blend darkest-base violet 0.85 2))
+
+ (yellow-1fg . ,(solarized-color-blend brightest-base yellow 0.30 2))
+ (orange-1fg . ,(solarized-color-blend brightest-base orange 0.30 2))
+ (red-1fg . ,(solarized-color-blend brightest-base red 0.30 2))
+ (magenta-1fg . ,(solarized-color-blend brightest-base magenta 0.30 2))
+ (violet-1fg . ,(solarized-color-blend brightest-base violet 0.30 2))
+ (blue-1fg . ,(solarized-color-blend brightest-base blue 0.30 2))
+ (cyan-1fg . ,(solarized-color-blend brightest-base cyan 0.30 2))
+ (green-1fg . ,(solarized-color-blend brightest-base green 0.30 2))
+
+ (yellow-2bg . ,(solarized-color-blend darkest-base yellow 0.60 2))
+ (orange-2bg . ,(solarized-color-blend darkest-base orange 0.60 2))
+ (red-2bg . ,(solarized-color-blend darkest-base red 0.60 2))
+ (magenta-2bg . ,(solarized-color-blend darkest-base magenta 0.60 2))
+ (violet-2bg . ,(solarized-color-blend darkest-base violet 0.60 2))
+ (blue-2bg . ,(solarized-color-blend darkest-base blue 0.60 2))
+ (cyan-2bg . ,(solarized-color-blend darkest-base cyan 0.60 2))
+ (green-2bg . ,(solarized-color-blend darkest-base green 0.60 2))
+
+ (yellow-2fg . ,(solarized-color-blend brightest-base yellow 0.45 2))
+ (orange-2fg . ,(solarized-color-blend brightest-base orange 0.45 2))
+ (red-2fg . ,(solarized-color-blend brightest-base red 0.45 2))
+ (magenta-2fg . ,(solarized-color-blend brightest-base magenta 0.45 2))
+ (violet-2fg . ,(solarized-color-blend brightest-base violet 0.45 2))
+ (blue-2fg . ,(solarized-color-blend brightest-base blue 0.45 2))
+ (cyan-2fg . ,(solarized-color-blend brightest-base cyan 0.45 2))
+ (green-2fg . ,(solarized-color-blend brightest-base green 0.45 2))
+
+ )))
@@ -296,33 +366,27 @@ VARIANT is 'dark or 'light."
base02 base02))
;; diff colors
- (s-diff-A-bg (if (eq variant 'light) "#ffdddd" "#553333"))
- (s-diff-A-fg (if (eq variant 'light) "#aa2222" "#ffdddd"))
- (s-diff-fine-A-bg (if (eq variant 'light)
- (solarized-color-blend "#ffdddd" red 0.7)
- (solarized-color-blend "#664444" red 0.7)))
- (s-diff-fine-A-fg (if (eq variant 'light) "#aa2222" "#eecccc"))
-
- (s-diff-B-bg (if (eq variant 'light) "#ddffdd" "#335533"))
- (s-diff-B-fg (if (eq variant 'light) "#22aa22" "#ddffdd"))
- (s-diff-fine-B-bg (if (eq variant 'light)
- (solarized-color-blend "#ddffdd" green 0.7)
- (solarized-color-blend "#446644" green 0.7)))
- (s-diff-fine-B-fg (if (eq variant 'light) "#336633" "#cceecc"))
-
- (s-diff-Ancestor-bg (if (eq variant 'light) "#ffffcc" "#555522"))
- (s-diff-Ancestor-fg (if (eq variant 'light) "#aaaa11" "#ffffcc"))
- (s-diff-fine-Ancestor-bg (if (eq variant 'light) "#eeeebb" "#666622"))
- (s-diff-fine-Ancestor-fg (if (eq variant 'light) "#aaaa11" "#eeeebb"))
-
- (s-diff-C-bg (if (eq variant 'light) "#d1e2f2" "#004d7b"))
- (s-diff-C-fg (if (eq variant 'light) "#004d7b" "#d1e2f2"))
- (s-diff-fine-C-bg (if (eq variant 'light)
- (solarized-color-blend "#d6e5e5" blue 0.7)
- (solarized-color-blend "#00547f" blue 0.7)))
- (s-diff-fine-C-fg (if (eq variant 'light) "#00547f" "#d6e5e5"))
- (s-diff-context-fg (if (eq variant 'light) base0 (solarized-color-blend base1 base2 0.6)))
- (s-diff-heading-bg (if (eq variant 'light) (solarized-color-blend yellow base03 0.1) base02))
+ (s-diff-A-bg red-1bg)
+ (s-diff-A-fg red-1fg)
+ (s-diff-fine-A-bg red-2bg)
+ (s-diff-fine-A-fg red-2fg)
+
+ (s-diff-B-bg green-1bg)
+ (s-diff-B-fg green-1fg)
+ (s-diff-fine-B-bg green-2bg)
+ (s-diff-fine-B-fg green-2fg)
+
+ (s-diff-Ancestor-bg yellow-1bg)
+ (s-diff-Ancestor-fg yellow-1fg)
+ (s-diff-fine-Ancestor-bg yellow-2bg)
+ (s-diff-fine-Ancestor-fg yellow-2fg)
+
+ (s-diff-C-bg blue-1bg)
+ (s-diff-C-fg blue-1fg)
+ (s-diff-fine-C-bg blue-2bg)
+ (s-diff-fine-C-fg blue-2fg)
+ (s-diff-context-fg base0)
+ (s-diff-heading-bg base02)
(s-diffstat-added-fg green)
(s-diffstat-changed-fg blue)
@@ -363,7 +427,10 @@ If OVERWRITE is non-nil, overwrite theme file if exist."
When optional argument CHILDTHEME function is supplied it's invoked to further
customize the resulting theme."
- (solarized-definition variant theme-name solarized-color-palette-alist childtheme))
+ (solarized-definition variant theme-name (if (eq variant 'light)
+ solarized-light-color-palette-alist
+ solarized-dark-color-palette-alist)
+ childtheme))
(defun solarized-create-theme-with-palette (variant theme-name core-palette &optional childtheme)
"Create a VARIANT of the theme named THEME-NAME with CORE-PALETTE.