packages feed

simple-css-0.0.1: example/Main.hs

import Language.Css.Syntax
import Language.Css.Build

import qualified Language.Css.Build.Idents as C

import SimpleCss
import SimpleCss.Tricks

import Text.Blaze (Html)
import Control.Applicative

import Data.Char

-- generates litle blog-site in current directory
--
-- css.css  - css file
--
-- Home.html, Blog.html, About.html, Contact.html - pages

---------------------------------------------------
--
-- parameters

-- colors 

globalBkgCol = white -- cword "#b6ceff"
homeCol   = black --  cword "#1936ca"
blogCol   = blue -- cword "#4d67d8"
aboutCol  = red -- cword "#9db1ec"
contactCol = green -- cword "#e2f1fe"
menuTextCol = white 

-- borders

bttnBordWidth = px 25


----------------------------------------------------
-- pages

data Page = Home | Blog | About | Contact
        deriving (Show)

pageColor :: Page -> Expr
pageColor x = 
    case x of
        Home -> homeCol
        Blog -> blogCol
        About -> aboutCol
        Contact -> contactCol

pageLink :: Page -> String
pageLink = ( ++ ".html") . show 

titles = map show pages
pages  = [Home, Blog, About, Contact]

------------------------------------------------------
-- elements

-- menu

menus :: [Page] -> [Css Html]
menus = tabs vmenu <$> map (box . activeBttn) 
                   <*> map (box . passiveBttn) 
                   <*> map menuLinks 
    
menuLinks :: Page -> Css Html
menuLinks = a <$> pageLink <*> map toLower . show

activeBttn :: Page -> [Decl]
activeBttn x = border [left] C.solid bttnBordWidth (pageColor x) 
            ++ bttn (pageColor x) x

passiveBttn :: Page -> [Decl]
passiveBttn = bttn globalBkgCol

bttn :: Expr -> Page -> [Decl]
bttn col x = border [right] C.solid bttnBordWidth col 
          ++ padding sides (px 10)
          ++ brick menuTextCol (pageColor x)

-- header
        
pageHeader :: Page -> Css Html
pageHeader x = dot ([C.textAlign <:> C.center] 
            ++ (color $ pageColor x)) $ h1 $ show x

-- content

pageContent :: Page -> Css Html
pageContent x =
    case x of
        Home -> text 1000
        Blog -> vcat $ zipWith blogItem 
                    ["22 september", "13 september", "2 spetember", "26 august"] 
                    [500, 1000, 500, 150]
        About -> text 3000
        Contact -> text 10000

blogItem d n = vcat [st $ h3 d, text n]
        where st = dot $ (padding sides $ px 5 ) 
                      ++ (brick menuTextCol $ pageColor Blog)  

text :: Int -> Css Html
text n = dot (padding [bottom] (pct 5) 
            ++ margin sides (pct 5)) $ 
    p $ take n $ cycle "once upon a text "

-- footer

addFooter :: Expr -> Css a -> Css a -> Css a
addFooter h content footer = vcat [ stCont $ div' $ content, stFooter $ div' footer ]
    where stCont = dot (height (pct 100) ++ [C.minHeight <:> pct 100, C.position <:> C.relative]) 
          stFooter = dot (width (pct 100) ++ [C.position <:> C.absolute, C.bottom <:> int 0, C.height <:> h])


footer x = dot (
           borderNone sides 
        ++ margin sides (int 0) 
        ++ brick menuTextCol (pageColor x)
        ++ (padding sides $ px 10)) $ p "simple-css : example"


--------------------------------------------------------------------
-- putting it all together

htmls :: Css Html -> Page -> Css Html
htmls m p = vcat [
                footer p,
                dot ((margin sides $ int 0) ++ borderNone sides) $
                leftContent pct 20 m $ addBorder $ vcat [pageHeader p, pageContent p]]
    where addBorder = dot $ (margin [left] (px 20))

-------------------------------------------------------------------
-- global style sheets

bodyStyle = ruleSets [
    ident "body" $ (margin sides $ int 0) 
                ++ (borderNone sides) 
                ++  bkgColor globalBkgCol]

-------------------------------------------------------------------
-- printing

res = zipWith htmls (menus pages) pages

main = writeBlazeCss "css.css" bodyStyle $ zip (initHtmls titles) res