{-# LANGUAGE StrictData #-}

module NanoUI.Style
  ( Sizing (..)
  , Direction (..)
  , AlignX (..)
  , AlignY (..)
  , Padding (..)
  , Layout (..)
  , defaultLayout
  , Style (..)
  , Theme (..)
  , defaultTheme
  , tomorrowNightMinDarkTheme
  , tomorrowMinLightTheme
  , tomorrowMidnightMinDarkTheme
  , Base16 (..)
  , themeFromBase16
  , themeFromBase16Dark
  , themeFromBase16Light
  , base16TomorrowNight
  , base16TomorrowLight
  -- * Style modifiers
  , background
  , foreground
  , borderColor
  , borderWidth
  , cornerRadius
  , hoverBackground
  , pressBackground
  , fillColor
  -- * Theme modifiers
  , buttonStyle
  , inputStyle
  , panelStyle
  , windowStyle
  , everyStyle
  , accentColor
  , textColor
  , mutedColor
  , linkColor
  , selectionColor
  , windowColor
  , rounded
  , tinted
  , primary
  , destructive
  , success
  , subtle
  , readableOn
  , disabledTheme
  , themeSeries
  , separatorTrackColor
  , scrollBarTrackColor
  , scrollBarThumbColor
  , fadeAlpha
  , windowPad
  , windowMargin
  , padAll
  , padXY
  , gap
  , fillW
  , fillH
  , grow
  , minW
  , maxW
  , fixedW
  , minH
  , maxH
  , fixedH
  , fixedWH
  , alignMid
  , alignEnd
  , tight
  , percent
  , gridMinColW
  , fixedAspectW
  , fixedAspectH
  , gridCols
  , FontVariant (..)
  , FontWeight (..)
  , FontStyle (..)
  , TextDecoration (..)
  , LayoutModifier
  , fontRegular
  , fontHeading
  , fontMuted
  , fontMono
  , fontDanger
  , fontSize
  , fontSizeScale
  , fontColor
  , fontWeight
  , fontBold
  , fontLight
  , fontMedium
  , fontSemiBold
  , fontExtraBold
  , fontBlack
  , fontStyle
  , fontItalic
  , fontOblique
  , textDecoration
  , fontUnderline
  , fontStrike
  , alignStart
  , alignCenter
  , alignTop
  , alignBottom
  , alignBaseline
  ) where

import Data.Bits ((.&.), (.|.))
import Data.Word (Word8)
import NanoUI.Types (Color (..), colorA, colorLuminance, colorRGBA, contrastRatio, lerpColor)

data Sizing
  = Fixed Float
  | Fit
  | Grow Float
  | Shrink Float
  | Percent Float
  deriving (Sizing -> Sizing -> Bool
(Sizing -> Sizing -> Bool)
-> (Sizing -> Sizing -> Bool) -> Eq Sizing
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Sizing -> Sizing -> Bool
== :: Sizing -> Sizing -> Bool
$c/= :: Sizing -> Sizing -> Bool
/= :: Sizing -> Sizing -> Bool
Eq, Int -> Sizing -> ShowS
[Sizing] -> ShowS
Sizing -> String
(Int -> Sizing -> ShowS)
-> (Sizing -> String) -> ([Sizing] -> ShowS) -> Show Sizing
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Sizing -> ShowS
showsPrec :: Int -> Sizing -> ShowS
$cshow :: Sizing -> String
show :: Sizing -> String
$cshowList :: [Sizing] -> ShowS
showList :: [Sizing] -> ShowS
Show)

data Direction = Row | Column
  deriving (Direction -> Direction -> Bool
(Direction -> Direction -> Bool)
-> (Direction -> Direction -> Bool) -> Eq Direction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Direction -> Direction -> Bool
== :: Direction -> Direction -> Bool
$c/= :: Direction -> Direction -> Bool
/= :: Direction -> Direction -> Bool
Eq, Int -> Direction -> ShowS
[Direction] -> ShowS
Direction -> String
(Int -> Direction -> ShowS)
-> (Direction -> String)
-> ([Direction] -> ShowS)
-> Show Direction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Direction -> ShowS
showsPrec :: Int -> Direction -> ShowS
$cshow :: Direction -> String
show :: Direction -> String
$cshowList :: [Direction] -> ShowS
showList :: [Direction] -> ShowS
Show, Int -> Direction
Direction -> Int
Direction -> [Direction]
Direction -> Direction
Direction -> Direction -> [Direction]
Direction -> Direction -> Direction -> [Direction]
(Direction -> Direction)
-> (Direction -> Direction)
-> (Int -> Direction)
-> (Direction -> Int)
-> (Direction -> [Direction])
-> (Direction -> Direction -> [Direction])
-> (Direction -> Direction -> [Direction])
-> (Direction -> Direction -> Direction -> [Direction])
-> Enum Direction
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Direction -> Direction
succ :: Direction -> Direction
$cpred :: Direction -> Direction
pred :: Direction -> Direction
$ctoEnum :: Int -> Direction
toEnum :: Int -> Direction
$cfromEnum :: Direction -> Int
fromEnum :: Direction -> Int
$cenumFrom :: Direction -> [Direction]
enumFrom :: Direction -> [Direction]
$cenumFromThen :: Direction -> Direction -> [Direction]
enumFromThen :: Direction -> Direction -> [Direction]
$cenumFromTo :: Direction -> Direction -> [Direction]
enumFromTo :: Direction -> Direction -> [Direction]
$cenumFromThenTo :: Direction -> Direction -> Direction -> [Direction]
enumFromThenTo :: Direction -> Direction -> Direction -> [Direction]
Enum, Direction
Direction -> Direction -> Bounded Direction
forall a. a -> a -> Bounded a
$cminBound :: Direction
minBound :: Direction
$cmaxBound :: Direction
maxBound :: Direction
Bounded)

data AlignX = AlignStart | AlignCenter | AlignEnd
  deriving (AlignX -> AlignX -> Bool
(AlignX -> AlignX -> Bool)
-> (AlignX -> AlignX -> Bool) -> Eq AlignX
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AlignX -> AlignX -> Bool
== :: AlignX -> AlignX -> Bool
$c/= :: AlignX -> AlignX -> Bool
/= :: AlignX -> AlignX -> Bool
Eq, Int -> AlignX -> ShowS
[AlignX] -> ShowS
AlignX -> String
(Int -> AlignX -> ShowS)
-> (AlignX -> String) -> ([AlignX] -> ShowS) -> Show AlignX
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AlignX -> ShowS
showsPrec :: Int -> AlignX -> ShowS
$cshow :: AlignX -> String
show :: AlignX -> String
$cshowList :: [AlignX] -> ShowS
showList :: [AlignX] -> ShowS
Show, Int -> AlignX
AlignX -> Int
AlignX -> [AlignX]
AlignX -> AlignX
AlignX -> AlignX -> [AlignX]
AlignX -> AlignX -> AlignX -> [AlignX]
(AlignX -> AlignX)
-> (AlignX -> AlignX)
-> (Int -> AlignX)
-> (AlignX -> Int)
-> (AlignX -> [AlignX])
-> (AlignX -> AlignX -> [AlignX])
-> (AlignX -> AlignX -> [AlignX])
-> (AlignX -> AlignX -> AlignX -> [AlignX])
-> Enum AlignX
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AlignX -> AlignX
succ :: AlignX -> AlignX
$cpred :: AlignX -> AlignX
pred :: AlignX -> AlignX
$ctoEnum :: Int -> AlignX
toEnum :: Int -> AlignX
$cfromEnum :: AlignX -> Int
fromEnum :: AlignX -> Int
$cenumFrom :: AlignX -> [AlignX]
enumFrom :: AlignX -> [AlignX]
$cenumFromThen :: AlignX -> AlignX -> [AlignX]
enumFromThen :: AlignX -> AlignX -> [AlignX]
$cenumFromTo :: AlignX -> AlignX -> [AlignX]
enumFromTo :: AlignX -> AlignX -> [AlignX]
$cenumFromThenTo :: AlignX -> AlignX -> AlignX -> [AlignX]
enumFromThenTo :: AlignX -> AlignX -> AlignX -> [AlignX]
Enum, AlignX
AlignX -> AlignX -> Bounded AlignX
forall a. a -> a -> Bounded a
$cminBound :: AlignX
minBound :: AlignX
$cmaxBound :: AlignX
maxBound :: AlignX
Bounded)

-- | 'AlignBaseline' lines a row's text children up on their first baseline, and
-- sits any other child on it by its bottom edge. Outside a row it is
-- 'AlignTop'.
data AlignY = AlignTop | AlignMiddle | AlignBottom | AlignBaseline
  deriving (AlignY -> AlignY -> Bool
(AlignY -> AlignY -> Bool)
-> (AlignY -> AlignY -> Bool) -> Eq AlignY
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AlignY -> AlignY -> Bool
== :: AlignY -> AlignY -> Bool
$c/= :: AlignY -> AlignY -> Bool
/= :: AlignY -> AlignY -> Bool
Eq, Int -> AlignY -> ShowS
[AlignY] -> ShowS
AlignY -> String
(Int -> AlignY -> ShowS)
-> (AlignY -> String) -> ([AlignY] -> ShowS) -> Show AlignY
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AlignY -> ShowS
showsPrec :: Int -> AlignY -> ShowS
$cshow :: AlignY -> String
show :: AlignY -> String
$cshowList :: [AlignY] -> ShowS
showList :: [AlignY] -> ShowS
Show, Int -> AlignY
AlignY -> Int
AlignY -> [AlignY]
AlignY -> AlignY
AlignY -> AlignY -> [AlignY]
AlignY -> AlignY -> AlignY -> [AlignY]
(AlignY -> AlignY)
-> (AlignY -> AlignY)
-> (Int -> AlignY)
-> (AlignY -> Int)
-> (AlignY -> [AlignY])
-> (AlignY -> AlignY -> [AlignY])
-> (AlignY -> AlignY -> [AlignY])
-> (AlignY -> AlignY -> AlignY -> [AlignY])
-> Enum AlignY
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AlignY -> AlignY
succ :: AlignY -> AlignY
$cpred :: AlignY -> AlignY
pred :: AlignY -> AlignY
$ctoEnum :: Int -> AlignY
toEnum :: Int -> AlignY
$cfromEnum :: AlignY -> Int
fromEnum :: AlignY -> Int
$cenumFrom :: AlignY -> [AlignY]
enumFrom :: AlignY -> [AlignY]
$cenumFromThen :: AlignY -> AlignY -> [AlignY]
enumFromThen :: AlignY -> AlignY -> [AlignY]
$cenumFromTo :: AlignY -> AlignY -> [AlignY]
enumFromTo :: AlignY -> AlignY -> [AlignY]
$cenumFromThenTo :: AlignY -> AlignY -> AlignY -> [AlignY]
enumFromThenTo :: AlignY -> AlignY -> AlignY -> [AlignY]
Enum, AlignY
AlignY -> AlignY -> Bounded AlignY
forall a. a -> a -> Bounded a
$cminBound :: AlignY
minBound :: AlignY
$cmaxBound :: AlignY
maxBound :: AlignY
Bounded)

data Padding = Padding
  { Padding -> Float
padL :: {-# UNPACK #-} !Float
  , Padding -> Float
padR :: {-# UNPACK #-} !Float
  , Padding -> Float
padT :: {-# UNPACK #-} !Float
  , Padding -> Float
padB :: {-# UNPACK #-} !Float
  }
  deriving (Padding -> Padding -> Bool
(Padding -> Padding -> Bool)
-> (Padding -> Padding -> Bool) -> Eq Padding
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Padding -> Padding -> Bool
== :: Padding -> Padding -> Bool
$c/= :: Padding -> Padding -> Bool
/= :: Padding -> Padding -> Bool
Eq, Int -> Padding -> ShowS
[Padding] -> ShowS
Padding -> String
(Int -> Padding -> ShowS)
-> (Padding -> String) -> ([Padding] -> ShowS) -> Show Padding
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Padding -> ShowS
showsPrec :: Int -> Padding -> ShowS
$cshow :: Padding -> String
show :: Padding -> String
$cshowList :: [Padding] -> ShowS
showList :: [Padding] -> ShowS
Show)

-- Floating window chrome. The body sits one side-pad below the chrome and one
-- side-pad above the window's bottom edge (the window's own column gap fills
-- the top; see 'NanoUI.Widgets.Overlay').
windowPad :: Padding
windowPad :: Padding
windowPad = Float -> Float -> Float -> Float -> Padding
Padding Float
10 Float
10 Float
0 Float
10

-- Screen inset for floating window/modal max size and default placement.
windowMargin :: Float
windowMargin :: Float
windowMargin = Float
14

data FontVariant
  = FontRegular
  | FontHeading
  | FontMuted
  | FontMono
  | FontDanger
  deriving (FontVariant -> FontVariant -> Bool
(FontVariant -> FontVariant -> Bool)
-> (FontVariant -> FontVariant -> Bool) -> Eq FontVariant
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FontVariant -> FontVariant -> Bool
== :: FontVariant -> FontVariant -> Bool
$c/= :: FontVariant -> FontVariant -> Bool
/= :: FontVariant -> FontVariant -> Bool
Eq, Int -> FontVariant -> ShowS
[FontVariant] -> ShowS
FontVariant -> String
(Int -> FontVariant -> ShowS)
-> (FontVariant -> String)
-> ([FontVariant] -> ShowS)
-> Show FontVariant
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FontVariant -> ShowS
showsPrec :: Int -> FontVariant -> ShowS
$cshow :: FontVariant -> String
show :: FontVariant -> String
$cshowList :: [FontVariant] -> ShowS
showList :: [FontVariant] -> ShowS
Show, Int -> FontVariant
FontVariant -> Int
FontVariant -> [FontVariant]
FontVariant -> FontVariant
FontVariant -> FontVariant -> [FontVariant]
FontVariant -> FontVariant -> FontVariant -> [FontVariant]
(FontVariant -> FontVariant)
-> (FontVariant -> FontVariant)
-> (Int -> FontVariant)
-> (FontVariant -> Int)
-> (FontVariant -> [FontVariant])
-> (FontVariant -> FontVariant -> [FontVariant])
-> (FontVariant -> FontVariant -> [FontVariant])
-> (FontVariant -> FontVariant -> FontVariant -> [FontVariant])
-> Enum FontVariant
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FontVariant -> FontVariant
succ :: FontVariant -> FontVariant
$cpred :: FontVariant -> FontVariant
pred :: FontVariant -> FontVariant
$ctoEnum :: Int -> FontVariant
toEnum :: Int -> FontVariant
$cfromEnum :: FontVariant -> Int
fromEnum :: FontVariant -> Int
$cenumFrom :: FontVariant -> [FontVariant]
enumFrom :: FontVariant -> [FontVariant]
$cenumFromThen :: FontVariant -> FontVariant -> [FontVariant]
enumFromThen :: FontVariant -> FontVariant -> [FontVariant]
$cenumFromTo :: FontVariant -> FontVariant -> [FontVariant]
enumFromTo :: FontVariant -> FontVariant -> [FontVariant]
$cenumFromThenTo :: FontVariant -> FontVariant -> FontVariant -> [FontVariant]
enumFromThenTo :: FontVariant -> FontVariant -> FontVariant -> [FontVariant]
Enum, FontVariant
FontVariant -> FontVariant -> Bounded FontVariant
forall a. a -> a -> Bounded a
$cminBound :: FontVariant
minBound :: FontVariant
$cmaxBound :: FontVariant
maxBound :: FontVariant
Bounded, Eq FontVariant
Eq FontVariant =>
(FontVariant -> FontVariant -> Ordering)
-> (FontVariant -> FontVariant -> Bool)
-> (FontVariant -> FontVariant -> Bool)
-> (FontVariant -> FontVariant -> Bool)
-> (FontVariant -> FontVariant -> Bool)
-> (FontVariant -> FontVariant -> FontVariant)
-> (FontVariant -> FontVariant -> FontVariant)
-> Ord FontVariant
FontVariant -> FontVariant -> Bool
FontVariant -> FontVariant -> Ordering
FontVariant -> FontVariant -> FontVariant
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FontVariant -> FontVariant -> Ordering
compare :: FontVariant -> FontVariant -> Ordering
$c< :: FontVariant -> FontVariant -> Bool
< :: FontVariant -> FontVariant -> Bool
$c<= :: FontVariant -> FontVariant -> Bool
<= :: FontVariant -> FontVariant -> Bool
$c> :: FontVariant -> FontVariant -> Bool
> :: FontVariant -> FontVariant -> Bool
$c>= :: FontVariant -> FontVariant -> Bool
>= :: FontVariant -> FontVariant -> Bool
$cmax :: FontVariant -> FontVariant -> FontVariant
max :: FontVariant -> FontVariant -> FontVariant
$cmin :: FontVariant -> FontVariant -> FontVariant
min :: FontVariant -> FontVariant -> FontVariant
Ord)

data FontWeight
  = WeightNormal
  | WeightBold
  | WeightLight
  | WeightMedium
  | WeightSemiBold
  | WeightExtraBold
  | WeightBlack
  deriving (FontWeight -> FontWeight -> Bool
(FontWeight -> FontWeight -> Bool)
-> (FontWeight -> FontWeight -> Bool) -> Eq FontWeight
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FontWeight -> FontWeight -> Bool
== :: FontWeight -> FontWeight -> Bool
$c/= :: FontWeight -> FontWeight -> Bool
/= :: FontWeight -> FontWeight -> Bool
Eq, Int -> FontWeight -> ShowS
[FontWeight] -> ShowS
FontWeight -> String
(Int -> FontWeight -> ShowS)
-> (FontWeight -> String)
-> ([FontWeight] -> ShowS)
-> Show FontWeight
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FontWeight -> ShowS
showsPrec :: Int -> FontWeight -> ShowS
$cshow :: FontWeight -> String
show :: FontWeight -> String
$cshowList :: [FontWeight] -> ShowS
showList :: [FontWeight] -> ShowS
Show, Int -> FontWeight
FontWeight -> Int
FontWeight -> [FontWeight]
FontWeight -> FontWeight
FontWeight -> FontWeight -> [FontWeight]
FontWeight -> FontWeight -> FontWeight -> [FontWeight]
(FontWeight -> FontWeight)
-> (FontWeight -> FontWeight)
-> (Int -> FontWeight)
-> (FontWeight -> Int)
-> (FontWeight -> [FontWeight])
-> (FontWeight -> FontWeight -> [FontWeight])
-> (FontWeight -> FontWeight -> [FontWeight])
-> (FontWeight -> FontWeight -> FontWeight -> [FontWeight])
-> Enum FontWeight
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FontWeight -> FontWeight
succ :: FontWeight -> FontWeight
$cpred :: FontWeight -> FontWeight
pred :: FontWeight -> FontWeight
$ctoEnum :: Int -> FontWeight
toEnum :: Int -> FontWeight
$cfromEnum :: FontWeight -> Int
fromEnum :: FontWeight -> Int
$cenumFrom :: FontWeight -> [FontWeight]
enumFrom :: FontWeight -> [FontWeight]
$cenumFromThen :: FontWeight -> FontWeight -> [FontWeight]
enumFromThen :: FontWeight -> FontWeight -> [FontWeight]
$cenumFromTo :: FontWeight -> FontWeight -> [FontWeight]
enumFromTo :: FontWeight -> FontWeight -> [FontWeight]
$cenumFromThenTo :: FontWeight -> FontWeight -> FontWeight -> [FontWeight]
enumFromThenTo :: FontWeight -> FontWeight -> FontWeight -> [FontWeight]
Enum, FontWeight
FontWeight -> FontWeight -> Bounded FontWeight
forall a. a -> a -> Bounded a
$cminBound :: FontWeight
minBound :: FontWeight
$cmaxBound :: FontWeight
maxBound :: FontWeight
Bounded, Eq FontWeight
Eq FontWeight =>
(FontWeight -> FontWeight -> Ordering)
-> (FontWeight -> FontWeight -> Bool)
-> (FontWeight -> FontWeight -> Bool)
-> (FontWeight -> FontWeight -> Bool)
-> (FontWeight -> FontWeight -> Bool)
-> (FontWeight -> FontWeight -> FontWeight)
-> (FontWeight -> FontWeight -> FontWeight)
-> Ord FontWeight
FontWeight -> FontWeight -> Bool
FontWeight -> FontWeight -> Ordering
FontWeight -> FontWeight -> FontWeight
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FontWeight -> FontWeight -> Ordering
compare :: FontWeight -> FontWeight -> Ordering
$c< :: FontWeight -> FontWeight -> Bool
< :: FontWeight -> FontWeight -> Bool
$c<= :: FontWeight -> FontWeight -> Bool
<= :: FontWeight -> FontWeight -> Bool
$c> :: FontWeight -> FontWeight -> Bool
> :: FontWeight -> FontWeight -> Bool
$c>= :: FontWeight -> FontWeight -> Bool
>= :: FontWeight -> FontWeight -> Bool
$cmax :: FontWeight -> FontWeight -> FontWeight
max :: FontWeight -> FontWeight -> FontWeight
$cmin :: FontWeight -> FontWeight -> FontWeight
min :: FontWeight -> FontWeight -> FontWeight
Ord)

data FontStyle
  = FontStyleNormal
  | FontStyleItalic
  | FontStyleOblique
  deriving (FontStyle -> FontStyle -> Bool
(FontStyle -> FontStyle -> Bool)
-> (FontStyle -> FontStyle -> Bool) -> Eq FontStyle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FontStyle -> FontStyle -> Bool
== :: FontStyle -> FontStyle -> Bool
$c/= :: FontStyle -> FontStyle -> Bool
/= :: FontStyle -> FontStyle -> Bool
Eq, Int -> FontStyle -> ShowS
[FontStyle] -> ShowS
FontStyle -> String
(Int -> FontStyle -> ShowS)
-> (FontStyle -> String)
-> ([FontStyle] -> ShowS)
-> Show FontStyle
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FontStyle -> ShowS
showsPrec :: Int -> FontStyle -> ShowS
$cshow :: FontStyle -> String
show :: FontStyle -> String
$cshowList :: [FontStyle] -> ShowS
showList :: [FontStyle] -> ShowS
Show, Int -> FontStyle
FontStyle -> Int
FontStyle -> [FontStyle]
FontStyle -> FontStyle
FontStyle -> FontStyle -> [FontStyle]
FontStyle -> FontStyle -> FontStyle -> [FontStyle]
(FontStyle -> FontStyle)
-> (FontStyle -> FontStyle)
-> (Int -> FontStyle)
-> (FontStyle -> Int)
-> (FontStyle -> [FontStyle])
-> (FontStyle -> FontStyle -> [FontStyle])
-> (FontStyle -> FontStyle -> [FontStyle])
-> (FontStyle -> FontStyle -> FontStyle -> [FontStyle])
-> Enum FontStyle
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FontStyle -> FontStyle
succ :: FontStyle -> FontStyle
$cpred :: FontStyle -> FontStyle
pred :: FontStyle -> FontStyle
$ctoEnum :: Int -> FontStyle
toEnum :: Int -> FontStyle
$cfromEnum :: FontStyle -> Int
fromEnum :: FontStyle -> Int
$cenumFrom :: FontStyle -> [FontStyle]
enumFrom :: FontStyle -> [FontStyle]
$cenumFromThen :: FontStyle -> FontStyle -> [FontStyle]
enumFromThen :: FontStyle -> FontStyle -> [FontStyle]
$cenumFromTo :: FontStyle -> FontStyle -> [FontStyle]
enumFromTo :: FontStyle -> FontStyle -> [FontStyle]
$cenumFromThenTo :: FontStyle -> FontStyle -> FontStyle -> [FontStyle]
enumFromThenTo :: FontStyle -> FontStyle -> FontStyle -> [FontStyle]
Enum, FontStyle
FontStyle -> FontStyle -> Bounded FontStyle
forall a. a -> a -> Bounded a
$cminBound :: FontStyle
minBound :: FontStyle
$cmaxBound :: FontStyle
maxBound :: FontStyle
Bounded, Eq FontStyle
Eq FontStyle =>
(FontStyle -> FontStyle -> Ordering)
-> (FontStyle -> FontStyle -> Bool)
-> (FontStyle -> FontStyle -> Bool)
-> (FontStyle -> FontStyle -> Bool)
-> (FontStyle -> FontStyle -> Bool)
-> (FontStyle -> FontStyle -> FontStyle)
-> (FontStyle -> FontStyle -> FontStyle)
-> Ord FontStyle
FontStyle -> FontStyle -> Bool
FontStyle -> FontStyle -> Ordering
FontStyle -> FontStyle -> FontStyle
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FontStyle -> FontStyle -> Ordering
compare :: FontStyle -> FontStyle -> Ordering
$c< :: FontStyle -> FontStyle -> Bool
< :: FontStyle -> FontStyle -> Bool
$c<= :: FontStyle -> FontStyle -> Bool
<= :: FontStyle -> FontStyle -> Bool
$c> :: FontStyle -> FontStyle -> Bool
> :: FontStyle -> FontStyle -> Bool
$c>= :: FontStyle -> FontStyle -> Bool
>= :: FontStyle -> FontStyle -> Bool
$cmax :: FontStyle -> FontStyle -> FontStyle
max :: FontStyle -> FontStyle -> FontStyle
$cmin :: FontStyle -> FontStyle -> FontStyle
min :: FontStyle -> FontStyle -> FontStyle
Ord)

data TextDecoration
  = DecorationNone
  | DecorationUnderline
  | DecorationStrikethrough
  | DecorationUnderlineStrike
  deriving (TextDecoration -> TextDecoration -> Bool
(TextDecoration -> TextDecoration -> Bool)
-> (TextDecoration -> TextDecoration -> Bool) -> Eq TextDecoration
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TextDecoration -> TextDecoration -> Bool
== :: TextDecoration -> TextDecoration -> Bool
$c/= :: TextDecoration -> TextDecoration -> Bool
/= :: TextDecoration -> TextDecoration -> Bool
Eq, Int -> TextDecoration -> ShowS
[TextDecoration] -> ShowS
TextDecoration -> String
(Int -> TextDecoration -> ShowS)
-> (TextDecoration -> String)
-> ([TextDecoration] -> ShowS)
-> Show TextDecoration
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TextDecoration -> ShowS
showsPrec :: Int -> TextDecoration -> ShowS
$cshow :: TextDecoration -> String
show :: TextDecoration -> String
$cshowList :: [TextDecoration] -> ShowS
showList :: [TextDecoration] -> ShowS
Show, Int -> TextDecoration
TextDecoration -> Int
TextDecoration -> [TextDecoration]
TextDecoration -> TextDecoration
TextDecoration -> TextDecoration -> [TextDecoration]
TextDecoration
-> TextDecoration -> TextDecoration -> [TextDecoration]
(TextDecoration -> TextDecoration)
-> (TextDecoration -> TextDecoration)
-> (Int -> TextDecoration)
-> (TextDecoration -> Int)
-> (TextDecoration -> [TextDecoration])
-> (TextDecoration -> TextDecoration -> [TextDecoration])
-> (TextDecoration -> TextDecoration -> [TextDecoration])
-> (TextDecoration
    -> TextDecoration -> TextDecoration -> [TextDecoration])
-> Enum TextDecoration
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: TextDecoration -> TextDecoration
succ :: TextDecoration -> TextDecoration
$cpred :: TextDecoration -> TextDecoration
pred :: TextDecoration -> TextDecoration
$ctoEnum :: Int -> TextDecoration
toEnum :: Int -> TextDecoration
$cfromEnum :: TextDecoration -> Int
fromEnum :: TextDecoration -> Int
$cenumFrom :: TextDecoration -> [TextDecoration]
enumFrom :: TextDecoration -> [TextDecoration]
$cenumFromThen :: TextDecoration -> TextDecoration -> [TextDecoration]
enumFromThen :: TextDecoration -> TextDecoration -> [TextDecoration]
$cenumFromTo :: TextDecoration -> TextDecoration -> [TextDecoration]
enumFromTo :: TextDecoration -> TextDecoration -> [TextDecoration]
$cenumFromThenTo :: TextDecoration
-> TextDecoration -> TextDecoration -> [TextDecoration]
enumFromThenTo :: TextDecoration
-> TextDecoration -> TextDecoration -> [TextDecoration]
Enum, TextDecoration
TextDecoration -> TextDecoration -> Bounded TextDecoration
forall a. a -> a -> Bounded a
$cminBound :: TextDecoration
minBound :: TextDecoration
$cmaxBound :: TextDecoration
maxBound :: TextDecoration
Bounded, Eq TextDecoration
Eq TextDecoration =>
(TextDecoration -> TextDecoration -> Ordering)
-> (TextDecoration -> TextDecoration -> Bool)
-> (TextDecoration -> TextDecoration -> Bool)
-> (TextDecoration -> TextDecoration -> Bool)
-> (TextDecoration -> TextDecoration -> Bool)
-> (TextDecoration -> TextDecoration -> TextDecoration)
-> (TextDecoration -> TextDecoration -> TextDecoration)
-> Ord TextDecoration
TextDecoration -> TextDecoration -> Bool
TextDecoration -> TextDecoration -> Ordering
TextDecoration -> TextDecoration -> TextDecoration
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TextDecoration -> TextDecoration -> Ordering
compare :: TextDecoration -> TextDecoration -> Ordering
$c< :: TextDecoration -> TextDecoration -> Bool
< :: TextDecoration -> TextDecoration -> Bool
$c<= :: TextDecoration -> TextDecoration -> Bool
<= :: TextDecoration -> TextDecoration -> Bool
$c> :: TextDecoration -> TextDecoration -> Bool
> :: TextDecoration -> TextDecoration -> Bool
$c>= :: TextDecoration -> TextDecoration -> Bool
>= :: TextDecoration -> TextDecoration -> Bool
$cmax :: TextDecoration -> TextDecoration -> TextDecoration
max :: TextDecoration -> TextDecoration -> TextDecoration
$cmin :: TextDecoration -> TextDecoration -> TextDecoration
min :: TextDecoration -> TextDecoration -> TextDecoration
Ord)

type LayoutModifier = Layout -> Layout

data Layout = Layout
  { Layout -> Direction
layoutDirection :: !Direction
  , Layout -> Sizing
layoutWidth :: !Sizing
  , Layout -> Sizing
layoutHeight :: !Sizing
  , Layout -> Padding
layoutPadding :: !Padding
  , Layout -> Float
layoutGap :: {-# UNPACK #-} !Float
  , Layout -> AlignX
layoutAlignX :: !AlignX
  , Layout -> AlignY
layoutAlignY :: !AlignY
  , Layout -> Float
layoutMinW :: {-# UNPACK #-} !Float
  , Layout -> Float
layoutMinH :: {-# UNPACK #-} !Float
  , Layout -> Float
layoutMaxW :: {-# UNPACK #-} !Float
  , Layout -> Float
layoutMaxH :: {-# UNPACK #-} !Float
  , Layout -> FontVariant
layoutFontVariant :: !FontVariant
  , Layout -> Int
layoutGridCols :: {-# UNPACK #-} !Int
  , Layout -> Float
layoutGridMinColW :: {-# UNPACK #-} !Float
  , Layout -> Float
layoutFontSize :: {-# UNPACK #-} !Float
  , Layout -> Maybe Color
layoutFontColor :: !(Maybe Color)
  , Layout -> FontWeight
layoutFontWeight :: !FontWeight
  , Layout -> FontStyle
layoutFontStyle :: !FontStyle
  , Layout -> TextDecoration
layoutTextDecoration :: !TextDecoration
  }
  deriving (Layout -> Layout -> Bool
(Layout -> Layout -> Bool)
-> (Layout -> Layout -> Bool) -> Eq Layout
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Layout -> Layout -> Bool
== :: Layout -> Layout -> Bool
$c/= :: Layout -> Layout -> Bool
/= :: Layout -> Layout -> Bool
Eq, Int -> Layout -> ShowS
[Layout] -> ShowS
Layout -> String
(Int -> Layout -> ShowS)
-> (Layout -> String) -> ([Layout] -> ShowS) -> Show Layout
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Layout -> ShowS
showsPrec :: Int -> Layout -> ShowS
$cshow :: Layout -> String
show :: Layout -> String
$cshowList :: [Layout] -> ShowS
showList :: [Layout] -> ShowS
Show)

defaultLayout :: Layout
defaultLayout :: Layout
defaultLayout =
  Layout
    { layoutDirection :: Direction
layoutDirection = Direction
Column
    , layoutWidth :: Sizing
layoutWidth = Sizing
Fit
    , layoutHeight :: Sizing
layoutHeight = Sizing
Fit
    , layoutPadding :: Padding
layoutPadding = Float -> Float -> Float -> Float -> Padding
Padding Float
3 Float
3 Float
3 Float
3
    , layoutGap :: Float
layoutGap = Float
8
    , layoutAlignX :: AlignX
layoutAlignX = AlignX
AlignStart
    , layoutAlignY :: AlignY
layoutAlignY = AlignY
AlignTop
    , layoutMinW :: Float
layoutMinW = Float
0
    , layoutMinH :: Float
layoutMinH = Float
0
    , layoutMaxW :: Float
layoutMaxW = Float
1e9
    , layoutMaxH :: Float
layoutMaxH = Float
1e9
    , layoutFontVariant :: FontVariant
layoutFontVariant = FontVariant
FontRegular
    , layoutGridCols :: Int
layoutGridCols = Int
0
    , layoutGridMinColW :: Float
layoutGridMinColW = Float
0
    , layoutFontSize :: Float
layoutFontSize = Float
0
    , layoutFontColor :: Maybe Color
layoutFontColor = Maybe Color
forall a. Maybe a
Nothing
    , layoutFontWeight :: FontWeight
layoutFontWeight = FontWeight
WeightNormal
    , layoutFontStyle :: FontStyle
layoutFontStyle = FontStyle
FontStyleNormal
    , layoutTextDecoration :: TextDecoration
layoutTextDecoration = TextDecoration
DecorationNone
    }

padAll :: Float -> Layout -> Layout
padAll :: Float -> Layout -> Layout
padAll Float
n Layout
l = Layout
l {layoutPadding = Padding n n n n}

padXY :: Float -> Float -> Layout -> Layout
padXY :: Float -> Float -> Layout -> Layout
padXY Float
x Float
y Layout
l = Layout
l {layoutPadding = Padding x x y y}

gap :: Float -> Layout -> Layout
gap :: Float -> Layout -> Layout
gap Float
n Layout
l = Layout
l {layoutGap = n}

fillW :: Layout -> Layout
fillW :: Layout -> Layout
fillW Layout
l = Layout
l {layoutWidth = Grow 1}

fillH :: Layout -> Layout
fillH :: Layout -> Layout
fillH Layout
l = Layout
l {layoutHeight = Grow 1}

grow :: Layout -> Layout
grow :: Layout -> Layout
grow = Layout -> Layout
fillW (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Layout -> Layout
fillH

minW :: Float -> Layout -> Layout
minW :: Float -> Layout -> Layout
minW Float
n Layout
l = Layout
l {layoutMinW = n}

maxW :: Float -> Layout -> Layout
maxW :: Float -> Layout -> Layout
maxW Float
n Layout
l = Layout
l {layoutMaxW = n}

fixedW :: Float -> Layout -> Layout
fixedW :: Float -> Layout -> Layout
fixedW Float
n Layout
l = Layout
l {layoutWidth = Fixed n, layoutMinW = n, layoutMaxW = n}

minH :: Float -> Layout -> Layout
minH :: Float -> Layout -> Layout
minH Float
n Layout
l = Layout
l {layoutMinH = n}

maxH :: Float -> Layout -> Layout
maxH :: Float -> Layout -> Layout
maxH Float
n Layout
l = Layout
l {layoutMaxH = n}

fixedH :: Float -> Layout -> Layout
fixedH :: Float -> Layout -> Layout
fixedH Float
n Layout
l = Layout
l {layoutHeight = Fixed n}

fixedWH :: Float -> Float -> Layout -> Layout
fixedWH :: Float -> Float -> Layout -> Layout
fixedWH Float
w Float
h Layout
l = Layout
l {layoutWidth = Fixed w, layoutHeight = Fixed h}

alignMid :: Layout -> Layout
alignMid :: Layout -> Layout
alignMid Layout
l = Layout
l {layoutAlignY = AlignMiddle}

alignEnd :: Layout -> Layout
alignEnd :: Layout -> Layout
alignEnd Layout
l = Layout
l {layoutAlignX = AlignEnd}

tight :: Layout -> Layout
tight :: Layout -> Layout
tight Layout
l = Layout
l {layoutPadding = Padding 0 0 0 0}

percent :: Float -> Layout -> Layout
percent :: Float -> Layout -> Layout
percent Float
p Layout
l = Layout
l {layoutWidth = Percent p}

gridMinColW :: Float -> Layout -> Layout
gridMinColW :: Float -> Layout -> Layout
gridMinColW Float
w Layout
l = Layout
l {layoutGridMinColW = max 0 w}

fixedAspectW :: Float -> Float -> Layout -> Layout
fixedAspectW :: Float -> Float -> Layout -> Layout
fixedAspectW Float
w Float
ratio = Float -> Float -> Layout -> Layout
fixedWH Float
w (Float
w Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
ratio)

fixedAspectH :: Float -> Float -> Layout -> Layout
fixedAspectH :: Float -> Float -> Layout -> Layout
fixedAspectH Float
h Float
ratio = Float -> Float -> Layout -> Layout
fixedWH (Float
h Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
ratio) Float
h

gridCols :: Int -> Layout -> Layout
gridCols :: Int -> Layout -> Layout
gridCols Int
n Layout
l = Layout
l {layoutGridCols = max 0 n}

fontRegular :: Layout -> Layout
fontRegular :: Layout -> Layout
fontRegular Layout
l = Layout
l {layoutFontVariant = FontRegular}

fontHeading :: Layout -> Layout
fontHeading :: Layout -> Layout
fontHeading Layout
l = Layout
l {layoutFontVariant = FontHeading}

fontMuted :: Layout -> Layout
fontMuted :: Layout -> Layout
fontMuted Layout
l = Layout
l {layoutFontVariant = FontMuted}

fontMono :: Layout -> Layout
fontMono :: Layout -> Layout
fontMono Layout
l = Layout
l {layoutFontVariant = FontMono}

fontDanger :: Layout -> Layout
fontDanger :: Layout -> Layout
fontDanger Layout
l = Layout
l {layoutFontVariant = FontDanger}

fontSize :: Float -> Layout -> Layout
fontSize :: Float -> Layout -> Layout
fontSize Float
sz Layout
l = Layout
l {layoutFontSize = max 0 sz}

fontSizeScale :: Float -> Layout -> Layout
fontSizeScale :: Float -> Layout -> Layout
fontSizeScale Float
s Layout
l =
  let cur :: Float
cur = Layout -> Float
layoutFontSize Layout
l
      sz :: Float
sz = if Float
cur Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
> Float
0 then Float
cur Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
s else Float
16 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
s
   in Layout
l {layoutFontSize = max 0 sz}

fontColor :: Color -> Layout -> Layout
fontColor :: Color -> Layout -> Layout
fontColor Color
col Layout
l = Layout
l {layoutFontColor = Just col}

fontWeight :: FontWeight -> Layout -> Layout
fontWeight :: FontWeight -> Layout -> Layout
fontWeight FontWeight
w Layout
l = Layout
l {layoutFontWeight = w}

fontBold :: Layout -> Layout
fontBold :: Layout -> Layout
fontBold = FontWeight -> Layout -> Layout
fontWeight FontWeight
WeightBold

fontLight :: Layout -> Layout
fontLight :: Layout -> Layout
fontLight = FontWeight -> Layout -> Layout
fontWeight FontWeight
WeightLight

fontMedium :: Layout -> Layout
fontMedium :: Layout -> Layout
fontMedium = FontWeight -> Layout -> Layout
fontWeight FontWeight
WeightMedium

fontSemiBold :: Layout -> Layout
fontSemiBold :: Layout -> Layout
fontSemiBold = FontWeight -> Layout -> Layout
fontWeight FontWeight
WeightSemiBold

fontExtraBold :: Layout -> Layout
fontExtraBold :: Layout -> Layout
fontExtraBold = FontWeight -> Layout -> Layout
fontWeight FontWeight
WeightExtraBold

fontBlack :: Layout -> Layout
fontBlack :: Layout -> Layout
fontBlack = FontWeight -> Layout -> Layout
fontWeight FontWeight
WeightBlack

fontStyle :: FontStyle -> Layout -> Layout
fontStyle :: FontStyle -> Layout -> Layout
fontStyle FontStyle
s Layout
l = Layout
l {layoutFontStyle = s}

fontItalic :: Layout -> Layout
fontItalic :: Layout -> Layout
fontItalic = FontStyle -> Layout -> Layout
fontStyle FontStyle
FontStyleItalic

fontOblique :: Layout -> Layout
fontOblique :: Layout -> Layout
fontOblique = FontStyle -> Layout -> Layout
fontStyle FontStyle
FontStyleOblique

textDecoration :: TextDecoration -> Layout -> Layout
textDecoration :: TextDecoration -> Layout -> Layout
textDecoration TextDecoration
d Layout
l = Layout
l {layoutTextDecoration = d}

fontUnderline :: Layout -> Layout
fontUnderline :: Layout -> Layout
fontUnderline Layout
l =
  let newDeco :: TextDecoration
newDeco = case Layout -> TextDecoration
layoutTextDecoration Layout
l of
        TextDecoration
DecorationStrikethrough -> TextDecoration
DecorationUnderlineStrike
        TextDecoration
DecorationUnderlineStrike -> TextDecoration
DecorationUnderlineStrike
        TextDecoration
_ -> TextDecoration
DecorationUnderline
   in Layout
l {layoutTextDecoration = newDeco}

fontStrike :: Layout -> Layout
fontStrike :: Layout -> Layout
fontStrike Layout
l =
  let newDeco :: TextDecoration
newDeco = case Layout -> TextDecoration
layoutTextDecoration Layout
l of
        TextDecoration
DecorationUnderline -> TextDecoration
DecorationUnderlineStrike
        TextDecoration
DecorationUnderlineStrike -> TextDecoration
DecorationUnderlineStrike
        TextDecoration
_ -> TextDecoration
DecorationStrikethrough
   in Layout
l {layoutTextDecoration = newDeco}

alignStart :: Layout -> Layout
alignStart :: Layout -> Layout
alignStart Layout
l = Layout
l {layoutAlignX = AlignStart}

alignCenter :: Layout -> Layout
alignCenter :: Layout -> Layout
alignCenter Layout
l = Layout
l {layoutAlignX = AlignCenter}

alignTop :: Layout -> Layout
alignTop :: Layout -> Layout
alignTop Layout
l = Layout
l {layoutAlignY = AlignTop}

alignBottom :: Layout -> Layout
alignBottom :: Layout -> Layout
alignBottom Layout
l = Layout
l {layoutAlignY = AlignBottom}

-- | Sit on the row's shared text baseline, so labels of different sizes read
-- as one line of type. 'alignBottom' lines up their boxes instead, and a larger
-- font's deeper descent lifts its baseline above the smaller one's.
alignBaseline :: Layout -> Layout
alignBaseline :: Layout -> Layout
alignBaseline Layout
l = Layout
l {layoutAlignY = AlignBaseline}

data Style = Style
  { Style -> Color
styleBg :: {-# UNPACK #-} !Color
  , Style -> Color
styleFg :: {-# UNPACK #-} !Color
  , Style -> Color
styleBorder :: {-# UNPACK #-} !Color
  , Style -> Float
styleBorderWidth :: {-# UNPACK #-} !Float
  , Style -> Float
styleCornerRadius :: {-# UNPACK #-} !Float
  , Style -> Color
styleHoverBg :: {-# UNPACK #-} !Color
  , Style -> Color
styleActiveBg :: {-# UNPACK #-} !Color
  }
  deriving (Style -> Style -> Bool
(Style -> Style -> Bool) -> (Style -> Style -> Bool) -> Eq Style
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Style -> Style -> Bool
== :: Style -> Style -> Bool
$c/= :: Style -> Style -> Bool
/= :: Style -> Style -> Bool
Eq, Int -> Style -> ShowS
[Style] -> ShowS
Style -> String
(Int -> Style -> ShowS)
-> (Style -> String) -> ([Style] -> ShowS) -> Show Style
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Style -> ShowS
showsPrec :: Int -> Style -> ShowS
$cshow :: Style -> String
show :: Style -> String
$cshowList :: [Style] -> ShowS
showList :: [Style] -> ShowS
Show)

data Theme = Theme
  { Theme -> Color
themeWindow :: {-# UNPACK #-} !Color
  , Theme -> Style
themePanel :: !Style
  , Theme -> Style
themeFloatingWindow :: !Style
  , Theme -> Style
themeButton :: !Style
  , Theme -> Style
themeInput :: !Style
  , Theme -> Color
themeSeparator :: {-# UNPACK #-} !Color
  , Theme -> Color
themeAccent :: {-# UNPACK #-} !Color
  , Theme -> Color
themeMuted :: {-# UNPACK #-} !Color
  , Theme -> Color
themeRed :: {-# UNPACK #-} !Color
  , Theme -> Color
themeOrange :: {-# UNPACK #-} !Color
  , Theme -> Color
themeYellow :: {-# UNPACK #-} !Color
  , Theme -> Color
themeGreen :: {-# UNPACK #-} !Color
  , Theme -> Color
themePurple :: {-# UNPACK #-} !Color
  , Theme -> Color
themeOverlayDim :: {-# UNPACK #-} !Color
  , Theme -> Color
themeOnAccent :: {-# UNPACK #-} !Color
  -- ^ Text and marks drawn on an accent fill: a checked box, an active tab,
  -- a primary button.
  , Theme -> Color
themeSelection :: {-# UNPACK #-} !Color
  -- ^ Selected text's highlight, drawn under the text. Usually translucent.
  , Theme -> Color
themeFocusRing :: {-# UNPACK #-} !Color
  , Theme -> Color
themeLink :: {-# UNPACK #-} !Color
  , Theme -> Color
themeShadow :: {-# UNPACK #-} !Color
  -- ^ Offset shadow under menus, dropdowns and floating windows. A zero alpha
  -- draws none.
  , Theme -> Float
themeDisabledFade :: {-# UNPACK #-} !Float
  -- ^ How far a disabled widget's colours fade toward the window colour, from
  -- 0 (not at all) to 1 (invisible).
  }
  deriving (Theme -> Theme -> Bool
(Theme -> Theme -> Bool) -> (Theme -> Theme -> Bool) -> Eq Theme
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Theme -> Theme -> Bool
== :: Theme -> Theme -> Bool
$c/= :: Theme -> Theme -> Bool
/= :: Theme -> Theme -> Bool
Eq, Int -> Theme -> ShowS
[Theme] -> ShowS
Theme -> String
(Int -> Theme -> ShowS)
-> (Theme -> String) -> ([Theme] -> ShowS) -> Show Theme
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Theme -> ShowS
showsPrec :: Int -> Theme -> ShowS
$cshow :: Theme -> String
show :: Theme -> String
$cshowList :: [Theme] -> ShowS
showList :: [Theme] -> ShowS
Show)

-- -----------------------------------------------------------------------------
-- Style and theme modifiers
-- -----------------------------------------------------------------------------

-- $modifiers
-- Styles and themes change the way layouts do: through functions that
-- compose with @(.)@. A @Style -> Style@ edits one surface, and a
-- @Theme -> Theme@ edits the theme a part of the view is drawn with (see
-- @styled@ in "NanoUI"):
--
-- > styled (buttonStyle (cornerRadius 8) . accentColor teal) $ do ...
-- > styled primary (button "Save")

background :: Color -> Style -> Style
background :: Color -> Style -> Style
background Color
c Style
s = Style
s {styleBg = c}

foreground :: Color -> Style -> Style
foreground :: Color -> Style -> Style
foreground Color
c Style
s = Style
s {styleFg = c}

borderColor :: Color -> Style -> Style
borderColor :: Color -> Style -> Style
borderColor Color
c Style
s = Style
s {styleBorder = c}

borderWidth :: Float -> Style -> Style
borderWidth :: Float -> Style -> Style
borderWidth Float
w Style
s = Style
s {styleBorderWidth = max 0 w}

cornerRadius :: Float -> Style -> Style
cornerRadius :: Float -> Style -> Style
cornerRadius Float
r Style
s = Style
s {styleCornerRadius = max 0 r}

hoverBackground :: Color -> Style -> Style
hoverBackground :: Color -> Style -> Style
hoverBackground Color
c Style
s = Style
s {styleHoverBg = c}

pressBackground :: Color -> Style -> Style
pressBackground :: Color -> Style -> Style
pressBackground Color
c Style
s = Style
s {styleActiveBg = c}

-- | A background with hover and press shades derived from it: hovering mixes
-- in some of the foreground, pressing darkens.
fillColor :: Color -> Style -> Style
fillColor :: Color -> Style -> Style
fillColor Color
c Style
s =
  Style
s
    { styleBg = c
    , styleHoverBg = lerpColor c (styleFg s) 0.12
    , styleActiveBg = lerpColor c (colorRGBA 0 0 0 (colorA c)) 0.18
    }

buttonStyle :: (Style -> Style) -> Theme -> Theme
buttonStyle :: (Style -> Style) -> Theme -> Theme
buttonStyle Style -> Style
f Theme
t = Theme
t {themeButton = f (themeButton t)}

-- | Text fields, text areas, sliders' wells and scroller wells.
inputStyle :: (Style -> Style) -> Theme -> Theme
inputStyle :: (Style -> Style) -> Theme -> Theme
inputStyle Style -> Style
f Theme
t = Theme
t {themeInput = f (themeInput t)}

-- | Panels, cards, menus, and label text.
panelStyle :: (Style -> Style) -> Theme -> Theme
panelStyle :: (Style -> Style) -> Theme -> Theme
panelStyle Style -> Style
f Theme
t = Theme
t {themePanel = f (themePanel t)}

-- | Floating windows.
windowStyle :: (Style -> Style) -> Theme -> Theme
windowStyle :: (Style -> Style) -> Theme -> Theme
windowStyle Style -> Style
f Theme
t = Theme
t {themeFloatingWindow = f (themeFloatingWindow t)}

everyStyle :: (Style -> Style) -> Theme -> Theme
everyStyle :: (Style -> Style) -> Theme -> Theme
everyStyle Style -> Style
f = (Style -> Style) -> Theme -> Theme
buttonStyle Style -> Style
f (Theme -> Theme) -> (Theme -> Theme) -> Theme -> Theme
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> Style) -> Theme -> Theme
inputStyle Style -> Style
f (Theme -> Theme) -> (Theme -> Theme) -> Theme -> Theme
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> Style) -> Theme -> Theme
panelStyle Style -> Style
f (Theme -> Theme) -> (Theme -> Theme) -> Theme -> Theme
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Style -> Style) -> Theme -> Theme
windowStyle Style -> Style
f

accentColor :: Color -> Theme -> Theme
accentColor :: Color -> Theme -> Theme
accentColor Color
c Theme
t = Theme
t {themeAccent = c, themeFocusRing = c, themeSelection = fadeAlpha c (colorA (themeSelection t))}

-- | The foreground of every surface.
textColor :: Color -> Theme -> Theme
textColor :: Color -> Theme -> Theme
textColor Color
c = (Style -> Style) -> Theme -> Theme
everyStyle (Color -> Style -> Style
foreground Color
c)

mutedColor :: Color -> Theme -> Theme
mutedColor :: Color -> Theme -> Theme
mutedColor Color
c Theme
t = Theme
t {themeMuted = c}

linkColor :: Color -> Theme -> Theme
linkColor :: Color -> Theme -> Theme
linkColor Color
c Theme
t = Theme
t {themeLink = c}

selectionColor :: Color -> Theme -> Theme
selectionColor :: Color -> Theme -> Theme
selectionColor Color
c Theme
t = Theme
t {themeSelection = c}

-- | The backdrop behind everything, which disabled widgets also fade toward.
windowColor :: Color -> Theme -> Theme
windowColor :: Color -> Theme -> Theme
windowColor Color
c Theme
t = Theme
t {themeWindow = c}

-- | The corner radius of every surface.
rounded :: Float -> Theme -> Theme
rounded :: Float -> Theme -> Theme
rounded Float
r = (Style -> Style) -> Theme -> Theme
everyStyle (Float -> Style -> Style
cornerRadius Float
r)

-- | Buttons filled with a colour picked from the theme, with a readable label.
--
-- > styled (tinted themePurple) (button "Tag")
tinted :: (Theme -> Color) -> Theme -> Theme
tinted :: (Theme -> Color) -> Theme -> Theme
tinted Theme -> Color
pick Theme
t =
  let c :: Color
c = Theme -> Color
pick Theme
t
      label :: Color
label = Theme -> Color -> Color
readableOn Theme
t Color
c
   in (Style -> Style) -> Theme -> Theme
buttonStyle
        ( \Style
s ->
            Style
s
              { styleBg = c
              , styleFg = label
              , styleBorder = c
              , styleHoverBg = lerpColor c label 0.14
              , styleActiveBg = lerpColor c (themeWindow t) 0.22
              }
        )
        Theme
t

-- | Buttons in the accent colour, for the action a view is for.
primary :: Theme -> Theme
primary :: Theme -> Theme
primary = (Theme -> Color) -> Theme -> Theme
tinted Theme -> Color
themeAccent

-- | Buttons in the theme's red, for destructive actions.
destructive :: Theme -> Theme
destructive :: Theme -> Theme
destructive = (Theme -> Color) -> Theme -> Theme
tinted Theme -> Color
themeRed

success :: Theme -> Theme
success :: Theme -> Theme
success = (Theme -> Color) -> Theme -> Theme
tinted Theme -> Color
themeGreen

-- | Buttons without a fill or border until hovered, for toolbars and
-- secondary actions.
subtle :: Theme -> Theme
subtle :: Theme -> Theme
subtle =
  (Style -> Style) -> Theme -> Theme
buttonStyle ((Style -> Style) -> Theme -> Theme)
-> (Style -> Style) -> Theme -> Theme
forall a b. (a -> b) -> a -> b
$ \Style
s ->
    Style
s
      { styleBg = clear
      , styleBorder = clear
      , styleBorderWidth = 0
      , styleHoverBg = fadeAlpha (styleFg s) 30
      , styleActiveBg = fadeAlpha (styleFg s) 48
      }
  where
    clear :: Color
clear = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
0

-- | Whichever of the theme's text colours reads best on @c@.
readableOn :: Theme -> Color -> Color
readableOn :: Theme -> Color -> Color
readableOn Theme
t Color
c =
  let candidates :: [Color]
candidates = [Theme -> Color
themeOnAccent Theme
t, Style -> Color
styleFg (Theme -> Style
themePanel Theme
t), Theme -> Color
themeWindow Theme
t]
      best :: Color -> Color -> Color
best Color
a Color
b = if Color -> Color -> Double
contrastRatio Color
a Color
c Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Color -> Color -> Double
contrastRatio Color
b Color
c then Color
a else Color
b
   in (Color -> Color -> Color) -> [Color] -> Color
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 Color -> Color -> Color
best [Color]
candidates

-- | The theme disabled widgets are drawn with: every colour faded toward the
-- window colour by 'themeDisabledFade', and no hover or press feedback.
disabledTheme :: Theme -> Theme
disabledTheme :: Theme -> Theme
disabledTheme Theme
t =
  let f :: Float
f = Theme -> Float
themeDisabledFade Theme
t
      fade :: Color -> Color
fade Color
c
        | Color -> Word8
colorA Color
c Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
0 = Color
c
        | Bool
otherwise = Color -> Word8 -> Color
fadeAlpha (Color -> Color -> Float -> Color
lerpColor Color
c (Theme -> Color
themeWindow Theme
t) Float
f) (Color -> Word8
colorA Color
c)
      fadeStyle :: Style -> Style
fadeStyle Style
s =
        let bg :: Color
bg = Color -> Color
fade (Style -> Color
styleBg Style
s)
         in Style
s {styleBg = bg, styleFg = fade (styleFg s), styleBorder = fade (styleBorder s), styleHoverBg = bg, styleActiveBg = bg}
   in Theme
t
        { themePanel = fadeStyle (themePanel t)
        , themeFloatingWindow = fadeStyle (themeFloatingWindow t)
        , themeButton = fadeStyle (themeButton t)
        , themeInput = fadeStyle (themeInput t)
        , themeSeparator = fade (themeSeparator t)
        , themeAccent = fade (themeAccent t)
        , themeMuted = fade (themeMuted t)
        , themeRed = fade (themeRed t)
        , themeOrange = fade (themeOrange t)
        , themeYellow = fade (themeYellow t)
        , themeGreen = fade (themeGreen t)
        , themePurple = fade (themePurple t)
        , themeOnAccent = fade (themeOnAccent t)
        , themeFocusRing = fade (themeFocusRing t)
        , themeLink = fade (themeLink t)
        }

-- | Flat widget style: bg/fg/border plus hover and active fills.
-- Border width 1 and corner radius 2, as the built-in themes use.
flatStyle :: Color -> Color -> Color -> Color -> Color -> Style
flatStyle :: Color -> Color -> Color -> Color -> Color -> Style
flatStyle Color
bg Color
fg Color
border Color
hoverBg Color
activeBg =
  Style
    { styleBg :: Color
styleBg = Color
bg
    , styleFg :: Color
styleFg = Color
fg
    , styleBorder :: Color
styleBorder = Color
border
    , styleBorderWidth :: Float
styleBorderWidth = Float
1
    , styleCornerRadius :: Float
styleCornerRadius = Float
2
    , styleHoverBg :: Color
styleHoverBg = Color
hoverBg
    , styleActiveBg :: Color
styleActiveBg = Color
activeBg
    }

-- | Neutral charcoal surfaces, warm text, and a blue selection accent.
-- Keep structural edges quiet; interactive borders and focus carry contrast.
defaultTheme :: Theme
defaultTheme :: Theme
defaultTheme =
  let panelSurface :: Style
panelSurface =
        Color -> Color -> Color -> Color -> Color -> Style
flatStyle
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
34 Word8
34 Word8
38 Word8
255)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
236 Word8
234 Word8
230 Word8
255)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
54 Word8
54 Word8
62 Word8
255)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
34 Word8
34 Word8
38 Word8
255)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
30 Word8
30 Word8
34 Word8
255)
   in Theme
        { themeWindow :: Color
themeWindow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
24 Word8
24 Word8
27 Word8
255
        , themePanel :: Style
themePanel = Style
panelSurface
        , themeFloatingWindow :: Style
themeFloatingWindow = Style
panelSurface
        , themeButton :: Style
themeButton =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
52 Word8
52 Word8
58 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
248 Word8
247 Word8
245 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
74 Word8
76 Word8
84 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
68 Word8
70 Word8
78 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
42 Word8
42 Word8
48 Word8
255)
        , themeInput :: Style
themeInput =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
18 Word8
18 Word8
21 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
236 Word8
234 Word8
230 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
70 Word8
72 Word8
80 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
24 Word8
24 Word8
28 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
14 Word8
14 Word8
17 Word8
255)
        , themeSeparator :: Color
themeSeparator = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
62 Word8
64 Word8
72 Word8
255
        , themeAccent :: Color
themeAccent = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
88 Word8
156 Word8
246 Word8
255
        , themeMuted :: Color
themeMuted = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
176 Word8
172 Word8
164 Word8
255
        , themeRed :: Color
themeRed = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
252 Word8
165 Word8
165 Word8
255
        , themeOrange :: Color
themeOrange = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
216 Word8
140 Word8
72 Word8
255
        , themeYellow :: Color
themeYellow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
212 Word8
176 Word8
88 Word8
255
        , themeGreen :: Color
themeGreen = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
104 Word8
168 Word8
124 Word8
255
        , themePurple :: Color
themePurple = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
176 Word8
140 Word8
220 Word8
255
        , themeOverlayDim :: Color
themeOverlayDim = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
8 Word8
8 Word8
10 Word8
176
        , themeOnAccent :: Color
themeOnAccent = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255
        , themeSelection :: Color
themeSelection = Color -> Word8 -> Color
fadeAlpha (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
88 Word8
156 Word8
246 Word8
255) Word8
115
        , themeFocusRing :: Color
themeFocusRing = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
88 Word8
156 Word8
246 Word8
255
        , themeLink :: Color
themeLink = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
124 Word8
178 Word8
250 Word8
255
        , themeShadow :: Color
themeShadow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
72
        , themeDisabledFade :: Float
themeDisabledFade = Float
0.55
        }

-- Status and series colours in hue order, then accent.
themeSeries :: Theme -> [Color]
themeSeries :: Theme -> [Color]
themeSeries Theme
t =
  [ Theme -> Color
themeRed Theme
t
  , Theme -> Color
themeOrange Theme
t
  , Theme -> Color
themeYellow Theme
t
  , Theme -> Color
themeGreen Theme
t
  , Theme -> Color
themeAccent Theme
t
  , Theme -> Color
themePurple Theme
t
  ]

-- | Opaque tint of a base surface toward the separator color: the track color
-- for scrollbar tracks, divider strips, and similar hairline chrome.
separatorTrackColor :: Style -> Theme -> Color
separatorTrackColor :: Style -> Theme -> Color
separatorTrackColor Style
base Theme
theme =
  Color -> Color -> Float -> Color
lerpColor (Style -> Color
styleBg Style
base) (Theme -> Color
themeSeparator Theme
theme) Float
0.28

-- Scroll track/thumb tints. The track is an opaque mix of the surface it sits
-- on (the scroller well / floating window body) toward the separator colour, so
-- the lane reads against that surface on every theme. The thumb stays a
-- translucent foreground mix so the track shows through it.
scrollBarTrackColor :: Style -> Theme -> Color
scrollBarTrackColor :: Style -> Theme -> Color
scrollBarTrackColor Style
base Theme
theme =
  Style -> Theme -> Color
separatorTrackColor Style
base Theme
theme

scrollBarThumbColor :: Style -> Theme -> Color
scrollBarThumbColor :: Style -> Theme -> Color
scrollBarThumbColor Style
base Theme
theme =
  let solid :: Color
solid = Color -> Color -> Float -> Color
lerpColor (Theme -> Color
themeSeparator Theme
theme) (Style -> Color
styleFg Style
base) Float
0.58
   in Color -> Word8 -> Color
fadeAlpha Color
solid Word8
130

-- | Replaces the alpha channel of a color.
fadeAlpha :: Color -> Word8 -> Color
fadeAlpha :: Color -> Word8 -> Color
fadeAlpha (Color Word32
w) Word8
a = Word32 -> Color
Color ((Word32
w Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
0xFFFFFF00) Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
a)

-- | Ported from "Tomorrow Night Min" in https://github.com/biaqat/tomorrow-min-theme-zed
tomorrowNightMinDarkTheme :: Theme
tomorrowNightMinDarkTheme :: Theme
tomorrowNightMinDarkTheme =
  let panelSurface :: Style
panelSurface =
        Color -> Color -> Color -> Color -> Color -> Style
flatStyle
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
30 Word8
31 Word8
33 Word8
255)  -- base.bg #1E1F21 (elevated panel canvas)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
234 Word8
234 Word8
234 Word8
255)  -- bright.fg #EAEAEA
          Color
edgeCol
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
52 Word8
54 Word8
62 Word8
255)  -- #34363E
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
26 Word8
27 Word8
29 Word8
255)  -- #1A1B1D
   in Theme
        { themeWindow :: Color
themeWindow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
23 Word8
24 Word8
26 Word8
255         -- #17181A (dark root window backdrop)
        , themePanel :: Style
themePanel = Style
panelSurface
        , themeFloatingWindow :: Style
themeFloatingWindow = Style
panelSurface
        , themeButton :: Style
themeButton =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
44 Word8
46 Word8
51 Word8
255)  -- elevated button surface
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
245 Word8
245 Word8
245 Word8
255)  -- bright.fg / white
              Color
edgeCol
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
69 Word8
74 Word8
83 Word8
255)  -- #454A53
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
28 Word8
29 Word8
32 Word8
255)  -- depressed on click
        , themeInput :: Style
themeInput =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
23 Word8
24 Word8
26 Word8
255)  -- #17181A (recessed into #1E1F21 panel)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
234 Word8
234 Word8
234 Word8
255)  -- bright.fg #EAEAEA
              Color
edgeCol
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
29 Word8
30 Word8
33 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
19 Word8
20 Word8
22 Word8
255)
        , themeSeparator :: Color
themeSeparator = Color
sepCol
        , themeAccent :: Color
themeAccent = Color
accentCol
        , themeMuted :: Color
themeMuted = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
150 Word8
152 Word8
150 Word8
255       -- comment #969896
        , themeRed :: Color
themeRed = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
204 Word8
102 Word8
102 Word8
255         -- base.red #CC6666
        , themeOrange :: Color
themeOrange = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
222 Word8
147 Word8
95 Word8
255       -- base.orange #DE935F
        , themeYellow :: Color
themeYellow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
240 Word8
198 Word8
116 Word8
255      -- base.yellow #F0C674
        , themeGreen :: Color
themeGreen = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
181 Word8
189 Word8
104 Word8
255       -- base.green #B5BD68
        , themePurple :: Color
themePurple = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
178 Word8
148 Word8
187 Word8
255      -- base.purple #B294BB
        , themeOverlayDim :: Color
themeOverlayDim = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
160
        , themeOnAccent :: Color
themeOnAccent = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255
        , themeSelection :: Color
themeSelection = Color -> Word8 -> Color
fadeAlpha Color
accentCol Word8
115
        , themeFocusRing :: Color
themeFocusRing = Color
accentCol
        , themeLink :: Color
themeLink = Color
accentCol
        , themeShadow :: Color
themeShadow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
72
        , themeDisabledFade :: Float
themeDisabledFade = Float
0.55
        }
  where
  edgeCol :: Color
edgeCol    = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
77 Word8
80 Word8
87 Word8
255              -- window #4D5057 (touch brighter crisp border)
  sepCol :: Color
sepCol = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
55 Word8
59 Word8
65 Word8
255              -- base.selection #373B41 (subtle divider)
  accentCol :: Color
accentCol    = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
103 Word8
150 Word8
230 Word8
255           -- vscode.cornflower_blue #6796E6

-- | Ported from "Tomorrow Min" in https://github.com/biaqat/tomorrow-min-theme-zed
tomorrowMinLightTheme :: Theme
tomorrowMinLightTheme :: Theme
tomorrowMinLightTheme =
  let panelSurface :: Style
panelSurface =
        Color -> Color -> Color -> Color -> Color -> Style
flatStyle
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
242 Word8
242 Word8
242 Word8
255)  -- #F2F2F2
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
55 Word8
59 Word8
65 Word8
255)  -- #373B41
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
222 Word8
222 Word8
222 Word8
255)  -- #DEDEDE
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
231 Word8
231 Word8
255)  -- #E7E7E7 (darker than #F2F2F2 so hover reads)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
219 Word8
219 Word8
219 Word8
255)  -- #DBDBDB
   in Theme
        { themeWindow :: Color
themeWindow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255     -- #FFFFFF
        , themePanel :: Style
themePanel = Style
panelSurface
        , themeFloatingWindow :: Style
themeFloatingWindow = Style
panelSurface
        , themeButton :: Style
themeButton =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
232 Word8
232 Word8
232 Word8
255)  -- #E8E8E8 (step down from panel for zebra rows)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
55 Word8
59 Word8
65 Word8
255)  -- #373B41
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
214 Word8
214 Word8
214 Word8
255)  -- #D6D6D6
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
214 Word8
214 Word8
214 Word8
255)  -- #D6D6D6
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
196 Word8
196 Word8
196 Word8
255)  -- #C4C4C4
        , themeInput :: Style
themeInput =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255)  -- #FFFFFF
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
55 Word8
59 Word8
65 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
210 Word8
210 Word8
210 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
243 Word8
243 Word8
243 Word8
255)  -- #F3F3F3 (darker than white so hover reads)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255)  -- focus keeps the normal white bg; accent border signals focus
        , themeSeparator :: Color
themeSeparator = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
222 Word8
222 Word8
222 Word8
255  -- #DEDEDE
        , themeAccent :: Color
themeAccent = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
82 Word8
134 Word8
188 Word8
255      -- #5286BC (Tomorrow Blue)
        , themeMuted :: Color
themeMuted = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
140 Word8
140 Word8
140 Word8
255      -- #8C8C8C
        , themeRed :: Color
themeRed = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
197 Word8
78 Word8
82 Word8
255          -- Tomorrow Red #C54E52
        , themeOrange :: Color
themeOrange = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
140 Word8
69 Word8
255      -- Tomorrow Orange #E78C45
        , themeYellow :: Color
themeYellow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
197 Word8
71 Word8
255      -- Tomorrow Yellow #E7C547
        , themeGreen :: Color
themeGreen = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
113 Word8
140 Word8
0 Word8
255        -- Tomorrow Green #718C00
        , themePurple :: Color
themePurple = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
137 Word8
91 Word8
144 Word8
255      -- Tomorrow Purple #895B90
        , themeOverlayDim :: Color
themeOverlayDim = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
100
        , themeOnAccent :: Color
themeOnAccent = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255
        , themeSelection :: Color
themeSelection = Color -> Word8 -> Color
fadeAlpha (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
82 Word8
134 Word8
188 Word8
255) Word8
80
        , themeFocusRing :: Color
themeFocusRing = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
82 Word8
134 Word8
188 Word8
255
        , themeLink :: Color
themeLink = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
66 Word8
113 Word8
174 Word8
255
        , themeShadow :: Color
themeShadow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
36
        , themeDisabledFade :: Float
themeDisabledFade = Float
0.55
        }

-- | Ported from "Tomorrow at Midnight Min" in https://github.com/biaqat/tomorrow-min-theme-zed
tomorrowMidnightMinDarkTheme :: Theme
tomorrowMidnightMinDarkTheme :: Theme
tomorrowMidnightMinDarkTheme =
  let panelSurface :: Style
panelSurface =
        Color -> Color -> Color -> Color -> Color -> Style
flatStyle
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
16 Word8
17 Word8
20 Word8
255)  -- #101114 (elevated panel canvas)
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
238 Word8
238 Word8
238 Word8
255)  -- #EEEEEE
          Color
edgeCol
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
46 Word8
48 Word8
56 Word8
255)  -- #2E3038
          (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
12 Word8
13 Word8
15 Word8
255)  -- #0C0D0F
   in Theme
        { themeWindow :: Color
themeWindow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
255           -- #000000 (pitch black root window backdrop)
        , themePanel :: Style
themePanel = Style
panelSurface
        , themeFloatingWindow :: Style
themeFloatingWindow = Style
panelSurface
        , themeButton :: Style
themeButton =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
26 Word8
27 Word8
34 Word8
255)  -- #1A1B22
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
238 Word8
238 Word8
238 Word8
255)  -- #EEEEEE
              Color
