@@ -2,17 +2,17 @@ module Theme.Types where
22
33import Prelude
44
5−import CSS (darken, lighten)
5+import CSS (ColorSpace(..), blue, brightness, darken, desaturate, isLight, lighten, mix, rotateHue)
66import CSS.Color (toHexString)
77import Color (Color)
88import Data.Foldable (intercalate)
9−import Data.Function (applyFlipped)
109import Data.Symbol (SProxy(..))
1110import Record.Builder as RB
1211
1312type Theme =
1413 { backgroundColour ∷ Color
15− , foregroundColour ∷ Color
14+ , textColour ∷ Color
15+ , interfaceColour ∷ Color
1616 , highlightColour ∷ Color
1717 , altHighlightColour ∷ Color
1818 , textFontFamily ∷ Array String
@@ -34,31 +34,34 @@ fromTheme theme = RB.build (
3434 -- background
3535 RB.modify (f ∷ _ "backgroundColour") toHexString
3636 >>> RB.insert (f ∷ _ "backgroundColourLighter")
37− (theme.backgroundColour # lighten 0.2 # toHexString)
38− >>> RB.insert (f ∷ _ "backgroundColourLight")
39− (theme.backgroundColour # lighten 0.4 # toHexString)
40− >>> RB.insert (f ∷ _ "backgroundColourDarker")
41− (theme.backgroundColour # darken 0.2 # toHexString)
42− >>> RB.insert (f ∷ _ "backgroundColourDark")
43− (theme.backgroundColour # darken 0.4 # toHexString)
37+ (theme.backgroundColour # lighter >>> toHexString)
38+ >>> RB.modify (f ∷ _ "interfaceColour") toHexString
39+ >>> RB.insert (f ∷ _ "interfaceColourLighter")
40+ (theme.interfaceColour # lighter >>> toHexString)
41+ >>> RB.insert (f ∷ _ "interfaceColourLightest")
42+ (theme.interfaceColour # lighter >>> lighter >>> toHexString)
43+ >>> RB.insert (f ∷ _ "interfaceColourDarker")
44+ (theme.interfaceColour # darker >>> toHexString)
45+ >>> RB.insert (f ∷ _ "interfaceColourDarkest")
46+ (theme.interfaceColour # darker >>> darker >>> toHexString)
4447 -- foreground
45− >>> RB.modify (f ∷ _ "foregroundColour") toHexString
46− >>> RB.insert (f ∷ _ "foregroundColourLighter")
47− (theme.foregroundColour # lighten 0.2 # toHexString)
48− >>> RB.insert (f ∷ _ "foregroundColourLight")
49− (theme.foregroundColour # lighten 0.4 # toHexString)
50− >>> RB.insert (f ∷ _ "foregroundColourDarker")
51− (theme.foregroundColour # darken 0.2 # toHexString)
52− >>> RB.insert (f ∷ _ "foregroundColourDark")
53− (theme.foregroundColour # darken 0.4 # toHexString)
48+ >>> RB.modify (f ∷ _ "textColour") toHexString
49+ >>> RB.insert (f ∷ _ "textColourLighter")
50+ (theme.textColour # lighter >>> toHexString)
51+ >>> RB.insert (f ∷ _ "textColourLightest")
52+ (theme.textColour # lighter >>> lighter >>> toHexString)
53+ >>> RB.insert (f ∷ _ "textColourDarker")
54+ (theme.textColour # darker >>> toHexString)
55+ >>> RB.insert (f ∷ _ "textColourDarkest")
56+ (theme.textColour # darker >>> darker >>> toHexString)
5457 -- highlight
5558 >>> RB.modify (f ∷ _ "highlightColour") toHexString
5659 >>> RB.insert (f ∷ _ "highlightColourDark")
57− (theme.highlightColour # darken 0.4 # toHexString)
60+ (theme.highlightColour # darken 0.2 # rotateHue (-10.0) # toHexString)
5861 -- altHighlight
5962 >>> RB.modify (f ∷ _ "altHighlightColour") toHexString
6063 >>> RB.insert (f ∷ _ "altHighlightColourDark")
61− (theme.altHighlightColour # darken 0.4 # toHexString)
64+ (theme.altHighlightColour # darken 0.2 # toHexString)
6265 -- palette
6366 >>> RB.modify (f ∷ _ "yellow") toHexString
6467 >>> RB.modify (f ∷ _ "green") toHexString
@@ -70,23 +73,49 @@ fromTheme theme = RB.build (
7073 -- fonts
7174 >>> RB.modify (f ∷ _ "textFontFamily") (intercalate ",")
7275 >>> RB.modify (f ∷ _ "headingFontFamily") (intercalate ",")
76+ >>> RB.insert (f ∷ _ "isLight") isLightTheme
7377 ) theme
78+ where
79+ isLightTheme = isLight theme.backgroundColour
80+ yellower ∷ Color -> Color
81+ yellower col =
82+ if brightness col > 0.8
83+ then
84+ lighten 0.02 col
85+ else
86+ col
87+ # lighten 0.1
88+ # desaturate 0.03
89+
90+ bluer col =
91+ mix HSL col blue 0.05
92+ # darken 0.1
93+ # desaturate 0.03
94+
95+ lighter ∷ Color -> Color
96+ lighter = yellower
97+
98+ darker ∷ Color -> Color
99+ darker = bluer
74100
75101type CSSTheme =
76102 { backgroundColour ∷ String
77− , backgroundColourDarker ∷ String
78− , backgroundColourDark ∷ String
79103 , backgroundColourLighter ∷ String
80− , backgroundColourLight ∷ String
81− , foregroundColourLight ∷ String
82− , foregroundColourLighter ∷ String
83− , foregroundColour ∷ String
84− , foregroundColourDarker ∷ String
85− , foregroundColourDark ∷ String
104+ , interfaceColour ∷ String
105+ , interfaceColourDarker ∷ String
106+ , interfaceColourDarkest ∷ String
107+ , interfaceColourLighter ∷ String
108+ , interfaceColourLightest ∷ String
109+ , textColourLightest ∷ String
110+ , textColourLighter ∷ String
111+ , textColour ∷ String
112+ , textColourDarker ∷ String
113+ , textColourDarkest ∷ String
86114 , highlightColour ∷ String
87115 , highlightColourDark ∷ String
88116 , altHighlightColour ∷ String
89117 , altHighlightColourDark ∷ String
118+ , isLight ∷ Boolean
90119 , textFontFamily ∷ String
91120 , headingFontFamily ∷ String
92121 , yellow ∷ String