{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} -- | General utils for apps module Omni.App ( Area (..), CSS (..), HasCss (..), Manifest (..), Html (..), ) where import Alpha import qualified Clay 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 (..)) import qualified System.Envy as Envy data Area = Test | Live deriving (Generic, Show) instance Envy.Var Area where toVar = show fromVar "Test" = Just Test fromVar "Live" = Just Live fromVar _ = Just Test 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 web module of your app. -- -- Ideally this would be captured in a Omni.App type, with overrides for head -- elements, and we would wouldn't have to make the same basic orphan instance -- for each app. newtype Html a = Html a deriving (Show, Eq) -- | Class for attaching some CSS to a page specifically. class HasCss a where cssFor :: a -> Clay.Css