edgeCol
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
54 Word8
58 Word8
72 Word8
255)  -- #363A48
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
56 Word8
60 Word8
81 Word8
255)  -- #383C51
        , themeInput :: Style
themeInput =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
13 Word8
14 Word8
18 Word8
255)  -- #0D0E12 (recessed into panel)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
238 Word8
238 Word8
238 Word8
255)
              Color
edgeCol
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
21 Word8
22 Word8
28 Word8
255)
              (Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
8 Word8
9 Word8
11 Word8
255)
        , themeSeparator :: Color
themeSeparator = Color
sepCol
        , themeAccent :: Color
themeAccent = Color
accentCol
        , themeMuted :: Color
themeMuted = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
128 Word8
132 Word8
150 Word8
255       -- #808496
        , themeRed :: Color
themeRed = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
213 Word8
78 Word8
83 Word8
255           -- bright.red #D54E53
        , themeOrange :: Color
themeOrange = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
140 Word8
69 Word8
255       -- bright.orange #E78C45
        , themeYellow :: Color
themeYellow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
197 Word8
71 Word8
255       -- bright.yellow #E7C547
        , themeGreen :: Color
themeGreen = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
185 Word8
202 Word8
74 Word8
255        -- bright.green #B9CA4A
        , themePurple :: Color
