neuron-0.4.0.0: src/app/Main.hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Main where
import Clay hiding (s, style, type_)
import qualified Clay as C
import Development.Shake
import Lucid
import Main.Utf8
import Neuron.CLI (run)
import Neuron.Config (Config)
import qualified Neuron.Config as Config
import Neuron.Web.Generate (generateSite)
import Neuron.Web.Route (Route (..))
import Neuron.Web.View (renderRouteBody, renderRouteHead, style)
import Relude
import qualified Rib
import Rib.Extra.CSS (googleFonts, stylesheet)
main :: IO ()
main = withUtf8 $ run generateMainSite
generateMainSite :: Action ()
generateMainSite = do
Rib.buildStaticFiles ["static/**"]
config <- Config.getConfig
let writeHtmlRoute :: Route g a -> (g, a) -> Action ()
writeHtmlRoute r = Rib.writeRoute r . Lucid.renderText . renderPage config r
void $ generateSite config writeHtmlRoute
renderPage :: Config -> Route g a -> (g, a) -> Html ()
renderPage config r val = html_ [lang_ "en"] $ do
head_ $ do
renderRouteHead config r val
case r of
Route_Redirect _ ->
mempty
_ -> do
stylesheet "https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css"
stylesheet "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css"
style_ [type_ "text/css"] $ C.renderWith C.compact [] $ mainStyle config
googleFonts [headerFont, bodyFont, monoFont]
when (Config.mathJaxSupport config) $
with (script_ mempty) [id_ "MathJax-script", src_ "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js", async_ ""]
body_
$ div_ [class_ "ui text container", id_ "thesite"]
$ renderRouteBody config r val
headerFont :: Text
headerFont = "Oswald"
bodyFont :: Text
bodyFont = "Open Sans"
monoFont :: Text
monoFont = "Roboto Mono"
mainStyle :: Config -> Css
mainStyle cfg = "div#thesite" ? do
C.fontFamily [bodyFont] [C.serif]
C.paddingTop $ em 1
C.paddingBottom $ em 1
"p" ? do
C.lineHeight $ pct 150
"h1, h2, h3, h4, h5, h6, .ui.header" ? do
C.fontFamily [headerFont] [C.sansSerif]
"img" ? do
C.maxWidth $ pct 100 -- Prevents large images from overflowing beyond zettel borders
style cfg