{-# OPTIONS_GHC -Wno-term-variable-capture #-}

module Dashi.Style.Tokens where

import Clay hiding (Color, FontSize, fontSize)
import Dashi.Prelude
import Dashi.Util (emptyAttr_, emptyRefinement)
import GHC.IsList (IsList (..))
import Miso.Html.Property (class_)

class Token t where
    tokenName :: (IsString s, Semigroup s) => t -> s
    defaultToken :: Maybe t
    defaultToken = Maybe t
forall a. Maybe a
Nothing
    tokenAttr :: t -> Attribute action
    default tokenAttr :: (Eq t) => t -> Attribute action
    tokenAttr t
t
        | t -> Maybe t
forall a. a -> Maybe a
Just t
t Maybe t -> Maybe t -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe t
forall t. Token t => Maybe t
defaultToken = Attribute action
forall action. Attribute action
emptyAttr_
        | Bool
otherwise = MisoString -> Attribute action
forall action. MisoString -> Attribute action
class_ (MisoString -> Attribute action) -> MisoString -> Attribute action
forall a b. (a -> b) -> a -> b
$ t -> MisoString
forall s. (IsString s, Semigroup s) => t -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName t
t
    byToken :: t -> Refinement
    default byToken :: (Eq t) => t -> Refinement
    byToken t
t
        | t -> Maybe t
forall a. a -> Maybe a
Just t
t Maybe t -> Maybe t -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe t
forall t. Token t => Maybe t
defaultToken = Refinement
emptyRefinement
        | Bool
otherwise = MisoString -> Refinement
byClass (MisoString -> Refinement) -> MisoString -> Refinement
forall a b. (a -> b) -> a -> b
$ t -> MisoString
forall s. (IsString s, Semigroup s) => t -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName t
t
    allTokens :: (IsList l, Item l ~ t) => l
    default allTokens :: (IsList l, Item l ~ t, Bounded t, Enum t) => l
    allTokens = [Item l] -> l
forall l. IsList l => [Item l] -> l
fromList [t
Item l
forall a. Bounded a => a
minBound .. t
Item l
forall a. Bounded a => a
maxBound]

byTokens :: (Token t) => (t -> Css) -> Css
byTokens :: forall t. Token t => (t -> Css) -> Css
byTokens t -> Css
f = forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ @[] [t]
forall l. (IsList l, Item l ~ t) => l
forall t l. (Token t, IsList l, Item l ~ t) => l
allTokens \t
t -> t -> Refinement
forall t. Token t => t -> Refinement
byToken t
t Refinement -> Css -> Css
Clay.& t -> Css
f t
t

nonDefaultTokenName :: (Token t, Eq t, IsString s, Semigroup s) => t -> Maybe s
nonDefaultTokenName :: forall t s.
(Token t, Eq t, IsString s, Semigroup s) =>
t -> Maybe s
nonDefaultTokenName t
t
    | t -> Maybe t
forall a. a -> Maybe a
Just t
t Maybe t -> Maybe t -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe t
forall t. Token t => Maybe t
defaultToken = Maybe s
forall a. Maybe a
Nothing
    | Bool
otherwise = s -> Maybe s
forall a. a -> Maybe a
Just (s -> Maybe s) -> s -> Maybe s
forall a b. (a -> b) -> a -> b
$ t -> s
forall s. (IsString s, Semigroup s) => t -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName t
t

class (Token t) => ValueToken t where
    type ValueType t
    tokenValue :: t -> ValueType t

data SizeToken
    = XSmall
    | Small
    | Medium
    | Large
    | XLarge
    deriving stock (SizeToken -> SizeToken -> Bool
(SizeToken -> SizeToken -> Bool)
-> (SizeToken -> SizeToken -> Bool) -> Eq SizeToken
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SizeToken -> SizeToken -> Bool
== :: SizeToken -> SizeToken -> Bool
$c/= :: SizeToken -> SizeToken -> Bool
/= :: SizeToken -> SizeToken -> Bool
Eq, Eq SizeToken
Eq SizeToken =>
(SizeToken -> SizeToken -> Ordering)
-> (SizeToken -> SizeToken -> Bool)
-> (SizeToken -> SizeToken -> Bool)
-> (SizeToken -> SizeToken -> Bool)
-> (SizeToken -> SizeToken -> Bool)
-> (SizeToken -> SizeToken -> SizeToken)
-> (SizeToken -> SizeToken -> SizeToken)
-> Ord SizeToken
SizeToken -> SizeToken -> Bool
SizeToken -> SizeToken -> Ordering
SizeToken -> SizeToken -> SizeToken
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 :: SizeToken -> SizeToken -> Ordering
compare :: SizeToken -> SizeToken -> Ordering
$c< :: SizeToken -> SizeToken -> Bool
< :: SizeToken -> SizeToken -> Bool
$c<= :: SizeToken -> SizeToken -> Bool
<= :: SizeToken -> SizeToken -> Bool
$c> :: SizeToken -> SizeToken -> Bool
> :: SizeToken -> SizeToken -> Bool
$c>= :: SizeToken -> SizeToken -> Bool
>= :: SizeToken -> SizeToken -> Bool
$cmax :: SizeToken -> SizeToken -> SizeToken
max :: SizeToken -> SizeToken -> SizeToken
$cmin :: SizeToken -> SizeToken -> SizeToken
min :: SizeToken -> SizeToken -> SizeToken
Ord, SizeToken
SizeToken -> SizeToken -> Bounded SizeToken
forall a. a -> a -> Bounded a
$cminBound :: SizeToken
minBound :: SizeToken
$cmaxBound :: SizeToken
maxBound :: SizeToken
Bounded, Int -> SizeToken
SizeToken -> Int
SizeToken -> [SizeToken]
SizeToken -> SizeToken
SizeToken -> SizeToken -> [SizeToken]
SizeToken -> SizeToken -> SizeToken -> [SizeToken]
(SizeToken -> SizeToken)
-> (SizeToken -> SizeToken)
-> (Int -> SizeToken)
-> (SizeToken -> Int)
-> (SizeToken -> [SizeToken])
-> (SizeToken -> SizeToken -> [SizeToken])
-> (SizeToken -> SizeToken -> [SizeToken])
-> (SizeToken -> SizeToken -> SizeToken -> [SizeToken])
-> Enum SizeToken
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 :: SizeToken -> SizeToken
succ :: SizeToken -> SizeToken
$cpred :: SizeToken -> SizeToken
pred :: SizeToken -> SizeToken
$ctoEnum :: Int -> SizeToken
toEnum :: Int -> SizeToken
$cfromEnum :: SizeToken -> Int
fromEnum :: SizeToken -> Int
$cenumFrom :: SizeToken -> [SizeToken]
enumFrom :: SizeToken -> [SizeToken]
$cenumFromThen :: SizeToken -> SizeToken -> [SizeToken]
enumFromThen :: SizeToken -> SizeToken -> [SizeToken]
$cenumFromTo :: SizeToken -> SizeToken -> [SizeToken]
enumFromTo :: SizeToken -> SizeToken -> [SizeToken]
$cenumFromThenTo :: SizeToken -> SizeToken -> SizeToken -> [SizeToken]
enumFromThenTo :: SizeToken -> SizeToken -> SizeToken -> [SizeToken]
Enum, Int -> SizeToken -> [Char] -> [Char]
[SizeToken] -> [Char] -> [Char]
SizeToken -> [Char]
(Int -> SizeToken -> [Char] -> [Char])
-> (SizeToken -> [Char])
-> ([SizeToken] -> [Char] -> [Char])
-> Show SizeToken
forall a.
(Int -> a -> [Char] -> [Char])
-> (a -> [Char]) -> ([a] -> [Char] -> [Char]) -> Show a
$cshowsPrec :: Int -> SizeToken -> [Char] -> [Char]
showsPrec :: Int -> SizeToken -> [Char] -> [Char]
$cshow :: SizeToken -> [Char]
show :: SizeToken -> [Char]
$cshowList :: [SizeToken] -> [Char] -> [Char]
showList :: [SizeToken] -> [Char] -> [Char]
Show)

instance Token SizeToken where
    tokenName :: forall s. (IsString s, Semigroup s) => SizeToken -> s
tokenName SizeToken
XSmall = s
"xs"
    tokenName SizeToken
Small = s
"s"
    tokenName SizeToken
Medium = s
"m"
    tokenName SizeToken
Large = s
"l"
    tokenName SizeToken
XLarge = s
"xl"

newtype Space = Space {Space -> SizeToken
spaceSize :: SizeToken}
    deriving newtype (Space -> Space -> Bool
(Space -> Space -> Bool) -> (Space -> Space -> Bool) -> Eq Space
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Space -> Space -> Bool
== :: Space -> Space -> Bool
$c/= :: Space -> Space -> Bool
/= :: Space -> Space -> Bool
Eq, Eq Space
Eq Space =>
(Space -> Space -> Ordering)
-> (Space -> Space -> Bool)
-> (Space -> Space -> Bool)
-> (Space -> Space -> Bool)
-> (Space -> Space -> Bool)
-> (Space -> Space -> Space)
-> (Space -> Space -> Space)
-> Ord Space
Space -> Space -> Bool
Space -> Space -> Ordering
Space -> Space -> Space
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 :: Space -> Space -> Ordering
compare :: Space -> Space -> Ordering
$c< :: Space -> Space -> Bool
< :: Space -> Space -> Bool
$c<= :: Space -> Space -> Bool
<= :: Space -> Space -> Bool
$c> :: Space -> Space -> Bool
> :: Space -> Space -> Bool
$c>= :: Space -> Space -> Bool
>= :: Space -> Space -> Bool
$cmax :: Space -> Space -> Space
max :: Space -> Space -> Space
$cmin :: Space -> Space -> Space
min :: Space -> Space -> Space
Ord, Space
Space -> Space -> Bounded Space
forall a. a -> a -> Bounded a
$cminBound :: Space
minBound :: Space
$cmaxBound :: Space
maxBound :: Space
Bounded, Int -> Space
Space -> Int
Space -> [Space]
Space -> Space
Space -> Space -> [Space]
Space -> Space -> Space -> [Space]
(Space -> Space)
-> (Space -> Space)
-> (Int -> Space)
-> (Space -> Int)
-> (Space -> [Space])
-> (Space -> Space -> [Space])
-> (Space -> Space -> [Space])
-> (Space -> Space -> Space -> [Space])
-> Enum Space
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 :: Space -> Space
succ :: Space -> Space
$cpred :: Space -> Space
pred :: Space -> Space
$ctoEnum :: Int -> Space
toEnum :: Int -> Space
$cfromEnum :: Space -> Int
fromEnum :: Space -> Int
$cenumFrom :: Space -> [Space]
enumFrom :: Space -> [Space]
$cenumFromThen :: Space -> Space -> [Space]
enumFromThen :: Space -> Space -> [Space]
$cenumFromTo :: Space -> Space -> [Space]
enumFromTo :: Space -> Space -> [Space]
$cenumFromThenTo :: Space -> Space -> Space -> [Space]
enumFromThenTo :: Space -> Space -> Space -> [Space]
Enum)

instance Token Space where
    tokenName :: forall s. (IsString s, Semigroup s) => Space -> s
tokenName = [Char] -> s
forall a. IsString a => [Char] -> a
fromString ([Char] -> s) -> (Space -> [Char]) -> Space -> s
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
. ([Char]
"space-" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<>) ([Char] -> [Char]) -> (Space -> [Char]) -> Space -> [Char]
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
. SizeToken -> [Char]
forall s. (IsString s, Semigroup s) => SizeToken -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName (SizeToken -> [Char]) -> (Space -> SizeToken) -> Space -> [Char]
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
. Space -> SizeToken
spaceSize

spaceEm :: SizeToken -> Number
spaceEm :: SizeToken -> Number
spaceEm = (Number
0.4 Number -> Number -> Number
forall a. Num a => a -> a -> a
*) (Number -> Number) -> (SizeToken -> Number) -> SizeToken -> Number
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
. (Number
1.75 Number -> Int -> Number
forall a b. (Num a, Integral b) => a -> b -> a
^) (Int -> Number) -> (SizeToken -> Int) -> SizeToken -> Number
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
. SizeToken -> Int
forall a. Enum a => a -> Int
fromEnum

instance ValueToken Space where
    type ValueType Space = Size LengthUnit
    tokenValue :: Space -> ValueType Space
tokenValue = Number -> Size LengthUnit
em (Number -> Size LengthUnit)
-> (Space -> Number) -> Space -> Size LengthUnit
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
. SizeToken -> Number
spaceEm (SizeToken -> Number) -> (Space -> SizeToken) -> Space -> Number
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
. Space -> SizeToken
spaceSize

newtype Radius = Radius {Radius -> SizeToken
radiusSize :: SizeToken}
    deriving newtype (Radius -> Radius -> Bool
(Radius -> Radius -> Bool)
-> (Radius -> Radius -> Bool) -> Eq Radius
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Radius -> Radius -> Bool
== :: Radius -> Radius -> Bool
$c/= :: Radius -> Radius -> Bool
/= :: Radius -> Radius -> Bool
Eq, Eq Radius
Eq Radius =>
(Radius -> Radius -> Ordering)
-> (Radius -> Radius -> Bool)
-> (Radius -> Radius -> Bool)
-> (Radius -> Radius -> Bool)
-> (Radius -> Radius -> Bool)
-> (Radius -> Radius -> Radius)
-> (Radius -> Radius -> Radius)
-> Ord Radius
Radius -> Radius -> Bool
Radius -> Radius -> Ordering
Radius -> Radius -> Radius
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 :: Radius -> Radius -> Ordering
compare :: Radius -> Radius -> Ordering
$c< :: Radius -> Radius -> Bool
< :: Radius -> Radius -> Bool
$c<= :: Radius -> Radius -> Bool
<= :: Radius -> Radius -> Bool
$c> :: Radius -> Radius -> Bool
> :: Radius -> Radius -> Bool
$c>= :: Radius -> Radius -> Bool
>= :: Radius -> Radius -> Bool
$cmax :: Radius -> Radius -> Radius
max :: Radius -> Radius -> Radius
$cmin :: Radius -> Radius -> Radius
min :: Radius -> Radius -> Radius
Ord, Radius
Radius -> Radius -> Bounded Radius
forall a. a -> a -> Bounded a
$cminBound :: Radius
minBound :: Radius
$cmaxBound :: Radius
maxBound :: Radius
Bounded, Int -> Radius
Radius -> Int
Radius -> [Radius]
Radius -> Radius
Radius -> Radius -> [Radius]
Radius -> Radius -> Radius -> [Radius]
(Radius -> Radius)
-> (Radius -> Radius)
-> (Int -> Radius)
-> (Radius -> Int)
-> (Radius -> [Radius])
-> (Radius -> Radius -> [Radius])
-> (Radius -> Radius -> [Radius])
-> (Radius -> Radius -> Radius -> [Radius])
-> Enum Radius
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 :: Radius -> Radius
succ :: Radius -> Radius
$cpred :: Radius -> Radius
pred :: Radius -> Radius
$ctoEnum :: Int -> Radius
toEnum :: Int -> Radius
$cfromEnum :: Radius -> Int
fromEnum :: Radius -> Int
$cenumFrom :: Radius -> [Radius]
enumFrom :: Radius -> [Radius]
$cenumFromThen :: Radius -> Radius -> [Radius]
enumFromThen :: Radius -> Radius -> [Radius]
$cenumFromTo :: Radius -> Radius -> [Radius]
enumFromTo :: Radius -> Radius -> [Radius]
$cenumFromThenTo :: Radius -> Radius -> Radius -> [Radius]
enumFromThenTo :: Radius -> Radius -> Radius -> [Radius]
Enum)

instance Token Radius where
    tokenName :: forall s. (IsString s, Semigroup s) => Radius -> s
tokenName = [Char] -> s
forall a. IsString a => [Char] -> a
fromString ([Char] -> s) -> (Radius -> [Char]) -> Radius -> s
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
. ([Char]
"radius-" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<>) ([Char] -> [Char]) -> (Radius -> [Char]) -> Radius -> [Char]
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
. SizeToken -> [Char]
forall s. (IsString s, Semigroup s) => SizeToken -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName (SizeToken -> [Char]) -> (Radius -> SizeToken) -> Radius -> [Char]
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
. Radius -> SizeToken
radiusSize

instance ValueToken Radius where
    type ValueType Radius = Size LengthUnit
    tokenValue :: Radius -> ValueType Radius
tokenValue = Number -> Size LengthUnit
em (Number -> Size LengthUnit)
-> (Radius -> Number) -> Radius -> Size LengthUnit
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
. (Number
0.1 Number -> Number -> Number
forall a. Num a => a -> a -> a
*) (Number -> Number) -> (Radius -> Number) -> Radius -> Number
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
. (Number
2 Number -> Int -> Number
forall a b. (Num a, Integral b) => a -> b -> a
^) (Int -> Number) -> (Radius -> Int) -> Radius -> Number
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
. SizeToken -> Int
forall a. Enum a => a -> Int
fromEnum (SizeToken -> Int) -> (Radius -> SizeToken) -> Radius -> Int
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
. Radius -> SizeToken
radiusSize

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

instance Token FontSize where
    tokenName :: forall s. (IsString s, Semigroup s) => FontSize -> s
tokenName (FontSize SizeToken
fontSize) = [Char] -> s
forall a. IsString a => [Char] -> a
fromString ([Char] -> s) -> [Char] -> s
forall a b. (a -> b) -> a -> b
$ [Char]
"font-size-" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> SizeToken -> [Char]
forall s. (IsString s, Semigroup s) => SizeToken -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName SizeToken
fontSize

instance ValueToken FontSize where
    type ValueType FontSize = Size Percentage
    tokenValue :: FontSize -> ValueType FontSize
tokenValue (FontSize SizeToken
fontSize) = Number -> Size Percentage
pct (Number -> Size Percentage) -> Number -> Size Percentage
forall a b. (a -> b) -> a -> b
$ case SizeToken
fontSize of
        SizeToken
XSmall -> Number
60
        SizeToken
Small -> Number
85
        SizeToken
Medium -> Number
100
        SizeToken
Large -> Number
125
        SizeToken
XLarge -> Number
200

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

instance Token Appearance where
    tokenName :: forall s. (IsString s, Semigroup s) => Appearance -> s
tokenName Appearance
Default = s
"default"
    tokenName Appearance
Subtle = s
"subtle"
    tokenName Appearance
Primary = s
"primary"
    tokenName Appearance
Success = s
"success"
    tokenName Appearance
Warning = s
"warning"
    tokenName Appearance
Danger = s
"danger"
    tokenName Appearance
Discovery = s
"discovery"
    defaultToken :: Maybe Appearance
defaultToken = Appearance -> Maybe Appearance
forall a. a -> Maybe a
Just Appearance
Default

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

instance Token InputState where
    tokenName :: forall s. (IsString s, Semigroup s) => InputState -> s
tokenName InputState
DefaultState = s
"default"
    tokenName InputState
HoveredState = s
"hovered"
    tokenName InputState
ActiveState = s
"active"
    defaultToken :: Maybe InputState
defaultToken = InputState -> Maybe InputState
forall a. a -> Maybe a
Just InputState
DefaultState
    byToken :: InputState -> Refinement
byToken InputState
DefaultState = Refinement
emptyRefinement
    byToken InputState
HoveredState = Refinement
hover
    byToken InputState
ActiveState = Refinement
active

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

instance Token BorderWidth where
    tokenName :: forall s. (IsString s, Semigroup s) => BorderWidth -> s
tokenName BorderWidth
BorderWidth = s
"border-width"

instance ValueToken BorderWidth where
    type ValueType BorderWidth = Size LengthUnit
    tokenValue :: BorderWidth -> ValueType BorderWidth
tokenValue BorderWidth
BorderWidth = Number -> Size LengthUnit
Clay.rem Number
0.0625