{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
-- Turn incomplete pattern matches into error, so that every defined Class has to have a style
-- This ensures that every class used in Lucid also has an entry in the css stylesheet
{-# OPTIONS_GHC -Wincomplete-patterns -Werror=incomplete-patterns #-}

module Language.Ltml.HTML.CSS.Classes
    ( -- * CSS Class Defintions
      Class (..)
    , className
    , classStyle

      -- * Enumeration Counter
    , enumCounter

      -- * LTML AST to CSS Class Mapping
    , ToCssClass (..)
    , ToCssClasses (..)
    ) where

import Clay hiding (i, map, size)
import qualified Clay.Flexbox as Flexbox
import Data.Char (toLower)
import Data.String (fromString)
import Data.Text (Text, pack, unpack)
import qualified Data.Typography as Ltml
import Data.Void (Void, absurd)
import qualified Language.Lsd.AST.Type.Table as Ltml
import qualified Language.Ltml.HTML.CSS.Color as Color
import Language.Ltml.HTML.CSS.CustomClay

data Class
    = -- | Class for styling that should be applied to the whole document (HTML body)
      Body
    | -- | Class for spacing and alignment of and inside of an appendix section
      AppendixSection
    | -- | Class for alignment inside of a document
      Document
    | -- | Class for styling and aligning document title <h1>
      DocumentTitle
    | -- | Class for spacing and alignment of and inside of a super-section
      SuperSection
    | -- | Class for spacing and alignment of and inside of a section
      Section
    | -- | Class for spacing and alignment of a heading <h2>
      Heading
    | -- | Class for spacing and alignment of a paragraph div
      Paragraph
    | -- | Class for aligning a paragraph id div inside of a paragraph div
      ParagraphID
    | -- | Text container which spaces text with elements in it (e.g. enumerations)
      TextContainer
    | -- | General class for all enumerations
      Enumeration
    | -- | Class for spacing and alignment of multiple footnotes
      FootnoteContainer
    | -- | Class for spacing and alignment of a single footnote
      Footnote
    | -- | Class for <sup> element when rendering footnotes (not refs)
      FootnoteID
    | -- | Class for containers which left align text
      LeftAligned
    | -- | Class for containers which centers text
      Centered
    | -- | Class for containers which right align text
      RightAligned
    | -- | Class for containers with a smaller font size
      SmallFontSize
    | -- | Class for containers with a standard/medium font size
      MediumFontSize
    | -- | Class for containers with a larger font size
      LargeFontSize
    | -- | Bold inlined basic text
      Bold
    | -- | Italic inlined basic text
      Italic
    | -- | Underlined inlined basic text
      Underlined
    | -- | Class which inlines a red bold error text
      InlineError
    | -- | Class for centering blocks
      CenteredBox
    | -- | Class for a centered, boxed for parsing errors
      ErrorBox
    | -- | Styling of anchor links @<a>@
      AnchorLink
    | -- | Link @<a>@ that looks not like a link but more like a button
      ButtonLink
    | -- | Class for elements that have HTML anchors (adds scroll-margin)
      Anchor
    | -- | Wrapper around 'Table', which places it on the page
      TableContainer
    | -- | Class for @<table>@ element of in-text tables
      Table
    | -- | Class for @<table>@ element of ToC
      TableOfContents
    | -- | Table column thats only as wide as needed
      MinSizeColumn
    | -- | Table column that consumes maximum space possible
      MaxSizeColumn
    | -- | Center entries in table columns
      TableCentered
    | -- | Highlight table cells with darker background color
      TableDarkCell
    deriving (Int -> Class -> ShowS
[Class] -> ShowS
Class -> String
(Int -> Class -> ShowS)
-> (Class -> String) -> ([Class] -> ShowS) -> Show Class
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Class -> ShowS
showsPrec :: Int -> Class -> ShowS
$cshow :: Class -> String
show :: Class -> String
$cshowList :: [Class] -> ShowS
showList :: [Class] -> ShowS
Show, Class -> Class -> Bool
(Class -> Class -> Bool) -> (Class -> Class -> Bool) -> Eq Class
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Class -> Class -> Bool
== :: Class -> Class -> Bool
$c/= :: Class -> Class -> Bool
/= :: Class -> Class -> Bool
Eq, Int -> Class
Class -> Int
Class -> [Class]
Class -> Class
Class -> Class -> [Class]
Class -> Class -> Class -> [Class]
(Class -> Class)
-> (Class -> Class)
-> (Int -> Class)
-> (Class -> Int)
-> (Class -> [Class])
-> (Class -> Class -> [Class])
-> (Class -> Class -> [Class])
-> (Class -> Class -> Class -> [Class])
-> Enum Class
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 :: Class -> Class
succ :: Class -> Class
$cpred :: Class -> Class
pred :: Class -> Class
$ctoEnum :: Int -> Class
toEnum :: Int -> Class
$cfromEnum :: Class -> Int
fromEnum :: Class -> Int
$cenumFrom :: Class -> [Class]
enumFrom :: Class -> [Class]
$cenumFromThen :: Class -> Class -> [Class]
enumFromThen :: Class -> Class -> [Class]
$cenumFromTo :: Class -> Class -> [Class]
enumFromTo :: Class -> Class -> [Class]
$cenumFromThenTo :: Class -> Class -> Class -> [Class]
enumFromThenTo :: Class -> Class -> Class -> [Class]
Enum, Class
Class -> Class -> Bounded Class
forall a. a -> a -> Bounded a
$cminBound :: Class
minBound :: Class
$cmaxBound :: Class
maxBound :: Class
Bounded)

-- | Maps Class to its css style definition
classStyle :: Class -> Css
classStyle :: Class -> Css
classStyle Class
Body =
    Class -> Selector
toClassSelector Class
Body Selector -> Css -> Css
? do
        [Text] -> [GenericFontFamily] -> Css
fontFamily [Item [Text]
Text
"Arial"] [Item [GenericFontFamily]
GenericFontFamily
sansSerif]
        Size Any -> Css
forall a. Size a -> Css
lineHeight (Number -> Size Any
forall a. Number -> Size a
unitless Number
1.5)
        Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
2)
        Size LengthUnit -> Css
forall a. Size a -> Css
marginLeft (Number -> Size LengthUnit
em Number
2)
        Size LengthUnit -> Css
forall a. Size a -> Css
marginRight (Number -> Size LengthUnit
em Number
2)
        -- \| make Document scrollable past its end
        Size LengthUnit -> Css
forall a. Size a -> Css
paddingBottom (Number -> Size LengthUnit
em Number
10)
classStyle Class
AppendixSection =
    Class -> Selector
toClassSelector Class
AppendixSection Selector -> Css -> Css
? do
        Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
10)
        Display -> Css
