{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# OPTIONS_GHC -fno-warn-redundant-constraints #-} module Shpadoinkle.Disembodied.Sample where import Data.Text (Text) import Servant.API import Shpadoinkle (Html, JSM, MonadJSM, text) import Shpadoinkle.Disembodied (Disembodied (SiteSpec), writeSite) import Shpadoinkle.Html (button, h1_, onClick) import Shpadoinkle.Router (View) type Pages m = "about" :> View m Int :<|> View m () newtype Context = Context { siteName :: Text } about :: MonadJSM m => Context -> Html m Int about ctx = h1_ [ text $ "about us at " <> siteName ctx , button [ onClick (+ 1) ] [ "Increment" ] ] home :: Html m a home = h1_ [ "home" ] site :: MonadJSM m => SiteSpec Context (Pages m) site = about :<|> const home makeSite :: IO () makeSite = writeSite @(Pages JSM) "" (Context "Sample") site