module Dashi.Style.Text where

import Dashi.Prelude
import Dashi.Style.Colour
import Dashi.Style.Tokens (Appearance (..), Token (..), ValueToken (..))
import Dashi.Style.Uchu
import Dashi.Style.Uchu qualified as Uchu

newtype TextColour = TextColour Appearance
    deriving newtype (TextColour -> TextColour -> Bool
(TextColour -> TextColour -> Bool)
-> (TextColour -> TextColour -> Bool) -> Eq TextColour
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TextColour -> TextColour -> Bool
== :: TextColour -> TextColour -> Bool
$c/= :: TextColour -> TextColour -> Bool
/= :: TextColour -> TextColour -> Bool
Eq, TextColour
TextColour -> TextColour -> Bounded TextColour
forall a. a -> a -> Bounded a
$cminBound :: TextColour
minBound :: TextColour
$cmaxBound :: TextColour
maxBound :: TextColour
Bounded, Int -> TextColour
TextColour -> Int
TextColour -> [TextColour]
TextColour -> TextColour
TextColour -> TextColour -> [TextColour]
TextColour -> TextColour -> TextColour -> [TextColour]
(TextColour -> TextColour)
-> (TextColour -> TextColour)
-> (Int -> TextColour)
-> (TextColour -> Int)
-> (TextColour -> [TextColour])
-> (TextColour -> TextColour -> [TextColour])
-> (TextColour -> TextColour -> [TextColour])
-> (TextColour -> TextColour -> TextColour -> [TextColour])
-> Enum TextColour
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 :: TextColour -> TextColour
succ :: TextColour -> TextColour
$cpred :: TextColour -> TextColour
pred :: TextColour -> TextColour
$ctoEnum :: Int -> TextColour
toEnum :: Int -> TextColour
$cfromEnum :: TextColour -> Int
fromEnum :: TextColour -> Int
$cenumFrom :: TextColour -> [TextColour]
enumFrom :: TextColour -> [TextColour]
$cenumFromThen :: TextColour -> TextColour -> [TextColour]
enumFromThen :: TextColour -> TextColour -> [TextColour]
$cenumFromTo :: TextColour -> TextColour -> [TextColour]
enumFromTo :: TextColour -> TextColour -> [TextColour]
$cenumFromThenTo :: TextColour -> TextColour -> TextColour -> [TextColour]
enumFromThenTo :: TextColour -> TextColour -> TextColour -> [TextColour]
Enum)

instance Token TextColour where
    tokenName :: forall s. (IsString s, Semigroup s) => TextColour -> s
tokenName (TextColour Appearance
appearance) = s
"text-" s -> s -> s
forall a. Semigroup a => a -> a -> a
<> Appearance -> s
forall s. (IsString s, Semigroup s) => Appearance -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName Appearance
appearance s -> s -> s
forall a. Semigroup a => a -> a -> a
<> s
"-color"

instance ValueToken TextColour where
    type ValueType TextColour = LightDark (UchuAlpha Micro)
    tokenValue :: TextColour -> ValueType TextColour
tokenValue (TextColour Appearance
Default) = (Uchu -> Micro -> UchuAlpha Micro)
-> Micro -> Uchu -> UchuAlpha Micro
forall a b c. (a -> b -> c) -> b -> a -> c
flip Uchu -> Micro -> UchuAlpha Micro
forall a. Uchu -> a -> UchuAlpha a
UchuAlpha Micro
1 (Uchu -> UchuAlpha Micro)
-> LightDark Uchu -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uchu -> Uchu -> LightDark Uchu
forall c. c -> c -> LightDark c
LightDark Uchu
Yin Uchu
Yang
    tokenValue (TextColour Appearance
Subtle) = Micro -> UchuAlpha Micro -> UchuAlpha Micro
forall a. a -> UchuAlpha a -> UchuAlpha a
Uchu.setAlpha Micro
0.75 (UchuAlpha Micro -> UchuAlpha Micro)
-> LightDark (UchuAlpha Micro) -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TextColour -> ValueType TextColour
forall t. ValueToken t => t -> ValueType t
tokenValue (Appearance -> TextColour
TextColour Appearance
Default)
    tokenValue (TextColour Appearance
Primary) = (Uchu -> Micro -> UchuAlpha Micro)
-> Micro -> Uchu -> UchuAlpha Micro
forall a b c. (a -> b -> c) -> b -> a -> c
flip Uchu -> Micro -> UchuAlpha Micro
forall a. Uchu -> a -> UchuAlpha a
UchuAlpha Micro
1 (Uchu -> UchuAlpha Micro)
-> LightDark Uchu -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uchu -> LightDark Uchu
forall c. c -> LightDark c
sameLightDark Uchu
Blue
    tokenValue (TextColour Appearance
Success) = (Uchu -> Micro -> UchuAlpha Micro)
-> Micro -> Uchu -> UchuAlpha Micro
forall a b c. (a -> b -> c) -> b -> a -> c
flip Uchu -> Micro -> UchuAlpha Micro
forall a. Uchu -> a -> UchuAlpha a
UchuAlpha Micro
1 (Uchu -> UchuAlpha Micro)
-> LightDark Uchu -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uchu -> LightDark Uchu
forall c. c -> LightDark c
sameLightDark Uchu
Green6
    tokenValue (TextColour Appearance
Warning) = (Uchu -> Micro -> UchuAlpha Micro)
-> Micro -> Uchu -> UchuAlpha Micro
forall a b c. (a -> b -> c) -> b -> a -> c
flip Uchu -> Micro -> UchuAlpha Micro
forall a. Uchu -> a -> UchuAlpha a
UchuAlpha Micro
1 (Uchu -> UchuAlpha Micro)
-> LightDark Uchu -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uchu -> LightDark Uchu
forall c. c -> LightDark c
sameLightDark Uchu
Orange6
    tokenValue (TextColour Appearance
Danger) = (Uchu -> Micro -> UchuAlpha Micro)
-> Micro -> Uchu -> UchuAlpha Micro
forall a b c. (a -> b -> c) -> b -> a -> c
flip Uchu -> Micro -> UchuAlpha Micro
forall a. Uchu -> a -> UchuAlpha a
UchuAlpha Micro
1 (Uchu -> UchuAlpha Micro)
-> LightDark Uchu -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uchu -> LightDark Uchu
forall c. c -> LightDark c
sameLightDark Uchu
Red
    tokenValue (TextColour Appearance
Discovery) = (Uchu -> Micro -> UchuAlpha Micro)
-> Micro -> Uchu -> UchuAlpha Micro
forall a b c. (a -> b -> c) -> b -> a -> c
flip Uchu -> Micro -> UchuAlpha Micro
forall a. Uchu -> a -> UchuAlpha a
UchuAlpha Micro
1 (Uchu -> UchuAlpha Micro)
-> LightDark Uchu -> LightDark (UchuAlpha Micro)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Uchu -> LightDark Uchu
forall c. c -> LightDark c
sameLightDark Uchu
Purple