display Display
flex
        FlexDirection -> Css
flexDirection FlexDirection
column
        -- \| gap between documents inside an appendix section
        Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
10)
classStyle Class
Document =
    Class -> Selector
toClassSelector Class
Document Selector -> Css -> Css
? do
        Display -> Css
display Display
flex
        FlexDirection -> Css
flexDirection FlexDirection
column
        -- \| gap between document childs
        Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
3)
classStyle Class
DocumentTitle =
    Class -> Selector
toClassSelector Class
DocumentTitle Selector -> Css -> Css
? do
        FontWeight -> Css
fontWeight FontWeight
forall a. Normal a => a
normal
        Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
0)
        Size LengthUnit -> Css
forall a. Size a -> Css
marginBottom (Number -> Size LengthUnit
em Number
0)
        Size LengthUnit -> Css
forall a. Size a -> Css
fontSize (Number -> Size LengthUnit
em Number
1.5)
classStyle Class
SuperSection =
    Class -> Selector
toClassSelector Class
SuperSection Selector -> Css -> Css
? do
        Display -> Css
display Display
flex
        FlexDirection -> Css
flexDirection FlexDirection
column
        -- \| gap between sections
        Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
2)
classStyle Class
Section =
    Class -> Selector
toClassSelector Class
Section Selector -> Css -> Css
? do
        Display -> Css
