{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeApplications #-}
-- | Use Tailwind CSS with blaze-html? Try this module for rapid prototyping of
-- websites in Ema.
module Ema.Helper.Tailwind
( -- * Main functions
layout,
layoutWith,
-- * Tailwind shims
twindShimCdn,
twindShimOfficial,
twindShimUnofficial,
)
where
import qualified Ema.CLI
import NeatInterpolation (text)
import qualified Text.Blaze.Html.Renderer.Utf8 as RU
import Text.Blaze.Html5 ((!))
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
-- | A simple and off-the-shelf layout using Tailwind CSS
layout :: Ema.CLI.Action -> H.Html -> H.Html -> LByteString
layout action =
layoutWith "en" "UTF-8" $ case action of
Ema.CLI.Generate _ ->
twindShimUnofficial
_ ->
-- Twind shim doesn't reliably work in dev server mode. Let's just use the
-- tailwind CDN.
twindShimCdn
-- | Like @layout@, but pick your own language, encoding and tailwind shim.
layoutWith :: H.AttributeValue -> H.AttributeValue -> H.Html -> H.Html -> H.Html -> LByteString
layoutWith lang encoding twindShim appHead appBody = RU.renderHtml $ do
H.docType
H.html ! A.lang lang $ do
H.head $ do
H.meta ! A.charset encoding
-- This makes the site mobile friendly by default.
H.meta ! A.name "viewport" ! A.content "width=device-width, initial-scale=1"
appHead
twindShim
H.body $ do
appBody
-- | Loads full tailwind CSS from CDN (not good for production)
twindShimCdn :: H.Html
twindShimCdn =
H.unsafeByteString . encodeUtf8 $
[text|
|]
-- | This shim may not work with hot reload.
twindShimOfficial :: H.Html
twindShimOfficial =
H.unsafeByteString . encodeUtf8 $
[text|
|]
-- | This shim does work with hot reload, but it spams console with warnings.
twindShimUnofficial :: H.Html
twindShimUnofficial = do
H.script
! A.type_ "text/javascript"
! A.src "https://cdn.jsdelivr.net/combine/npm/twind/twind.umd.min.js,npm/twind/observe/observe.umd.min.js"
$ ""
H.script ! A.type_ "text/javascript" $ twindShimUnofficialEval
where
twindShimUnofficialEval :: H.Html
twindShimUnofficialEval =
H.unsafeByteString . encodeUtf8 $
[text|
twind.setup({})
twindObserve.observe(document.documentElement)
|]