data InverseTextColour = InverseTextColour
    deriving stock (InverseTextColour -> InverseTextColour -> Bool
(InverseTextColour -> InverseTextColour -> Bool)
-> (InverseTextColour -> InverseTextColour -> Bool)
-> Eq InverseTextColour
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InverseTextColour -> InverseTextColour -> Bool
== :: InverseTextColour -> InverseTextColour -> Bool
$c/= :: InverseTextColour -> InverseTextColour -> Bool
/= :: InverseTextColour -> InverseTextColour -> Bool
Eq, InverseTextColour
InverseTextColour -> InverseTextColour -> Bounded InverseTextColour
forall a. a -> a -> Bounded a
$cminBound :: InverseTextColour
minBound :: InverseTextColour
$cmaxBound :: InverseTextColour
maxBound :: InverseTextColour
Bounded, Int -> InverseTextColour
InverseTextColour -> Int
InverseTextColour -> [InverseTextColour]
InverseTextColour -> InverseTextColour
InverseTextColour -> InverseTextColour -> [InverseTextColour]
InverseTextColour
-> InverseTextColour -> InverseTextColour -> [InverseTextColour]
(InverseTextColour -> InverseTextColour)
-> (InverseTextColour -> InverseTextColour)
-> (Int -> InverseTextColour)
-> (InverseTextColour -> Int)
-> (InverseTextColour -> [InverseTextColour])
-> (InverseTextColour -> InverseTextColour -> [InverseTextColour])
-> (InverseTextColour -> InverseTextColour -> [InverseTextColour])
-> (InverseTextColour
    -> InverseTextColour -> InverseTextColour -> [InverseTextColour])
-> Enum InverseTextColour
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 :: InverseTextColour -> InverseTextColour
succ :: InverseTextColour -> InverseTextColour
$cpred :: InverseTextColour -> InverseTextColour
pred :: InverseTextColour -> InverseTextColour
$ctoEnum :: Int -> InverseTextColour
toEnum :: Int -> InverseTextColour
$cfromEnum :: InverseTextColour -> Int
fromEnum :: InverseTextColour -> Int
$cenumFrom :: InverseTextColour -> [InverseTextColour]
enumFrom :: InverseTextColour -> [InverseTextColour]
$cenumFromThen :: InverseTextColour -> InverseTextColour -> [InverseTextColour]
enumFromThen :: InverseTextColour -> InverseTextColour -> [InverseTextColour]
$cenumFromTo :: InverseTextColour -> InverseTextColour -> [InverseTextColour]
enumFromTo :: InverseTextColour -> InverseTextColour -> [InverseTextColour]
$cenumFromThenTo :: InverseTextColour
-> InverseTextColour -> InverseTextColour -> [InverseTextColour]
enumFromThenTo :: InverseTextColour
-> InverseTextColour -> InverseTextColour -> [InverseTextColour]
Enum)

instance Token InverseTextColour where
    tokenName :: forall s. (IsString s, Semigroup s) => InverseTextColour -> s
tokenName InverseTextColour
InverseTextColour = s
"text-inverse-color"

instance ValueToken InverseTextColour where
    type ValueType InverseTextColour = LightDark (UchuAlpha Micro)
    tokenValue :: InverseTextColour -> ValueType InverseTextColour
tokenValue InverseTextColour
InverseTextColour = LightDark (UchuAlpha Micro) -> LightDark (UchuAlpha Micro)
LightDark (UchuAlpha Micro) -> ValueType InverseTextColour
forall c. LightDark c -> LightDark c
flipLightDark (LightDark (UchuAlpha Micro) -> ValueType InverseTextColour)
-> (TextColour -> LightDark (UchuAlpha Micro))
-> TextColour
-> ValueType InverseTextColour
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. TextColour -> LightDark (UchuAlpha Micro)
TextColour -> ValueType TextColour
forall t. ValueToken t => t -> ValueType t
tokenValue (TextColour -> ValueType InverseTextColour)
-> TextColour -> ValueType InverseTextColour
forall a b. (a -> b) -> a -> b
$ Appearance -> TextColour
TextColour Appearance
Default