module Data.CSS.Build
(
onAll,
onMedia,
select,
below,
local,
($=),
important,
inherit,
setProp,
importFrom,
importUrl
)
where
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as Bc
import qualified Data.Map as M
import qualified Data.Set as S
import Control.Applicative
import Control.Lens
import Control.Monad.Reader
import Control.Monad.Writer.Class
import Data.CSS.Types
import Data.Set (Set)
import Data.Text (Text)
import Web.Routes.RouteT
($=) ::
(ToPropValue a)
=> PropName
-> a
-> SetProp
prop $= val = do
BuildCfg mt sel <- ask
tell (CSS M.empty (M.singleton mt [Property sel prop (toPropValue val) False]))
infix 2 $=
below :: (MonadWriter CSS m) => [Selector] -> m a -> m a
below sels =
censoring (cssProps . mapped . mapped . propSelector)
(liftA2 (\(Selector sel) (Selector sel') ->
Selector $ B.append (Bc.snoc sel' ' ') sel)
sels)
important :: (MonadWriter CSS m) => m a -> m a
important =
censoring (cssProps . mapped . mapped . propImportant)
(const True)
importFrom :: (MonadWriter CSS m) => MediaType -> Text -> m ()
importFrom mt url = tell (CSS (M.singleton url (S.singleton mt)) M.empty)
importUrl ::
(MonadRoute m, MonadWriter CSS m)
=> MediaType
-> URL m
-> m ()
importUrl mt = showURL >=> importFrom mt
inherit :: (MonadReader BuildCfg m, MonadWriter CSS m) => PropName -> m ()
inherit = ($= PropValue "inherit")
onAll :: (Monad m) => ReaderT (Set MediaType) m a -> m a
onAll = onMedia [MediaType "all"]
onMedia :: (Monad m) => [MediaType] -> ReaderT (Set MediaType) m a -> m a
onMedia = flip runReaderT . S.fromList
select ::
(Monad m)
=> [Selector]
-> ReaderT BuildCfg m a
-> ReaderT (Set MediaType) m a
select sel (ReaderT c) = ReaderT $ \mt -> c (BuildCfg mt sel)
setProp ::
(ToPropValue a)
=> PropName
-> a
-> SetProp
setProp = ($=)