content: {-# LANGUAGE DeriveAnyClass #-}
  {-# LANGUAGE TemplateHaskell #-}
  {-# LANGUAGE UndecidableInstances #-}
  
  -- | A very simple site in three parts: route types, `main` and rendering implementation.
  module Ema.Example.Ex01_Basic where
  
  import Ema
  import Ema.Example.Common (tailwindLayout)
  import Ema.Route.Generic.TH
  import Text.Blaze.Html5 ((!))
  import Text.Blaze.Html5 qualified as H
  import Text.Blaze.Html5.Attributes qualified as A
  
  data Route
    = Route_Index
    | Route_About
    deriving stock (Show, Eq, Ord, Generic)
  
  deriveGeneric ''Route
  deriveIsRoute ''Route [t|'[]|]
  
  instance EmaSite Route where
    siteInput _ _ = pure $ pure ()
    siteOutput rp () r =
      pure . Ema.AssetGenerated Ema.Html $
        tailwindLayout (H.title "Basic site" >> H.base ! A.href "/") $
          H.div ! A.class_ "container mx-auto mt-8 p-2" $ do
            H.h1 ! A.class_ "text-3xl font-bold" $ "Basic site"
            case r of
              Route_Index -> do
                "You are on the index page. "
                routeElem Route_About "Go to About"
              Route_About -> do
                routeElem Route_Index "Go to Index"
                ". You are on the about page. "
      where
        routeElem r' w = do
          H.a ! A.class_ "text-red-500 hover:underline" ! routeHref r' $ w
        routeHref r' =
          A.href (fromString . toString $ Ema.routeUrl rp r')
  
  main :: IO ()
  main = void $ Ema.runSite @Route ()
  