{-# LANGUAGE OverloadedStrings #-} ----------------------------------------------------------------------------- -- Copyright 2019, Ideas project team. This file is distributed under the -- terms of the Apache License 2.0. For more information, see the files -- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution. ----------------------------------------------------------------------------- -- | -- Maintainer : bastiaan.heeren@ou.nl -- Stability : provisional -- Portability : portable (depends on ghc) -- -- W3CSS templates for html pages -- ----------------------------------------------------------------------------- module Ideas.Text.HTML.Templates ( webpage, WebPage(..), Button(..), Style , fontAwesome ) where import Data.Monoid import Ideas.Text.HTML import Ideas.Text.HTML.W3CSS hiding (tag, ul, top, table, content) import Ideas.Text.XML hiding (content) import qualified Ideas.Text.HTML.W3CSS as W3 data WebPage = WebPage { title :: String , menuButtons :: [Button] , menuStyle :: Style , iconBarsStyle :: Style , sideWidth :: Int , sideHeader :: HTMLBuilder , sideButtons :: [Button] , sideStyle :: Style , iconCloseStyle :: Style , content :: HTMLBuilder , footer :: HTMLBuilder , footerStyle :: Style } type Style = HTMLBuilder -> HTMLBuilder data Button = Button { buttonUrl :: String , buttonStyle :: HTMLBuilder -> HTMLBuilder , buttonText :: HTMLBuilder } fromButtons :: [Button] -> HTMLBuilder fromButtons = mconcat . map fromButton fromButton :: Button -> HTMLBuilder fromButton b = button (buttonUrl b) $ barItem $ buttonStyle b $ buttonText b fontAwesome :: BuildXML a => String -> a fontAwesome s = italic $ ("class" .=. ("fa fa-" ++ s)) <> string " " -- https://www.w3schools.com/w3css/tryw3css_templates_webpage.htm webpage :: WebPage -> HTMLPage webpage wp = w3css $ addCSS "https://fonts.googleapis.com/css?family=Roboto" $ addCSS "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" $ addStyle styleText $ htmlPage (title wp) $ navBar <> sideBar <> overlayEffect <> mainContent <> script where navBar = tag "div" $ W3.top $ tag "div" $ bar $ W3.top $ leftAlign $ menuStyle wp $ mconcat [ if null (sideButtons wp) then mempty else button "javascript:void(0)" $ barItem $ right $ hideLarge $ iconBarsStyle wp $ ("onclick" .=. "w3_open()") <> fontAwesome "bars" , fromButtons (menuButtons wp) ] sideBar = if null (sideButtons wp) then mempty else tag "nav" $ sidebar $ barBlock $ collapse $ sideStyle wp $ mconcat [ "id" .=. "mySidebar" , link "javascript:void(0)" $ right $ padding Large $ iconCloseStyle wp $ hideLarge $ mconcat [ "onclick" .=. "w3_close()" , "title" .=. "Close Menu" , fontAwesome "remove" ] , sideHeader wp , fromButtons (sideButtons wp) ] overlayEffect = tag "div" $ overlay $ hideLarge $ mconcat [ "onclick" .=. "w3_close()" , "style" .=. "cursor:pointer" , "title" .=. "close side menu" , "id" .=. "myOverlay" , " " ] -- the javascript is not to be escaped script = tag "script" (string scriptText) width | null (sideButtons wp) = "0px" | otherwise = show (sideWidth wp) ++ "px" mainContent = tag "div" $ mainPage $ mconcat [ "style" .=. ("margin-left:" ++ width) , container $ vpadding XXXL $ content wp , tag "footer" $ mconcat [ "id" .=. "myFooter" , container $ footerStyle wp $ para $ footer wp ] ] styleText = "html,body,h1,h2,h3,h4,h5,h6 {font-family: Roboto, sans-serif;}\ \.w3-sidebar {\ \ z-index: 3;\ \ width: " ++ width ++ ";\ \ top: 43px;\ \ bottom: 0;\ \ height: inherit;\ \}" scriptText :: String scriptText = "var mySidebar = document.getElementById(\"mySidebar\");\ \var overlayBg = document.getElementById(\"myOverlay\");\ \function w3_open() {\ \ if (mySidebar.style.display === 'block') {\ \ mySidebar.style.display = 'none';\ \ overlayBg.style.display = 'none';\ \ } else {\ \ mySidebar.style.display = 'block';\ \ overlayBg.style.display = 'block';\ \ }\ \}\ \function w3_close() {\ \ mySidebar.style.display = 'none';\ \ overlayBg.style.display = 'none';\ \}"