{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# OPTIONS_GHC -Wno-term-variable-capture #-}

module Dashi.Style.Root where

import Clay hiding (Color, FontSize, fullWidth, var)
import Dashi.Style.Background (BackgroundColour (BackgroundColour))
import Dashi.Style.Border (BorderColour)
import Dashi.Style.Colour ()
import Dashi.Style.Text (InverseTextColour, TextColour (TextColour))
import Dashi.Style.Tokens
import Dashi.Style.Uchu (Uchu)
import Dashi.Style.Util
import Data.Foldable (for_)
import Data.Text (Text)
import Prelude hiding (div, not, rem, (**))

varDecl' :: Key Text -> Value -> Css
varDecl' :: Key Text -> Value -> Css
varDecl' Key Text
n Value
v = Key Text -> Key Text
forall s. (IsString s, Semigroup s) => s -> s
varName Key Text
n Key Text -> Value -> Css
~: Value
v

varDecl :: (Val v) => Key Text -> v -> Css
varDecl :: forall v. Val v => Key Text -> v -> Css
varDecl Key Text
n = Key Text -> Value -> Css
varDecl' Key Text
n (Value -> Css) -> (v -> Value) -> v -> Css
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> Value
forall a. Val a => a -> Value
value

tokenDecl :: forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl :: forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl = forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ @[] (forall t l. (Token t, IsList l, Item l ~ t) => l
allTokens @t) \t
t -> Key Text -> ValueType t -> Css
forall v. Val v => Key Text -> v -> Css
varDecl (t -> Key Text
forall s. (IsString s, Semigroup s) => t -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName t
t) (t -> ValueType t
forall t. ValueToken t => t -> ValueType t
tokenValue t
t)

style :: Css
style :: Css
style = do
    Selector
":root" Selector -> Css -> Css
? do
        forall v. Val v => Key Text -> v -> Css
varDecl @[Value]
            Key Text
"font-family-emoji"
            [ Value
"'Apple Color Emoji'"
            , Value
"'Segoe UI Emoji'"
            , Value
"'Segoe UI Symbol'"
            , Value
"'Noto Color Emoji'"
            ]
        forall v. Val v => Key Text -> v -> Css
varDecl @[Value]
            Key Text
"font-family-sans-serif"
            [ Value
"system-ui"
            , Value
"-apple-system"
            , Value
"BlinkMacSystemFont"
            , Value
"'Segoe UI'"
            , Value
"Roboto"
            , Value
"Oxygen"
            , Value
"Ubuntu"
            , Value
"'Fira Sans'"
            , Value
"'Droid Sans'"
            , Value
"'Helvetica Neue'"
            , Value
"sans-serif"
            , Text -> [Value] -> Value
forall v. (Val v, Other v) => Text -> [v] -> v
var Text
"font-family-emoji" []
            ]
        forall v. Val v => Key Text -> v -> Css
varDecl @[Value]
            Key Text
"font-family-monospace"
            [ Value
"ui-monospace"
            , Value
"SFMono-Regular"
            , Value
"'SF Mono'"
            , Value
"'Segou UI Mono'"
            , Value
"'Liberation Mono'"
            , Value
"'Ubuntu Mono'"
            , Value
"Menlo"
            , Value
"Consolas"
            , Value
"monospace"
            , Text -> [Value] -> Value
forall v. (Val v, Other v) => Text -> [v] -> v
var Text
"font-family-emoji" []
            ]
        forall v. Val v => Key Text -> v -> Css
varDecl @Value Key Text
"font-body" (Value -> Css) -> Value -> Css
forall a b. (a -> b) -> a -> b
$
            Value
"normal 400 14px/1.5 " Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Text -> [Value] -> Value
forall v. (Val v, Other v) => Text -> [v] -> v
var Text
"font-family-sans-serif" []
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @Space
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @Radius
        forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ @[] (forall t l. (Token t, IsList l, Item l ~ t) => l
allTokens @Uchu) \Uchu
t -> Uchu -> Key Text
forall s. (IsString s, Semigroup s) => Uchu -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName Uchu
t Key Text -> Value -> Css
~: Color OKLCH Micro -> Value
forall a. Val a => a -> Value
value (Uchu -> ValueType Uchu
forall t. ValueToken t => t -> ValueType t
tokenValue Uchu
t)
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @TextColour
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @InverseTextColour
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @BackgroundColour
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @BorderColour
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @FontSize
        forall t. (ValueToken t, Val (ValueType t)) => Css
tokenDecl @BorderWidth
    Selector
star Selector -> Css -> Css
? do
        Size (ZonkAny 3) -> Css
forall a. Size a -> Css
marginAll Size (ZonkAny 3)
forall a. Size a
nil
        Size (ZonkAny 2) -> Css
forall a. Size a -> Css
paddingAll Size (ZonkAny 2)
forall a. Size a
nil
        [Text] -> [GenericFontFamily] -> Css
fontFamily [] [GenericFontFamily
forall a. Inherit a => a
inherit]
        Size (ZonkAny 0) -> Css
forall a. Size a -> Css
Clay.fontSize Size (ZonkAny 0)
forall a. Inherit a => a
inherit
        FontStyle -> Css
fontStyle FontStyle
forall a. Inherit a => a
inherit
        FontWeight -> Css
fontWeight FontWeight
forall a. Inherit a => a
inherit
        Color -> Css
color Color
forall a. Inherit a => a
inherit
        TextDecoration -> Css
textDecoration TextDecoration
forall a. Inherit a => a
inherit
        BoxType -> Css
boxSizing BoxType
borderBox
        Size (ZonkAny 1) -> Css
forall a. Size a -> Css
lineHeight Size (ZonkAny 1)
forall a. Inherit a => a
inherit
        Key Text
"border" Key Text -> Value -> Css
~: Value
forall a. None a => a
none
        Key Text
"background" Key Text -> Value -> Css
~: Value
forall a. None a => a
none
        Key Text
"appearance" Key Text -> Value -> Css
~: Value
forall a. None a => a
none
        Key Text
"-webkit-appearance" Key Text -> Value -> Css
~: Value
forall a. None a => a
none
        Key Text
"-moz-appearance" Key Text -> Value -> Css
~: Value
forall a. None a => a
none
        Bool -> Refinement
ariaBusy Bool
True Refinement -> Css -> Css
& do
            CursorValue Value -> Css
forall a. Cursor a => a -> Css
cursor CursorValue Value
cursorProgress
    let anyDisabledElement :: Selector
anyDisabledElement = Selector
self Selector -> Refinement -> Selector
# Refinement
disabled
    (Selector
self Selector -> Refinement -> Selector
# Refinement
disabled Selector -> Selector -> Selector
forall a. Semigroup a => a -> a -> a
<> Selector
forall a. IsString a => a
label Selector -> Refinement -> Selector
# Selector -> Refinement
has (Selector
self Selector -> Selector -> Selector
|> Selector
anyDisabledElement)) Selector -> Css -> Css
? do
        Css -> Css
important (Css -> Css) -> Css -> Css
forall a b. (a -> b) -> a -> b
$ CursorValue Value -> Css
forall a. Cursor a => a -> Css
cursor CursorValue Value
notAllowed
        Number -> Css
opacity Number
0.5
        Key Text
"filter" Key Text -> Text -> Css
-: Text
"grayscale(100%)"
    Selector
html Selector -> Css -> Css
? do
        Overflow -> Css
overflowX Overflow
forall a. Hidden a => a
hidden
        Overflow -> Css
overflowY Overflow
forall a. Auto a => a
auto
    Selector
body Selector -> Css -> Css
? do
        Value -> Css
forall a. Font a => a -> Css
font (Value -> Css) -> Value -> Css
forall a b. (a -> b) -> a -> b
$ forall v. (Val v, Other v) => Text -> [v] -> v
var @Value Text
"font-body" []
        BackgroundColour -> Css
forall t. Token t => t -> Css
backgroundColor' (BackgroundColour -> Css) -> BackgroundColour -> Css
forall a b. (a -> b) -> a -> b
$ Appearance -> BackgroundColour
BackgroundColour Appearance
Default
        TextColour -> Css
forall t. Token t => t -> Css
color' (TextColour -> Css) -> TextColour -> Css
forall a b. (a -> b) -> a -> b
$ Appearance -> TextColour
TextColour Appearance
Default
        Selector -> Refinement
has (Selector
"#dashi-loading" Selector -> Refinement -> Selector
# Refinement
onlyChild) Refinement -> Css -> Css
& do
            Size LengthUnit -> Css
forall a. Size a -> Css
height (Size LengthUnit -> Css) -> Size LengthUnit -> Css
forall a b. (a -> b) -> a -> b
$ Number -> Size LengthUnit
vh Number
100
            Display -> Css
display Display
flex
            JustifyContentValue -> Css
justifyContent JustifyContentValue
forall a. Center a => a
center
            AlignItemsValue -> Css
alignItems AlignItemsValue
forall a. Center a => a
center
            Selector
"#dashi-loading" Selector -> Css -> Css
? do
                Size LengthUnit -> Css
forall a. Size a -> Css
width (Size LengthUnit -> Css) -> Size LengthUnit -> Css
forall a b. (a -> b) -> a -> b
$ Number -> Size LengthUnit
em Number
2
                Size LengthUnit -> Css
forall a. Size a -> Css
height (Size LengthUnit -> Css) -> Size LengthUnit -> Css
forall a b. (a -> b) -> a -> b
$ Number -> Size LengthUnit
em Number
2
        Selector
"#dashi-loading" Selector -> Css -> Css
? Refinement -> Refinement
forall a. Not a => a -> Refinement
not Refinement
onlyChild Refinement -> Css -> Css
& Display -> Css
display Display
forall a. None a => a
none