{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} -- | General utils for apps module Biz.App ( CSS (..), Manifest (..), HtmlApp (..), ) where import Alpha import Data.Aeson (ToJSON) import qualified Data.Text.Lazy as Lazy import qualified Data.Text.Lazy.Encoding as Lazy import Network.HTTP.Media ( (//), (/:), ) import Servant.API (Accept (..), MimeRender (..)) newtype CSS = CSS { unCSS :: Text } instance Accept CSS where contentType _ = "text" // "css" /: ("charset", "utf-8") instance MimeRender CSS Text where mimeRender _ = Lazy.encodeUtf8 <. Lazy.fromStrict -- | The manifest describes your app for web app thumbnails, iPhone tiles, etc. data Manifest = Manifest { name :: Text, short_name :: Text, start_url :: Text, display :: Text, theme_color :: Text, description :: Text } deriving (Show, Eq, Generic) instance ToJSON Manifest -- | A wrapper for an HTML page. You need to provide an orphan -- 'Lucid.Base.ToHtml' instance in the Host module of your app. -- -- Ideally this would be captured in a Biz.App type, with overrides for head -- elements, and we would wouldn't have to make the same basic orphan instance -- for each app. newtype HtmlApp a = HtmlApp a deriving (Show, Eq)