summaryrefslogtreecommitdiff
path: root/Omni/App.hs
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2024-11-15 14:55:37 -0500
committerBen Sima <ben@bsima.me>2024-12-21 10:06:49 -0500
commit6513755670892983db88a6633b8c1ea6019c03d1 (patch)
tree44e9eccdb7a3a74ab7e96a8fee7572dd6a78dc73 /Omni/App.hs
parentae7b7e0186b5f2e0dcd4d5fac0a71fa264caedc2 (diff)
Re-namespace some stuff to Omni
I was getting confused about what is a product and what is internal infrastructure; I think it is good to keep those things separate. So I moved a bunch of stuff to an Omni namespace, actually most stuff went there. Only things that are explicitly external products are still in the Biz namespace.
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