display Display
flex
        FlexDirection -> Css
flexDirection FlexDirection
column
        -- \| gap between paragraphs
        Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
1)
classStyle Class
Heading =
    Class -> Selector
toClassSelector Class
Heading Selector -> Css -> Css
? do
        FontWeight -> Css
fontWeight FontWeight
forall a. Normal a => a
normal
        Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
0)
        Size LengthUnit -> Css
forall a. Size a -> Css
marginBottom (Number -> Size LengthUnit
em Number
0)
        Size LengthUnit -> Css
forall a. Size a -> Css
fontSize (Number -> Size LengthUnit
em Number
1)
classStyle Class
Paragraph =
    Class -> Selector
toClassSelector Class
Paragraph Selector -> Css -> Css
? do
        Display -> Css
display Display
flex
classStyle Class
ParagraphID =
    Class -> Selector
toClassSelector Class
ParagraphID Selector -> Css -> Css
? do
        Int -> Int -> Size Any -> Css
forall b. Int -> Int -> Size b -> Css
Flexbox.flex Int
0 Int
0 Size Any
forall a. Auto a => a
auto
        -- TODO: if some paragraph ids are larger than others (e.g. (1) and (42))
        --       the larger paragraph will have a bigger indentation than the smaller one
        --       Might be needed to make paragraphs <li> and section <ol> and apply a
        --       custom css counter to each paragraph <li>
        --       Actually the indentation of paragraphs should be the same across the whole Section
        --       or Document even. Maybe it would be best to track the largest paragraph id and then
        --       scale all paragraphs to fit the largest one (let i = length maxid in flex 0 0 (em i))
        -- Edit: Right now i dont like this idea; maybe just leave it as is
        -- \| Gap between paragraph id and text
        Size LengthUnit -> Css
forall a. Size a -> Css
paddingRight (Number -> Size LengthUnit
em Number
0.75)
        UserSelect -> Css
userSelect UserSelect
forall a. None a => a
none
classStyle Class
TextContainer =
    Class -> Selector
toClassSelector Class
TextContainer Selector -> Css -> Css
? do
        Display -> Css
display Display
flex
        FlexDirection -> Css
flexDirection FlexDirection
column
        -- \| gap between text and enumerations
        Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
0.5)
        TextAlign -> Css
textAlign TextAlign
justify
classStyle Class
Enumeration =
    let enumClassName :: Text
enumClassName = Class -> Text
className Class
Enumeration
     in do
            Selector
ol Selector -> Refinement -> Selector
# Text -> Refinement
byClass Text
enumClassName Selector -> Css -> Css
? do
                Text -> Css
counterReset Text
"item"
                Size LengthUnit -> Css
forall a. Size a -> Css
marginLeft (Number -> Size LengthUnit
em Number
0)
                -- \| Enum indentation
                Size LengthUnit -> Css
forall a. Size a -> Css
paddingLeft (Number -> Size LengthUnit
em Number
1)
                Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
0)
                Size LengthUnit -> Css
forall a. Size a -> Css
marginBottom (Number -> Size LengthUnit
em Number
0)
                -- \| enums items are also spaced via flex environment
                Display -> Css
display Display
flex
                FlexDirection -> Css
flexDirection FlexDirection
column
                -- \| gap between two enum items
                Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
0.5)

            Selector
ol Selector -> Refinement -> Selector
# Text -> Refinement
byClass Text
enumClassName Selector -> Selector -> Selector
|> Selector
li Selector -> Css -> Css
? do
                Text -> Css
counterIncrement Text
"item"
                Display -> Css
display Display
grid
                [Size LengthUnit] -> Css
forall a. [Size a] -> Css
gridTemplateColumns [Item [Size LengthUnit]
Size LengthUnit
forall a. Auto a => a
auto, Number -> Size LengthUnit
fr Number
1]
                -- \| gap between enum item id and enum text
                Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
0.55)
                Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
0)
                Size LengthUnit -> Css
