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 - style sheets -- -- Home.html, Blog.html, About.html, Contact.html - pages --------------------------------------------------- -- -- parameters -- colors menuCol = cword "#4370b5" menuBorderCol = cword "#3c5b88" globalBkgCol = cword "#b7cff3" homeCol = menuCol blogCol = menuCol aboutCol = menuCol contactCol = menuCol menuTextCol = white -- borders bttnBorderWidth = 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 . (uncurry activeBttn) ) <*> map (box . (uncurry passiveBttn) ) <*> map (menuLinks . snd)) . zip rads -- different border-radius values for menu rads = [(20, 0), (0, 0), (0, 0), (0, 20)] menuLinks :: Page -> Css Html menuLinks = a <$> pageLink <*> map toLower . show activeBttn :: (Int, Int) -> Page -> [Decl] activeBttn r x = padding [left] bttnBorderWidth ++ bttn r (pageColor x) x passiveBttn :: (Int, Int) -> Page -> [Decl] passiveBttn r = bttn r globalBkgCol bttn :: (Int, Int) -> Expr -> Page -> [Decl] bttn (tr, br) col x = border [top, bottom, right] C.solid (px 1) menuBorderCol ++ border [left] C.solid (px 5) menuCol ++ margin [bottom] (px 3) ++ margin [right] (px 40) ++ padding [top, bottom] (px 10) ++ borderRadius [int 0, px tr, px br, int 0] ++ brick menuTextCol (pageColor x) -- header pageHeader :: Page -> Css Html pageHeader x = dot ([C.textAlign <:> C.center] ++ (color menuBorderCol)) $ 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 $ borderRadius [px 5, int 0, int 0, px 5] ++ (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 (menuBorderCol) ++ (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 (dot (margin [top] $ px 25) 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