themePurple = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
195 Word8
151 Word8
216 Word8
255      -- bright.purple #C397D8
        , themeOverlayDim :: Color
themeOverlayDim = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
160
        , themeOnAccent :: Color
themeOnAccent = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255
        , themeSelection :: Color
themeSelection = Color -> Word8 -> Color
fadeAlpha Color
accentCol Word8
115
        , themeFocusRing :: Color
themeFocusRing = Color
accentCol
        , themeLink :: Color
themeLink = Color
accentCol
        , themeShadow :: Color
themeShadow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
96
        , themeDisabledFade :: Float
themeDisabledFade = Float
0.55
        }
  where
  edgeCol :: Color
edgeCol    = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
48 Word8
52 Word8
70 Word8
255              -- #303446
  sepCol :: Color
sepCol = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
48 Word8
52 Word8
70 Word8
255              -- #303446
  accentCol :: Color
accentCol    = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
140 Word8
182 Word8
226 Word8
255           -- #8CB6E2

-- -----------------------------------------------------------------------------
-- Base16 Colorschemes
-- -----------------------------------------------------------------------------

-- | Standard Base16 palette containing 16 styling tones and syntax colours
-- following Chris Kempson's Base16 specification.
data Base16 = Base16
  { Base16 -> Color
base00 :: {-# UNPACK #-} !Color -- ^ Default Background
  , Base16 -> Color
base01 :: {-# UNPACK #-} !Color -- ^ Lighter Background (status bars, line numbers, panel backgrounds)
  , Base16 -> Color
base02 :: {-# UNPACK #-} !Color -- ^ Selection Background (active elements, subtle highlights)
  , Base16 -> Color
base03 :: {-# UNPACK #-} !Color -- ^ Comments, Invisibles, Line Highlighting (muted text, borders)
  , Base16 -> Color
base04 :: {-# UNPACK #-} !Color -- ^ Dark Foreground (status bar foreground, secondary text)
  , Base16 -> Color
base05 :: {-# UNPACK #-} !Color -- ^ Default Foreground, Caret, Delimiters, Operators
  , Base16 -> Color
base06 :: {-# UNPACK #-} !Color -- ^ Light Foreground
  , Base16 -> Color
base07 :: {-# UNPACK #-} !Color -- ^ Light Background / Highest contrast foreground
  , Base16 -> Color
base08 :: {-# UNPACK #-} !Color -- ^ Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted (Red)
  , Base16 -> Color
base09 :: {-# UNPACK #-} !Color -- ^ Integers, Boolean, Constants, XML Attributes, Markup Link Url (Orange)
  , Base16 -> Color
base0A :: {-# UNPACK #-} !Color -- ^ Classes, Markup Bold, Search Text Background (Yellow)
  , Base16 -> Color
base0B :: {-# UNPACK #-} !Color -- ^ Strings, Inherited Class, Markup Code, Diff Inserted (Green)
  , Base16 -> Color
base0C :: {-# UNPACK #-} !Color -- ^ Support, Regular Expressions, Escape Characters, Markup Quotes (Cyan)
  , Base16 -> Color
base0D :: {-# UNPACK #-} !Color -- ^ Functions, Methods, Attribute IDs, Headings (Blue / Primary Accent)
  , Base16 -> Color
base0E :: {-# UNPACK #-} !Color -- ^ Keywords, Storage, Selector, Markup Italic, Diff Changed (Purple / Magenta)
  , Base16 -> Color
base0F :: {-# UNPACK #-} !Color -- ^ Deprecated, Opening/Closing Embedded Language Tags (Brown)
  }
  deriving (Base16 -> Base16 -> Bool
(Base16 -> Base16 -> Bool)
-> (Base16 -> Base16 -> Bool) -> Eq Base16
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Base16 -> Base16 -> Bool
== :: Base16 -> Base16 -> Bool
$c/= :: Base16 -> Base16 -> Bool
/= :: Base16 -> Base16 -> Bool
Eq, Int -> Base16 -> ShowS
[Base16] -> ShowS
Base16 -> String
(Int -> Base16 -> ShowS)
-> (Base16 -> String) -> ([Base16] -> ShowS) -> Show Base16
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Base16 -> ShowS
showsPrec :: Int -> Base16 -> ShowS
$cshow :: Base16 -> String
show :: Base16 -> String
$cshowList :: [Base16] -> ShowS
showList :: [Base16] -> ShowS
Show)

-- | Calculate a 'Theme' from a 'Base16' colorscheme, automatically selecting
-- dark or light styling based on background vs foreground luminance.
themeFromBase16 :: Base16 -> Theme
themeFromBase16 :: Base16 -> Theme
themeFromBase16 Base16
b
  | Bool
isDark = Base16 -> Theme
themeFromBase16Dark Base16
b
  | Bool
otherwise = Base16 -> Theme
themeFromBase16Light Base16
b
  where
    isDark :: Bool
isDark = Color -> Double
colorLuminance (Base16 -> Color
base00 Base16
b) Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Color -> Double
colorLuminance (Base16 -> Color
base05 Base16
b)

-- | Calculate a dark 'Theme' from a 'Base16' colorscheme.
themeFromBase16Dark :: Base16 -> Theme
themeFromBase16Dark :: Base16 -> Theme
themeFromBase16Dark Base16
b =
  let edgeCol :: Color
edgeCol = Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base02 Base16
b) (Base16 -> Color
base03 Base16
b) Float
0.35
      panelBg :: Color
panelBg = Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base01 Base16
b) (Base16 -> Color
base02 Base16
b) Float
0.3
      panelSurface :: Style
panelSurface =
        Color -> Color -> Color -> Color -> Color -> Style
flatStyle
          Color
panelBg
          (Base16 -> Color
base05 Base16
b)
          Color
edgeCol
          (Color -> Color -> Float -> Color
lerpColor Color
panelBg (Base16 -> Color
base02 Base16
b) Float
0.5)
          (Color -> Color -> Float -> Color
lerpColor Color
panelBg (Base16 -> Color
base00 Base16
b) Float
0.4)
   in Theme
        { themeWindow :: Color
themeWindow = Base16 -> Color
base00 Base16
b
        , themePanel :: Style
themePanel = Style
panelSurface
        , themeFloatingWindow :: Style
themeFloatingWindow = Style
panelSurface
        , themeButton :: Style
themeButton =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Base16 -> Color
base02 Base16
b)
              (Base16 -> Color
base07 Base16
b)
              Color
edgeCol
              (Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base02 Base16
b) (Base16 -> Color
base03 Base16
b) Float
0.4)
              (Base16 -> Color
base01 Base16
b)
        , themeInput :: Style
themeInput =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Base16 -> Color
base00 Base16
b)
              (Base16 -> Color
base05 Base16
b)
              Color
edgeCol
              (Base16 -> Color
base01 Base16
b)
              (Base16 -> Color
base00 Base16
b)
        , themeSeparator :: Color
themeSeparator = Color
edgeCol
        , themeAccent :: Color
themeAccent = Base16 -> Color
base0D Base16
b
        , themeMuted :: Color
themeMuted = Base16 -> Color
base03 Base16
b
        , themeRed :: Color
themeRed = Base16 -> Color
base08 Base16
b
        , themeOrange :: Color
themeOrange = Base16 -> Color
base09 Base16
b
        , themeYellow :: Color
themeYellow = Base16 -> Color
base0A Base16
b
        , themeGreen :: Color
themeGreen = Base16 -> Color
base0B Base16
b
        , themePurple :: Color
themePurple = Base16 -> Color
base0E Base16
b
        , themeOverlayDim :: Color
themeOverlayDim = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
160
        , themeOnAccent :: Color
themeOnAccent = if Color -> Double
colorLuminance (Base16 -> Color
base0D Base16
b) Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0.6 then Base16 -> Color
base00 Base16
b else Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255
        , themeSelection :: Color
themeSelection = Color -> Word8 -> Color
fadeAlpha (Base16 -> Color
base0D Base16
b) Word8
115
        , themeFocusRing :: Color
themeFocusRing = Base16 -> Color
base0D Base16
b
        , themeLink :: Color
themeLink = Base16 -> Color
base0D Base16
b
        , themeShadow :: Color
themeShadow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
72
        , themeDisabledFade :: Float
themeDisabledFade = Float
0.55
        }

-- | Calculate a light 'Theme' from a 'Base16' colorscheme.
themeFromBase16Light :: Base16 -> Theme
themeFromBase16Light :: Base16 -> Theme
themeFromBase16Light Base16
b =
  let edgeCol :: Color
edgeCol = Base16 -> Color
base02 Base16
b
      panelBg :: Color
panelBg = Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base00 Base16
b) (Base16 -> Color
base01 Base16
b) Float
0.5
      panelSurface :: Style
panelSurface =
        Color -> Color -> Color -> Color -> Color -> Style
flatStyle
          Color
panelBg
          (Base16 -> Color
base05 Base16
b)
          Color
edgeCol
          (Color -> Color -> Float -> Color
lerpColor Color
panelBg (Base16 -> Color
base00 Base16
b) Float
0.4)
          (Color -> Color -> Float -> Color
lerpColor Color
panelBg (Base16 -> Color
base02 Base16
b) Float
0.4)
   in Theme
        { themeWindow :: Color
themeWindow = Base16 -> Color
base00 Base16
b
        , themePanel :: Style
themePanel = Style
panelSurface
        , themeFloatingWindow :: Style
themeFloatingWindow = Style
panelSurface
        , themeButton :: Style
themeButton =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Base16 -> Color
base01 Base16
b)
              (Base16 -> Color
base05 Base16
b)
              Color
edgeCol
              (Base16 -> Color
base02 Base16
b)
              (Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base02 Base16
b) (Base16 -> Color
base03 Base16
b) Float
0.35)
        , themeInput :: Style
themeInput =
            Color -> Color -> Color -> Color -> Color -> Style
flatStyle
              (Base16 -> Color
base00 Base16
b)
              (Base16 -> Color
base05 Base16
b)
              Color
edgeCol
              (Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base00 Base16
b) (Base16 -> Color
base01 Base16
b) Float
0.3)
              (Color -> Color -> Float -> Color
lerpColor (Base16 -> Color
base00 Base16
b) (Base16 -> Color
base01 Base16
b) Float
0.6)
        , themeSeparator :: Color
themeSeparator = Color
edgeCol
        , themeAccent :: Color
themeAccent = Base16 -> Color
base0D Base16
b
        , themeMuted :: Color
themeMuted = Base16 -> Color
base03 Base16
b
        , themeRed :: Color
themeRed = Base16 -> Color
base08 Base16
b
        , themeOrange :: Color
themeOrange = Base16 -> Color
base09 Base16
b
        , themeYellow :: Color
themeYellow = Base16 -> Color
base0A Base16
b
        , themeGreen :: Color
themeGreen = Base16 -> Color
base0B Base16
b
        , themePurple :: Color
themePurple = Base16 -> Color
base0E Base16
b
        , themeOverlayDim :: Color
themeOverlayDim = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
100
        , themeOnAccent :: Color
themeOnAccent = if Color -> Double
colorLuminance (Base16 -> Color
base0D Base16
b) Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
0.6 then Base16 -> Color
base07 Base16
b else Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255
        , themeSelection :: Color
themeSelection = Color -> Word8 -> Color
fadeAlpha (Base16 -> Color
base0D Base16
b) Word8
80
        , themeFocusRing :: Color
themeFocusRing = Base16 -> Color
base0D Base16
b
        , themeLink :: Color
themeLink = Base16 -> Color
base0D Base16
b
        , themeShadow :: Color
themeShadow = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
0 Word8
0 Word8
0 Word8
36
        , themeDisabledFade :: Float
themeDisabledFade = Float
0.55
        }

-- | Tomorrow Night Base16 reference palette.
base16TomorrowNight :: Base16
base16TomorrowNight :: Base16
base16TomorrowNight =
  Base16
    { base00 :: Color
base00 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
29 Word8
31 Word8
33 Word8
255     -- #1D1F21
    , base01 :: Color
base01 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
40 Word8
42 Word8
46 Word8
255     -- #282A2E
    , base02 :: Color
base02 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
55 Word8
59 Word8
65 Word8
255     -- #373B41
    , base03 :: Color
base03 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
150 Word8
152 Word8
150 Word8
255 -- #969896
    , base04 :: Color
base04 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
180 Word8
183 Word8
180 Word8
255 -- #B4B7B4
    , base05 :: Color
base05 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
197 Word8
200 Word8
198 Word8
255 -- #C5C8C6
    , base06 :: Color
base06 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
224 Word8
224 Word8
224 Word8
255 -- #E0E0E0
    , base07 :: Color
base07 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255 -- #FFFFFF
    , base08 :: Color
base08 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
213 Word8
78 Word8
83 Word8
255   -- #D54E53
    , base09 :: Color
base09 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
140 Word8
69 Word8
255  -- #E78C45
    , base0A :: Color
base0A = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
197 Word8
71 Word8
255  -- #E7C547
    , base0B :: Color
base0B = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
185 Word8
202 Word8
74 Word8
255  -- #B9CA4A
    , base0C :: Color
base0C = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
112 Word8
192 Word8
186 Word8
255 -- #70C0BA
    , base0D :: Color
base0D = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
103 Word8
150 Word8
230 Word8
255 -- #6796E6
    , base0E :: Color
base0E = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
195 Word8
151 Word8
216 Word8
255 -- #C397D8
    , base0F :: Color
base0F = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
163 Word8
104 Word8
90 Word8
255  -- #A3685A
    }

-- | Tomorrow Light Base16 reference palette.
base16TomorrowLight :: Base16
base16TomorrowLight :: Base16
base16TomorrowLight =
  Base16
    { base00 :: Color
base00 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
255 Word8
255 Word8
255 Word8
255 -- #FFFFFF
    , base01 :: Color
base01 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
242 Word8
242 Word8
242 Word8
255 -- #F2F2F2
    , base02 :: Color
base02 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
222 Word8
222 Word8
222 Word8
255 -- #DEDEDE
    , base03 :: Color
base03 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
140 Word8
140 Word8
140 Word8
255 -- #8C8C8C
    , base04 :: Color
base04 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
150 Word8
152 Word8
150 Word8
255 -- #969896
    , base05 :: Color
base05 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
55 Word8
59 Word8
65 Word8
255    -- #373B41
    , base06 :: Color
base06 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
40 Word8
42 Word8
46 Word8
255    -- #282A2E
    , base07 :: Color
base07 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
29 Word8
31 Word8
33 Word8
255    -- #1D1F21
    , base08 :: Color
base08 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
197 Word8
78 Word8
82 Word8
255   -- #C54E52
    , base09 :: Color
base09 = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
140 Word8
69 Word8
255  -- #E78C45
    , base0A :: Color
base0A = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
231 Word8
197 Word8
71 Word8
255  -- #E7C547
    , base0B :: Color
base0B = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
113 Word8
140 Word8
0 Word8
255   -- #718C00
    , base0C :: Color
base0C = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
62 Word8
153 Word8
159 Word8
255  -- #3E999F
    , base0D :: Color
base0D = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
82 Word8
134 Word8
188 Word8
255  -- #5286BC
    , base0E :: Color
base0E = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
137 Word8
91 Word8
144 Word8
255  -- #895B90
    , base0F :: Color
base0F = Word8 -> Word8 -> Word8 -> Word8 -> Color
colorRGBA Word8
163 Word8
104 Word8
90 Word8
255  -- #A3685A
    }