forall a. Size a -> Css
marginBottom (Number -> Size LengthUnit
em Number
0)
classStyle Class
FootnoteContainer =
    Class -> Selector
toClassSelector Class
FootnoteContainer Selector -> Css -> Css
? do
        Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
1)
classStyle Class
Footnote =
    Class -> Selector
toClassSelector Class
Footnote Selector -> Css -> Css
? do
        Display -> Css
display Display
flex
        -- \| Gap between footnote id and footnote text
        Size LengthUnit -> Css
gap (Number -> Size LengthUnit
em Number
0.5)
classStyle Class
FootnoteID =
    Class -> Selector
toClassSelector Class
FootnoteID Selector -> Css -> Css
? do
        UserSelect -> Css
userSelect UserSelect
forall a. None a => a
none
classStyle Class
LeftAligned =
    Class -> Selector
toClassSelector Class
LeftAligned Selector -> Css -> Css
? do
        Display -> Css
display Display
block
        TextAlign -> Css
textAlign TextAlign
alignLeft
classStyle Class
Centered =
    Class -> Selector
toClassSelector Class
Centered Selector -> Css -> Css
? do
        Display -> Css
display Display
block
        TextAlign -> Css
textAlign TextAlign
forall a. Center a => a
center
classStyle Class
RightAligned =
    Class -> Selector
toClassSelector Class
RightAligned Selector -> Css -> Css
? do
        Display -> Css
display Display
block
        TextAlign -> Css
textAlign TextAlign
alignRight
classStyle Class
SmallFontSize = Class -> Selector
toClassSelector Class
SmallFontSize Selector -> Css -> Css
? Size LengthUnit -> Css
forall a. Size a -> Css
fontSize (Number -> Size LengthUnit
em Number
0.75)
classStyle Class
MediumFontSize = Class -> Selector
toClassSelector Class
MediumFontSize Selector -> Css -> Css
? Size LengthUnit -> Css
forall a. Size a -> Css
fontSize (Number -> Size LengthUnit
em Number
1)
classStyle Class
LargeFontSize = Class -> Selector
toClassSelector Class
LargeFontSize Selector -> Css -> Css
? Size LengthUnit -> Css
forall a. Size a -> Css
fontSize (Number -> Size LengthUnit
em Number
1.25)
classStyle Class
Bold =
    Class -> Selector
toClassSelector Class
Bold Selector -> Css -> Css
? do
        FontWeight -> Css
fontWeight FontWeight
bold
classStyle Class
Italic =
    Class -> Selector
toClassSelector Class
Italic Selector -> Css -> Css
? do
        FontStyle -> Css
fontStyle FontStyle
italic
classStyle Class
Underlined = do
    Class -> Selector
toClassSelector Class
Underlined Selector -> Css -> Css
? do
        TextDecoration -> Css
textDecoration TextDecoration
underline
classStyle Class
InlineError =
    Class -> Selector
toClassSelector Class
InlineError Selector -> Css -> Css
? do
        Color -> Css
fontColor Color
Color.errorText
        FontWeight -> Css
fontWeight FontWeight
bold
classStyle Class
CenteredBox =
    Class -> Selector
toClassSelector Class
CenteredBox Selector -> Css -> Css
? do
        Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Number -> Size LengthUnit
em Number
2)
        Size LengthUnit -> Css
forall a. Size a -> Css
marginBottom (Number -> Size LengthUnit
em Number
2)
        Display -> Css
display Display
inlineGrid
        JustifyContentValue -> Css
justifyItems JustifyContentValue
forall a. Center a => a
center
        Size Percentage -> Css
forall a. Size a -> Css
width (Number -> Size Percentage
pct Number
100)
classStyle Class
ErrorBox =
    Class -> Selector
toClassSelector Class
ErrorBox Selector -> Css -> Css
? do
        Size LengthUnit
-> Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Css
forall a. Size a -> Size a -> Size a -> Size a -> Css
padding (Number -> Size LengthUnit
em Number
1) (Number -> Size LengthUnit
em Number
1) (Number -> Size LengthUnit
em Number
1) (Number -> Size LengthUnit
em Number
1)
        Size LengthUnit -> Stroke -> Color -> Css
