summaryrefslogtreecommitdiff
path: root/Omni/App.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Omni/App.hs')
-rw-r--r--Omni/App.hs71
1 files changed, 71 insertions, 0 deletions
diff --git a/Omni/App.hs b/Omni/App.hs
new file mode 100644
index 0000000..38ce91b
--- /dev/null
+++ b/Omni/App.hs
@@ -0,0 +1,71 @@
+{-# 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