border (Number -> Size LengthUnit
px Number
2) Stroke
dashed Color
Color.errorBoxBorder
classStyle Class
AnchorLink = do
    Class -> Selector
toClassSelector Class
AnchorLink Selector -> Css -> Css
? do
        Color -> Css
color Color
Color.linkText
        TextDecoration -> Css
textDecoration TextDecoration
underline
        Color -> Css
textDecorationColor Color
Color.linkUnderline

    Class -> Selector
toClassSelector Class
AnchorLink Selector -> Refinement -> Selector
# Refinement
hover Selector -> Css -> Css
? do
        TextDecoration -> Css
textDecoration TextDecoration
forall a. None a => a
none
        Color -> Css
color Color
Color.linkTextHover
classStyle Class
ButtonLink = do
    Class -> Selector
toClassSelector Class
ButtonLink Selector -> Css -> Css
? do
        Size LengthUnit
-> Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Css
forall a. Size a -> Size a -> Size a -> Size a -> Css
padding (Number -> Size LengthUnit
px Number
0) (Number -> Size LengthUnit
px Number
6) (Number -> Size LengthUnit
px Number
3) (Number -> Size LengthUnit
px Number
6)
        Size LengthUnit
-> Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Css
forall a. Size a -> Size a -> Size a -> Size a -> Css
borderRadius (Number -> Size LengthUnit
px Number
10) (Number -> Size LengthUnit
px Number
10) (Number -> Size LengthUnit
px Number
10) (Number -> Size LengthUnit
px Number
10)
        TextDecoration -> Css
textDecoration TextDecoration
forall a. None a => a
none
        Size LengthUnit -> Css
forall a. Size a -> Css
fontSize (Number -> Size LengthUnit
em Number
1.5)
        Color -> Css
color Color
Color.linkText

    Class -> Selector
toClassSelector Class
ButtonLink Selector -> Refinement -> Selector
# Refinement
hover Selector -> Css -> Css
? do
        Color -> Css
color Color
Color.linkTextHover
        Color -> Css
backgroundColor Color
Color.tocDarkCell
classStyle Class
Anchor =
    Class -> Selector
toClassSelector Class
Anchor Selector -> Css -> Css
? do
        Size LengthUnit -> Css
scrollMarginTop (Number -> Size LengthUnit
em Number
2)
classStyle Class
TableContainer = do
    Class -> Selector
toClassSelector Class
TableContainer Selector -> Css -> Css
? do
        Display -> Css
display Display
grid
        JustifyContentValue -> Css
justifyItems JustifyContentValue
forall a. Center a => a
center
classStyle Class
Table = do
    let cellPadding :: Css
cellPadding = Size LengthUnit
-> Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Css
forall a. Size a -> Size a -> Size a -> Size a -> Css
padding (Number -> Size LengthUnit
px Number
2) (Number -> Size LengthUnit
px Number
12) (Number -> Size LengthUnit
px Number
2) (Number -> Size LengthUnit
px Number
12)
        cellBorder :: Css
cellBorder = Size LengthUnit -> Stroke -> Color -> Css
border (Number -> Size LengthUnit
px Number
1) Stroke
solid Color
Color.tableCellBorder

    Class -> Selector
toClassSelector Class
Table Selector -> Css -> Css
? do
        Size Percentage -> Css
forall a. Size a -> Css
maxWidth (Number -> Size Percentage
pct Number
90)
        Position -> Css
tableLayout Position
autoLayout
        Visibility -> Css
borderCollapse Visibility
collapse

    Class -> Selector
toClassSelector Class
Table Selector -> Selector -> Selector
|> Selector
thead Selector -> Selector -> Selector
|> Selector
tr Selector -> Selector -> Selector
|> Selector
th Selector -> Css -> Css
? do
        TextAlign -> Css
textAlign TextAlign
alignLeft
        Color -> Css
backgroundColor Color
Color.tocDarkCell
        Css
cellPadding
        Css
cellBorder
        WhiteSpace -> Css
whiteSpace WhiteSpace
forall a. Normal a => a
normal

    Class -> Selector
toClassSelector Class
Table Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Refinement -> Selector
# Refinement
hover Selector -> Selector -> Selector
|> Selector
td Selector -> Css -> Css
? do
        Color -> Css
backgroundColor Color
Color.tocActiveRow

    Class -> Selector
toClassSelector Class
Table Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Selector -> Selector
|> Selector
td Selector -> Css -> Css
? do
        WhiteSpace -> Css
whiteSpace WhiteSpace
nowrap
        Css
cellPadding
        Css
cellBorder
        WhiteSpace -> Css
whiteSpace WhiteSpace
forall a. Normal a => a
normal
classStyle Class
TableOfContents = do
    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Css -> Css
? do
        Size Percentage -> Css
forall a. Size a -> Css
width (Number -> Size Percentage
pct Number
100)
        Position -> Css
tableLayout Position
autoLayout
    -- borderCollapse collapse
    -- boxShadow [ rgba 0 0 0 0.15 `bsColor` shadowWithBlur (px 0) (px 0) (px 20) ]

    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Selector -> Selector
|> Selector
thead Selector -> Selector -> Selector
|> Selector
tr Selector -> Selector -> Selector
|> Selector
th Selector -> Css -> Css
? do
        TextAlign -> Css
textAlign TextAlign
alignLeft

    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Css -> Css
? do
        Size LengthUnit -> Stroke -> Color -> Css
borderBottom (Number -> Size LengthUnit
px Number
1) Stroke
solid Color
Color.tableCellBorder

    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Refinement -> Selector
# Refinement
lastOfType Selector -> Css -> Css
? do
        Size LengthUnit -> Stroke -> Color -> Css
borderBottom (Number -> Size LengthUnit
px Number
2) Stroke
solid Color
Color.tableCellBorder

    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Selector -> Selector
|> Selector
td Selector -> Css -> Css
? do
        WhiteSpace -> Css
whiteSpace WhiteSpace
nowrap
        Size LengthUnit
-> Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Css
forall a. Size a -> Size a -> Size a -> Size a -> Css
padding (Number -> Size LengthUnit
px Number
10) (Number -> Size LengthUnit
px Number
10) (Number -> Size LengthUnit
px Number
10) (Number -> Size LengthUnit
px Number
10)

    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Refinement -> Selector
# Text -> Refinement
nthOfType Text
"odd" Selector -> Css -> Css
? do
        Color -> Css
backgroundColor Color
Color.tocDarkCell

    Class -> Selector
toClassSelector Class
TableOfContents Selector -> Selector -> Selector
|> Selector
tbody Selector -> Selector -> Selector
|> Selector
tr Selector -> Refinement -> Selector
# Refinement
hover Selector -> Css -> Css
? do
        Color -> Css
backgroundColor Color
Color.tocActiveRow
classStyle Class
MinSizeColumn = do
    Class -> Selector
toClassSelector Class
MinSizeColumn Selector -> Css -> Css
? do
        Size Percentage -> Css
forall a. Size a -> Css
width (Number -> Size Percentage
pct Number
1)
classStyle Class
MaxSizeColumn = do
    Class -> Selector
toClassSelector Class
MaxSizeColumn Selector -> Css -> Css
? do
        Size Any -> Css
forall a. Size a -> Css
width Size Any
forall a. Auto a => a
auto
classStyle Class
TableCentered =
    Class -> Selector
toClassSelector Class
TableCentered Selector -> Css -> Css
? do
        TextAlign -> Css
textAlign TextAlign
forall a. Center a => a
center
classStyle Class
TableDarkCell =
    Class -> Selector
toClassSelector Class
TableDarkCell Selector -> Css -> Css
? do
        Color -> Css
backgroundColor Color
Color.tocDarkCell

-- | Returns the html class name of given Class
className :: Class -> Text
className :: Class -> Text
className Class
cssClass = case Class -> String
forall a. Show a => a -> String
show Class
cssClass of
    (Char
c : String
cs) -> String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Char -> Char
toLower Char
c Char -> ShowS
forall a. a -> [a] -> [a]
: String
cs
    -- \| This case can not happen with derived Show
    [] -> String -> Text
forall a. HasCallStack => String -> a
error String
"CSS Class has \"\" as show instance!"

-- | Converts Class to Clay Selector and adds "." infront for css selection
toClassSelector :: Class -> Selector
toClassSelector :: Class -> Selector
toClassSelector Class
c = String -> Selector
forall a. IsString a => String -> a
fromString (String
"." String -> ShowS
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack (Class -> Text
className Class
c))

-------------------------------------------------------------------------------

-- | Builds CSS class with specfied counter for ordered list items
enumCounter :: Text -> Counter -> Css
enumCounter :: Text -> Counter -> Css
enumCounter Text
enumClassName Counter
counterContent = do
    Selector
ol Selector -> Refinement -> Selector
# Text -> Refinement
byClass Text
enumClassName Selector -> Selector -> Selector
|> Selector
li Selector -> Css -> Css
? Refinement
before Refinement -> Css -> Css
& do
        Counter -> Css
counter Counter
counterContent
        TextAlign -> Css
textAlign TextAlign
alignRight

-------------------------------------------------------------------------------

class ToCssClass a where
    toCssClass :: a -> Class

instance ToCssClass Ltml.TextAlignment where
    toCssClass :: TextAlignment -> Class
toCssClass TextAlignment
align = case TextAlignment
align of
        TextAlignment
Ltml.LeftAligned -> Class
LeftAligned
        TextAlignment
Ltml.Centered -> Class
Centered
        TextAlignment
Ltml.RightAligned -> Class
RightAligned

instance ToCssClass Ltml.FontSize where
    toCssClass :: FontSize -> Class
toCssClass FontSize
size = case FontSize
size of
        FontSize
Ltml.SmallFontSize -> Class
SmallFontSize
        FontSize
Ltml.MediumFontSize -> Class
MediumFontSize
        FontSize
Ltml.LargeFontSize -> Class
LargeFontSize

instance ToCssClass Ltml.FontStyle where
    toCssClass :: FontStyle -> Class
toCssClass FontStyle
size = case FontStyle
size of
        FontStyle
Ltml.Bold -> Class
Bold
        FontStyle
Ltml.Italics -> Class
Italic
        FontStyle
Ltml.Underlined -> Class
Underlined

-- | ToCssClass instance that can never be called, because there are
--   no values of type Void
instance ToCssClass Void where
    toCssClass :: Void -> Class
toCssClass = Void -> Class
forall a. Void -> a
absurd

-- | Convert 'a' into list of CSS classes that implement each feature
class ToCssClasses a where
    toCssClasses :: a -> [Class]

instance ToCssClasses Ltml.Typography where
    toCssClasses :: Typography -> [Class]
toCssClasses (Ltml.Typography TextAlignment
align FontSize
size [FontStyle]
styles) =
        let styleClasses :: [Class]
styleClasses = (FontStyle -> Class) -> [FontStyle] -> [Class]
forall a b. (a -> b) -> [a] -> [b]
map FontStyle -> Class
forall a. ToCssClass a => a -> Class
toCssClass [FontStyle]
styles
         in TextAlignment -> Class
forall a. ToCssClass a => a -> Class
toCssClass TextAlignment
align Class -> [Class] -> [Class]
forall a. a -> [a] -> [a]
: FontSize -> Class
forall a. ToCssClass a => a -> Class
toCssClass FontSize
size Class -> [Class] -> [Class]
forall a. a -> [a] -> [a]
: [Class]
styleClasses

instance ToCssClasses Ltml.BGColor where
    toCssClasses :: BGColor -> [Class]
toCssClasses BGColor
bgColor = case BGColor
bgColor of
        BGColor
Ltml.White -> []
        BGColor
Ltml.Gray -> [Item [Class]
Class
TableDarkCell]