{-# LANGUAGE AllowAmbiguousTypes #-}

module Web.Hyperbole.View.Tag where

import Control.Monad (forM_)
import Data.ByteString (ByteString)
import Data.String.Conversions (cs)
import Data.Text (Text, pack)
import Data.Text qualified as T
import Effectful
import Effectful.State.Static.Local
import Web.Atomic.CSS
import Web.Atomic.Types
import Web.Hyperbole.Data.URI
import Web.Hyperbole.View.Types


el :: View c () -> View c ()
el :: forall c. View c () -> View c ()
el = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"div"


row :: View c () -> View c ()
row :: forall c. View c () -> View c ()
row = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"div" (View c () -> View c ())
-> (CSS (View c () -> View c ()) -> CSS (View c () -> View c ()))
-> View c ()
-> View c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (View c () -> View c ()) -> CSS (View c () -> View c ())
forall h. Styleable h => CSS h -> CSS h
flexRow


col :: View c () -> View c ()
col :: forall c. View c () -> View c ()
col = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"div" (View c () -> View c ())
-> (CSS (View c () -> View c ()) -> CSS (View c () -> View c ()))
-> View c ()
-> View c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (View c () -> View c ()) -> CSS (View c () -> View c ())
forall h. Styleable h => CSS h -> CSS h
flexCol


space :: View c ()
space :: forall c. View c ()
space = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"div" View c ()
forall c. View c ()
none View c () -> (CSS (View c ()) -> CSS (View c ())) -> View c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (View c ()) -> CSS (View c ())
forall h. Styleable h => CSS h -> CSS h
grow


pre :: Text -> View c ()
pre :: forall c. Text -> View c ()
pre Text
t = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"pre" (Text -> View c ()
forall c. Text -> View c ()
text Text
t)


code :: Text -> View c ()
code :: forall c. Text -> View c ()
code Text
t = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"code" (Text -> View c ()
forall c. Text -> View c ()
text Text
t)


-- | A hyperlink to the given url
link :: URI -> View c () -> View c ()
link :: forall c. URI -> View c () -> View c ()
link URI
u = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"a" (View c () -> View c ())
-> (Attributes (View c () -> View c ())
    -> Attributes (View c () -> View c ()))
-> View c ()
-> View c ()
forall h.
Attributable h =>
h -> (Attributes h -> Attributes h) -> h
@ Text
-> Text
-> Attributes (View c () -> View c ())
-> Attributes (View c () -> View c ())
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"href" (URI -> Text
uriToText URI
u)


img :: Text -> View c ()
img :: forall c. Text -> View c ()
img Text
sc = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"img" (View c () -> View c ())
-> (Attributes (View c () -> View c ())
    -> Attributes (View c () -> View c ()))
-> View c ()
-> View c ()
forall h.
Attributable h =>
h -> (Attributes h -> Attributes h) -> h
@ Text
-> Attributes (View c () -> View c ())
-> Attributes (View c () -> View c ())
forall h. Attributable h => Text -> Attributes h -> Attributes h
src Text
sc (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ View c ()
forall c. View c ()
none


-- * Inputs


-- basic forms. See Web.Hyperbole.View.Forms
form :: View c () -> View c ()
form :: forall c. View c () -> View c ()
form = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"form"


input :: View c ()
input :: forall c. View c ()
input = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"input" (View c () -> View c ())
-> (Attributes (View c () -> View c ())
    -> Attributes (View c () -> View c ()))
-> View c ()
-> View c ()
forall h.
Attributable h =>
h -> (Attributes h -> Attributes h) -> h
@ Text
-> Text
-> Attributes (View c () -> View c ())
-> Attributes (View c () -> View c ())
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"type" Text
"text" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ View c ()
forall c. View c ()
none


name :: (Attributable h) => Text -> Attributes h -> Attributes h
name :: forall h. Attributable h => Text -> Attributes h -> Attributes h
name = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"name"


value :: (Attributable h) => Text -> Attributes h -> Attributes h
value :: forall h. Attributable h => Text -> Attributes h -> Attributes h
value = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"value"


label :: View c () -> View c ()
label :: forall c. View c () -> View c ()
label = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"label"


placeholder :: (Attributable h) => Text -> Attributes h -> Attributes h
placeholder :: forall h. Attributable h => Text -> Attributes h -> Attributes h
placeholder = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"placeholder"


autofocus :: (Attributable h) => Attributes h -> Attributes h
autofocus :: forall h. Attributable h => Attributes h -> Attributes h
autofocus = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"autofocus" Text
""


-- * Document Metadata


-- html :: View c () -> View c ()
-- html = tag "html"

-- head :: View c () -> View c ()
-- head = tag "head"

-- body :: View c () -> View c ()
-- body = tag "body"

meta :: View c ()
meta :: forall c. View c ()
meta = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"meta" View c ()
forall c. View c ()
none


title :: Text -> View c ()
title :: forall c. Text -> View c ()
title = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"title" (View c () -> View c ())
-> (Text -> View c ()) -> Text -> View c ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> View c ()
forall c. Text -> View c ()
text


content :: (Attributable h) => Text -> Attributes h -> Attributes h
content :: forall h. Attributable h => Text -> Attributes h -> Attributes h
content = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"content"


httpEquiv :: (Attributable h) => Text -> Attributes h -> Attributes h
httpEquiv :: forall h. Attributable h => Text -> Attributes h -> Attributes h
httpEquiv = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"httpEquiv"


charset :: (Attributable h) => Text -> Attributes h -> Attributes h
charset :: forall h. Attributable h => Text -> Attributes h -> Attributes h
charset = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"charset"


type_ :: (Attributable h) => Text -> Attributes h -> Attributes h
type_ :: forall h. Attributable h => Text -> Attributes h -> Attributes h
type_ = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"type"


src :: (Attributable h) => Text -> Attributes h -> Attributes h
src :: forall h. Attributable h => Text -> Attributes h -> Attributes h
src = Text -> Text -> Attributes h -> Attributes h
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"src"


script :: Text -> View c ()
script :: forall c. Text -> View c ()
script Text
sc = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"script" View c ()
forall c. View c ()
none View c ()
-> (Attributes (View c ()) -> Attributes (View c ())) -> View c ()
forall h.
Attributable h =>
h -> (Attributes h -> Attributes h) -> h
@ Text -> Attributes (View c ()) -> Attributes (View c ())
forall h. Attributable h => Text -> Attributes h -> Attributes h
src Text
sc


-- | Embed raw script, escape '</script>'
script' :: ByteString -> View c ()
script' :: forall c. ByteString -> View c ()
script' ByteString
dat = Bool -> Text -> View c () -> View c ()
forall c. Bool -> Text -> View c () -> View c ()
tag' Bool
True Text
"script" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ Text -> View c ()
forall c. Text -> View c ()
raw (Text -> View c ()) -> Text -> View c ()
forall a b. (a -> b) -> a -> b
$ HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"</" Text
"\\u003C/" (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
forall a b. ConvertibleStrings a b => a -> b
cs ByteString
dat


style :: ByteString -> View c ()
style :: forall c. ByteString -> View c ()
style ByteString
cnt = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"style" (Text -> View c ()
forall c. Text -> View c ()
raw (Text -> View c ()) -> Text -> View c ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
forall a b. ConvertibleStrings a b => a -> b
cs ByteString
cnt) View c ()
-> (Attributes (View c ()) -> Attributes (View c ())) -> View c ()
forall h.
Attributable h =>
h -> (Attributes h -> Attributes h) -> h
@ Text -> Attributes (View c ()) -> Attributes (View c ())
forall h. Attributable h => Text -> Attributes h -> Attributes h
type_ Text
"text/css"


stylesheet :: Text -> View c ()
stylesheet :: forall c. Text -> View c ()
stylesheet Text
href = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"link" (View c () -> View c ())
-> (Attributes (View c () -> View c ())
    -> Attributes (View c () -> View c ()))
-> View c ()
-> View c ()
forall h.
Attributable h =>
h -> (Attributes h -> Attributes h) -> h
@ Text
-> Text
-> Attributes (View c () -> View c ())
-> Attributes (View c () -> View c ())
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"rel" Text
"stylesheet" (Attributes (View c () -> View c ())
 -> Attributes (View c () -> View c ()))
-> (Attributes (View c () -> View c ())
    -> Attributes (View c () -> View c ()))
-> Attributes (View c () -> View c ())
-> Attributes (View c () -> View c ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text
-> Text
-> Attributes (View c () -> View c ())
-> Attributes (View c () -> View c ())
forall h.
Attributable h =>
Text -> Text -> Attributes h -> Attributes h
att Text
"href" Text
href (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ View c ()
forall c. View c ()
none


-- * Navigation


nav :: View c () -> View c ()
nav :: forall c. View c () -> View c ()
nav = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"nav"


-- * Tables


{- | Create a type safe data table by specifying columns

> data User = User {name :: Text, email :: Text}
>
> usersTable :: [User] -> View c ()
> usersTable us = do
>   table us $ do
>     tcol (th "Name" ~ hd) $ \u -> td ~ cell $ text u.name
>     tcol (th "Email" ~ hd) $ \u -> td ~ cell $ text u.email
>  where
>   hd = cell . bold
>   cell :: (Styleable h) => CSS h -> CSS h
>   cell = pad 4 . border 1
-}
table :: [dt] -> TableColumns c dt () -> View c ()
table :: forall dt c. [dt] -> TableColumns c dt () -> View c ()
table [dt]
dts (TableColumns Eff '[State [TableColumn c dt]] ()
wcs) = do
  let cols :: [TableColumn c dt]
cols = Eff '[] [TableColumn c dt] -> [TableColumn c dt]
forall a. HasCallStack => Eff '[] a -> a
runPureEff (Eff '[] [TableColumn c dt] -> [TableColumn c dt])
-> (Eff '[State [TableColumn c dt]] ()
    -> Eff '[] [TableColumn c dt])
-> Eff '[State [TableColumn c dt]] ()
-> [TableColumn c dt]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [TableColumn c dt]
-> Eff '[State [TableColumn c dt]] () -> Eff '[] [TableColumn c dt]
forall s (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
s -> Eff (State s : es) a -> Eff es s
execState [] (Eff '[State [TableColumn c dt]] () -> [TableColumn c dt])
-> Eff '[State [TableColumn c dt]] () -> [TableColumn c dt]
forall a b. (a -> b) -> a -> b
$ Eff '[State [TableColumn c dt]] ()
wcs
  Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"table" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ do
    Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"thead" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ do
      Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"tr" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ do
        [TableColumn c dt] -> (TableColumn c dt -> View c ()) -> View c ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [TableColumn c dt]
cols ((TableColumn c dt -> View c ()) -> View c ())
-> (TableColumn c dt -> View c ()) -> View c ()
forall a b. (a -> b) -> a -> b
$ \TableColumn c dt
tc -> do
          let TableHead View c ()
hd = TableColumn c dt
tc.headCell
          View c ()
hd
    Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"tbody" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ do
      [dt] -> (dt -> View c ()) -> View c ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [dt]
dts ((dt -> View c ()) -> View c ()) -> (dt -> View c ()) -> View c ()
forall a b. (a -> b) -> a -> b
$ \dt
dt -> do
        Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"tr" (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ do
          [TableColumn c dt] -> (TableColumn c dt -> View c ()) -> View c ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [TableColumn c dt]
cols ((TableColumn c dt -> View c ()) -> View c ())
-> (TableColumn c dt -> View c ()) -> View c ()
forall a b. (a -> b) -> a -> b
$ \TableColumn c dt
tc -> do
            TableColumn c dt
tc.dataCell dt
dt


usersTable :: View c ()
usersTable :: forall c. View c ()
usersTable = do
  [(Int, Text)] -> TableColumns c (Int, Text) () -> View c ()
forall dt c. [dt] -> TableColumns c dt () -> View c ()
table [(Int, Text)]
items (TableColumns c (Int, Text) () -> View c ())
-> TableColumns c (Int, Text) () -> View c ()
forall a b. (a -> b) -> a -> b
$ do
    TableHead c ()
-> ((Int, Text) -> View c ()) -> TableColumns c (Int, Text) ()
forall dt c.
TableHead c () -> (dt -> View c ()) -> TableColumns c dt ()
tcol (View c () -> TableHead c ()
forall c. View c () -> TableHead c ()
th View c ()
"Index" TableHead c ()
-> (CSS (TableHead c ()) -> CSS (TableHead c ())) -> TableHead c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (TableHead c ()) -> CSS (TableHead c ())
forall h. Styleable h => CSS h -> CSS h
bold) (((Int, Text) -> View c ()) -> TableColumns c (Int, Text) ())
-> ((Int, Text) -> View c ()) -> TableColumns c (Int, Text) ()
forall a b. (a -> b) -> a -> b
$ \(Int, Text)
u -> View c () -> View c ()
forall c. View c () -> View c ()
td (View c () -> View c ())
-> (CSS (View c () -> View c ()) -> CSS (View c () -> View c ()))
-> View c ()
-> View c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (View c () -> View c ()) -> CSS (View c () -> View c ())
forall h. Styleable h => CSS h -> CSS h
cell (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ Text -> View c ()
forall c. Text -> View c ()
text (Text -> View c ()) -> Text -> View c ()
forall a b. (a -> b) -> a -> b
$ String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ (Int, Text) -> Int
forall a b. (a, b) -> a
fst (Int, Text)
u
    TableHead c ()
-> ((Int, Text) -> View c ()) -> TableColumns c (Int, Text) ()
forall dt c.
TableHead c () -> (dt -> View c ()) -> TableColumns c dt ()
tcol (View c () -> TableHead c ()
forall c. View c () -> TableHead c ()
th View c ()
"Item" TableHead c ()
-> (CSS (TableHead c ()) -> CSS (TableHead c ())) -> TableHead c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (TableHead c ()) -> CSS (TableHead c ())
forall h. Styleable h => CSS h -> CSS h
bold) (((Int, Text) -> View c ()) -> TableColumns c (Int, Text) ())
-> ((Int, Text) -> View c ()) -> TableColumns c (Int, Text) ()
forall a b. (a -> b) -> a -> b
$ \(Int, Text)
u -> View c () -> View c ()
forall c. View c () -> View c ()
td (View c () -> View c ())
-> (CSS (View c () -> View c ()) -> CSS (View c () -> View c ()))
-> View c ()
-> View c ()
forall h. Styleable h => h -> (CSS h -> CSS h) -> h
~ CSS (View c () -> View c ()) -> CSS (View c () -> View c ())
forall h. Styleable h => CSS h -> CSS h
cell (View c () -> View c ()) -> View c () -> View c ()
forall a b. (a -> b) -> a -> b
$ Text -> View c ()
forall c. Text -> View c ()
text (Text -> View c ()) -> Text -> View c ()
forall a b. (a -> b) -> a -> b
$ (Int, Text) -> Text
forall a b. (a, b) -> b
snd (Int, Text)
u
 where
  items :: [(Int, Text)]
  items :: [(Int, Text)]
items = [Int] -> [Text] -> [(Int, Text)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0 ..] [Text
"one", Text
"two", Text
"three"]
  cell :: (Styleable h) => CSS h -> CSS h
  cell :: forall h. Styleable h => CSS h -> CSS h
cell = Sides Length -> CSS h -> CSS h
forall h. Styleable h => Sides Length -> CSS h -> CSS h
pad Sides Length
4 (CSS h -> CSS h) -> (CSS h -> CSS h) -> CSS h -> CSS h
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sides PxRem -> CSS h -> CSS h
forall h. Styleable h => Sides PxRem -> CSS h -> CSS h
border Sides PxRem
1


newtype Table c a = Table (View c a)
  deriving newtype ((forall a b. (a -> b) -> Table c a -> Table c b)
-> (forall a b. a -> Table c b -> Table c a) -> Functor (Table c)
forall a b. a -> Table c b -> Table c a
forall a b. (a -> b) -> Table c a -> Table c b
forall c a b. a -> Table c b -> Table c a
forall c a b. (a -> b) -> Table c a -> Table c b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall c a b. (a -> b) -> Table c a -> Table c b
fmap :: forall a b. (a -> b) -> Table c a -> Table c b
$c<$ :: forall c a b. a -> Table c b -> Table c a
<$ :: forall a b. a -> Table c b -> Table c a
Functor, Functor (Table c)
Functor (Table c) =>
(forall a. a -> Table c a)
-> (forall a b. Table c (a -> b) -> Table c a -> Table c b)
-> (forall a b c.
    (a -> b -> c) -> Table c a -> Table c b -> Table c c)
-> (forall a b. Table c a -> Table c b -> Table c b)
-> (forall a b. Table c a -> Table c b -> Table c a)
-> Applicative (Table c)
forall c. Functor (Table c)
forall a. a -> Table c a
forall c a. a -> Table c a
forall a b. Table c a -> Table c b -> Table c a
forall a b. Table c a -> Table c b -> Table c b
forall a b. Table c (a -> b) -> Table c a -> Table c b
forall c a b. Table c a -> Table c b -> Table c a
forall c a b. Table c a -> Table c b -> Table c b
forall c a b. Table c (a -> b) -> Table c a -> Table c b
forall a b c. (a -> b -> c) -> Table c a -> Table c b -> Table c c
forall c a b c.
(a -> b -> c) -> Table c a -> Table c b -> Table c c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall c a. a -> Table c a
pure :: forall a. a -> Table c a
$c<*> :: forall c a b. Table c (a -> b) -> Table c a -> Table c b
<*> :: forall a b. Table c (a -> b) -> Table c a -> Table c b
$cliftA2 :: forall c a b c.
(a -> b -> c) -> Table c a -> Table c b -> Table c c
liftA2 :: forall a b c. (a -> b -> c) -> Table c a -> Table c b -> Table c c
$c*> :: forall c a b. Table c a -> Table c b -> Table c b
*> :: forall a b. Table c a -> Table c b -> Table c b
$c<* :: forall c a b. Table c a -> Table c b -> Table c a
<* :: forall a b. Table c a -> Table c b -> Table c a
Applicative, Applicative (Table c)
Applicative (Table c) =>
(forall a b. Table c a -> (a -> Table c b) -> Table c b)
-> (forall a b. Table c a -> Table c b -> Table c b)
-> (forall a. a -> Table c a)
-> Monad (Table c)
forall c. Applicative (Table c)
forall a. a -> Table c a
forall c a. a -> Table c a
forall a b. Table c a -> Table c b -> Table c b
forall a b. Table c a -> (a -> Table c b) -> Table c b
forall c a b. Table c a -> Table c b -> Table c b
forall c a b. Table c a -> (a -> Table c b) -> Table c b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall c a b. Table c a -> (a -> Table c b) -> Table c b
>>= :: forall a b. Table c a -> (a -> Table c b) -> Table c b
$c>> :: forall c a b. Table c a -> Table c b -> Table c b
>> :: forall a b. Table c a -> Table c b -> Table c b
$creturn :: forall c a. a -> Table c a
return :: forall a. a -> Table c a
Monad, Table c a -> (CSS (Table c a) -> CSS (Table c a)) -> Table c a
([Rule] -> [Rule]) -> Table c a -> Table c a
(Table c a -> (CSS (Table c a) -> CSS (Table c a)) -> Table c a)
-> (([Rule] -> [Rule]) -> Table c a -> Table c a)
-> Styleable (Table c a)
forall h.
(h -> (CSS h -> CSS h) -> h)
-> (([Rule] -> [Rule]) -> h -> h) -> Styleable h
forall c a.
Table c a -> (CSS (Table c a) -> CSS (Table c a)) -> Table c a
forall c a. ([Rule] -> [Rule]) -> Table c a -> Table c a
$c~ :: forall c a.
Table c a -> (CSS (Table c a) -> CSS (Table c a)) -> Table c a
~ :: Table c a -> (CSS (Table c a) -> CSS (Table c a)) -> Table c a
$cmodCSS :: forall c a. ([Rule] -> [Rule]) -> Table c a -> Table c a
modCSS :: ([Rule] -> [Rule]) -> Table c a -> Table c a
Styleable)


tcol :: forall dt c. TableHead c () -> (dt -> View c ()) -> TableColumns c dt ()
tcol :: forall dt c.
TableHead c () -> (dt -> View c ()) -> TableColumns c dt ()
tcol TableHead c ()
hd dt -> View c ()
cell = Eff '[State [TableColumn c dt]] () -> TableColumns c dt ()
forall c dt a.
Eff '[State [TableColumn c dt]] a -> TableColumns c dt a
TableColumns (Eff '[State [TableColumn c dt]] () -> TableColumns c dt ())
-> Eff '[State [TableColumn c dt]] () -> TableColumns c dt ()
forall a b. (a -> b) -> a -> b
$ do
  forall s (es :: [(* -> *) -> * -> *]).
(HasCallStack, State s :> es) =>
(s -> s) -> Eff es ()
modify @[TableColumn c dt] (([TableColumn c dt] -> [TableColumn c dt])
 -> Eff '[State [TableColumn c dt]] ())
-> ([TableColumn c dt] -> [TableColumn c dt])
-> Eff '[State [TableColumn c dt]] ()
forall a b. (a -> b) -> a -> b
$ \[TableColumn c dt]
cols -> [TableColumn c dt]
cols [TableColumn c dt] -> [TableColumn c dt] -> [TableColumn c dt]
forall a. Semigroup a => a -> a -> a
<> [TableHead c () -> (dt -> View c ()) -> TableColumn c dt
forall c dt.
TableHead c () -> (dt -> View c ()) -> TableColumn c dt
TableColumn TableHead c ()
hd dt -> View c ()
cell]


th :: View c () -> TableHead c ()
th :: forall c. View c () -> TableHead c ()
th View c ()
cnt = do
  View c () -> TableHead c ()
forall id a. View id a -> TableHead id a
TableHead (View c () -> TableHead c ()) -> View c () -> TableHead c ()
forall a b. (a -> b) -> a -> b
$ Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"th" View c ()
cnt


td :: View c () -> View c ()
td :: forall c. View c () -> View c ()
td = Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"td"


instance {-# OVERLAPS #-} Styleable (TableColumns c dt () -> View c ()) where
  modCSS :: ([Rule] -> [Rule])
-> (TableColumns c dt () -> View c ())
-> TableColumns c dt ()
-> View c ()
modCSS [Rule] -> [Rule]
frr TableColumns c dt () -> View c ()
parent TableColumns c dt ()
eff = ([Rule] -> [Rule]) -> View c () -> View c ()
forall h. Styleable h => ([Rule] -> [Rule]) -> h -> h
modCSS [Rule] -> [Rule]
frr (TableColumns c dt () -> View c ()
parent TableColumns c dt ()
eff)


newtype TableHead id a = TableHead (View id a)
  deriving newtype ((forall a b. (a -> b) -> TableHead id a -> TableHead id b)
-> (forall a b. a -> TableHead id b -> TableHead id a)
-> Functor (TableHead id)
forall a b. a -> TableHead id b -> TableHead id a
forall a b. (a -> b) -> TableHead id a -> TableHead id b
forall id a b. a -> TableHead id b -> TableHead id a
forall id a b. (a -> b) -> TableHead id a -> TableHead id b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall id a b. (a -> b) -> TableHead id a -> TableHead id b
fmap :: forall a b. (a -> b) -> TableHead id a -> TableHead id b
$c<$ :: forall id a b. a -> TableHead id b -> TableHead id a
<$ :: forall a b. a -> TableHead id b -> TableHead id a
Functor, Functor (TableHead id)
Functor (TableHead id) =>
(forall a. a -> TableHead id a)
-> (forall a b.
    TableHead id (a -> b) -> TableHead id a -> TableHead id b)
-> (forall a b c.
    (a -> b -> c)
    -> TableHead id a -> TableHead id b -> TableHead id c)
-> (forall a b. TableHead id a -> TableHead id b -> TableHead id b)
-> (forall a b. TableHead id a -> TableHead id b -> TableHead id a)
-> Applicative (TableHead id)
forall id. Functor (TableHead id)
forall a. a -> TableHead id a
forall id a. a -> TableHead id a
forall a b. TableHead id a -> TableHead id b -> TableHead id a
forall a b. TableHead id a -> TableHead id b -> TableHead id b
forall a b.
TableHead id (a -> b) -> TableHead id a -> TableHead id b
forall id a b. TableHead id a -> TableHead id b -> TableHead id a
forall id a b. TableHead id a -> TableHead id b -> TableHead id b
forall id a b.
TableHead id (a -> b) -> TableHead id a -> TableHead id b
forall a b c.
(a -> b -> c) -> TableHead id a -> TableHead id b -> TableHead id c
forall id a b c.
(a -> b -> c) -> TableHead id a -> TableHead id b -> TableHead id c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall id a. a -> TableHead id a
pure :: forall a. a -> TableHead id a
$c<*> :: forall id a b.
TableHead id (a -> b) -> TableHead id a -> TableHead id b
<*> :: forall a b.
TableHead id (a -> b) -> TableHead id a -> TableHead id b
$cliftA2 :: forall id a b c.
(a -> b -> c) -> TableHead id a -> TableHead id b -> TableHead id c
liftA2 :: forall a b c.
(a -> b -> c) -> TableHead id a -> TableHead id b -> TableHead id c
$c*> :: forall id a b. TableHead id a -> TableHead id b -> TableHead id b
*> :: forall a b. TableHead id a -> TableHead id b -> TableHead id b
$c<* :: forall id a b. TableHead id a -> TableHead id b -> TableHead id a
<* :: forall a b. TableHead id a -> TableHead id b -> TableHead id a
Applicative, Applicative (TableHead id)
Applicative (TableHead id) =>
(forall a b.
 TableHead id a -> (a -> TableHead id b) -> TableHead id b)
-> (forall a b. TableHead id a -> TableHead id b -> TableHead id b)
-> (forall a. a -> TableHead id a)
-> Monad (TableHead id)
forall id. Applicative (TableHead id)
forall a. a -> TableHead id a
forall id a. a -> TableHead id a
forall a b. TableHead id a -> TableHead id b -> TableHead id b
forall a b.
TableHead id a -> (a -> TableHead id b) -> TableHead id b
forall id a b. TableHead id a -> TableHead id b -> TableHead id b
forall id a b.
TableHead id a -> (a -> TableHead id b) -> TableHead id b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall id a b.
TableHead id a -> (a -> TableHead id b) -> TableHead id b
>>= :: forall a b.
TableHead id a -> (a -> TableHead id b) -> TableHead id b
$c>> :: forall id a b. TableHead id a -> TableHead id b -> TableHead id b
>> :: forall a b. TableHead id a -> TableHead id b -> TableHead id b
$creturn :: forall id a. a -> TableHead id a
return :: forall a. a -> TableHead id a
Monad, TableHead id a
-> (CSS (TableHead id a) -> CSS (TableHead id a)) -> TableHead id a
([Rule] -> [Rule]) -> TableHead id a -> TableHead id a
(TableHead id a
 -> (CSS (TableHead id a) -> CSS (TableHead id a))
 -> TableHead id a)
-> (([Rule] -> [Rule]) -> TableHead id a -> TableHead id a)
-> Styleable (TableHead id a)
forall h.
(h -> (CSS h -> CSS h) -> h)
-> (([Rule] -> [Rule]) -> h -> h) -> Styleable h
forall id a.
TableHead id a
-> (CSS (TableHead id a) -> CSS (TableHead id a)) -> TableHead id a
forall id a. ([Rule] -> [Rule]) -> TableHead id a -> TableHead id a
$c~ :: forall id a.
TableHead id a
-> (CSS (TableHead id a) -> CSS (TableHead id a)) -> TableHead id a
~ :: TableHead id a
-> (CSS (TableHead id a) -> CSS (TableHead id a)) -> TableHead id a
$cmodCSS :: forall id a. ([Rule] -> [Rule]) -> TableHead id a -> TableHead id a
modCSS :: ([Rule] -> [Rule]) -> TableHead id a -> TableHead id a
Styleable)


newtype TableColumns c dt a = TableColumns (Eff '[State [TableColumn c dt]] a)
  deriving newtype ((forall a b.
 (a -> b) -> TableColumns c dt a -> TableColumns c dt b)
-> (forall a b. a -> TableColumns c dt b -> TableColumns c dt a)
-> Functor (TableColumns c dt)
forall a b. a -> TableColumns c dt b -> TableColumns c dt a
forall a b. (a -> b) -> TableColumns c dt a -> TableColumns c dt b
forall c dt a b. a -> TableColumns c dt b -> TableColumns c dt a
forall c dt a b.
(a -> b) -> TableColumns c dt a -> TableColumns c dt b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall c dt a b.
(a -> b) -> TableColumns c dt a -> TableColumns c dt b
fmap :: forall a b. (a -> b) -> TableColumns c dt a -> TableColumns c dt b
$c<$ :: forall c dt a b. a -> TableColumns c dt b -> TableColumns c dt a
<$ :: forall a b. a -> TableColumns c dt b -> TableColumns c dt a
Functor, Functor (TableColumns c dt)
Functor (TableColumns c dt) =>
(forall a. a -> TableColumns c dt a)
-> (forall a b.
    TableColumns c dt (a -> b)
    -> TableColumns c dt a -> TableColumns c dt b)
-> (forall a b c.
    (a -> b -> c)
    -> TableColumns c dt a
    -> TableColumns c dt b
    -> TableColumns c dt c)
-> (forall a b.
    TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b)
-> (forall a b.
    TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt a)
-> Applicative (TableColumns c dt)
forall a. a -> TableColumns c dt a
forall c dt. Functor (TableColumns c dt)
forall a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt a
forall a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
forall a b.
TableColumns c dt (a -> b)
-> TableColumns c dt a -> TableColumns c dt b
forall c dt a. a -> TableColumns c dt a
forall a b c.
(a -> b -> c)
-> TableColumns c dt a
-> TableColumns c dt b
-> TableColumns c dt c
forall c dt a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt a
forall c dt a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
forall c dt a b.
TableColumns c dt (a -> b)
-> TableColumns c dt a -> TableColumns c dt b
forall c dt a b c.
(a -> b -> c)
-> TableColumns c dt a
-> TableColumns c dt b
-> TableColumns c dt c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall c dt a. a -> TableColumns c dt a
pure :: forall a. a -> TableColumns c dt a
$c<*> :: forall c dt a b.
TableColumns c dt (a -> b)
-> TableColumns c dt a -> TableColumns c dt b
<*> :: forall a b.
TableColumns c dt (a -> b)
-> TableColumns c dt a -> TableColumns c dt b
$cliftA2 :: forall c dt a b c.
(a -> b -> c)
-> TableColumns c dt a
-> TableColumns c dt b
-> TableColumns c dt c
liftA2 :: forall a b c.
(a -> b -> c)
-> TableColumns c dt a
-> TableColumns c dt b
-> TableColumns c dt c
$c*> :: forall c dt a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
*> :: forall a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
$c<* :: forall c dt a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt a
<* :: forall a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt a
Applicative, Applicative (TableColumns c dt)
Applicative (TableColumns c dt) =>
(forall a b.
 TableColumns c dt a
 -> (a -> TableColumns c dt b) -> TableColumns c dt b)
-> (forall a b.
    TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b)
-> (forall a. a -> TableColumns c dt a)
-> Monad (TableColumns c dt)
forall a. a -> TableColumns c dt a
forall c dt. Applicative (TableColumns c dt)
forall a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
forall a b.
TableColumns c dt a
-> (a -> TableColumns c dt b) -> TableColumns c dt b
forall c dt a. a -> TableColumns c dt a
forall c dt a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
forall c dt a b.
TableColumns c dt a
-> (a -> TableColumns c dt b) -> TableColumns c dt b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall c dt a b.
TableColumns c dt a
-> (a -> TableColumns c dt b) -> TableColumns c dt b
>>= :: forall a b.
TableColumns c dt a
-> (a -> TableColumns c dt b) -> TableColumns c dt b
$c>> :: forall c dt a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
>> :: forall a b.
TableColumns c dt a -> TableColumns c dt b -> TableColumns c dt b
$creturn :: forall c dt a. a -> TableColumns c dt a
return :: forall a. a -> TableColumns c dt a
Monad)


data TableColumn c dt = TableColumn
  { forall c dt. TableColumn c dt -> TableHead c ()
headCell :: TableHead c ()
  , forall c dt. TableColumn c dt -> dt -> View c ()
dataCell :: dt -> View c ()
  }


-- * Lists


{- | List elements do not include any inherent styling but are useful for accessibility. See 'Web.Atomic.CSS.list'.

> ol id $ do
>  let nums = list Decimal
>  li nums "one"
>  li nums "two"
>  li nums "three"
-}
ol :: ListItem c () -> View c ()
ol :: forall c. ListItem c () -> View c ()
ol (ListItem View c ()
cnt) = do
  Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"ol" View c ()
cnt


ul :: ListItem c () -> View c ()
ul :: forall c. ListItem c () -> View c ()
ul (ListItem View c ()
cnt) = do
  Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"ul" View c ()
cnt


li :: View c () -> ListItem c ()
li :: forall c. View c () -> ListItem c ()
li View c ()
cnt = View c () -> ListItem c ()
forall c a. View c a -> ListItem c a
ListItem (View c () -> ListItem c ()) -> View c () -> ListItem c ()
forall a b. (a -> b) -> a -> b
$ do
  Text -> View c () -> View c ()
forall c. Text -> View c () -> View c ()
tag Text
"li" View c ()
cnt


newtype ListItem c a = ListItem (View c a)
  deriving newtype ((forall a b. (a -> b) -> ListItem c a -> ListItem c b)
-> (forall a b. a -> ListItem c b -> ListItem c a)
-> Functor (ListItem c)
forall a b. a -> ListItem c b -> ListItem c a
forall a b. (a -> b) -> ListItem c a -> ListItem c b
forall c a b. a -> ListItem c b -> ListItem c a
forall c a b. (a -> b) -> ListItem c a -> ListItem c b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall c a b. (a -> b) -> ListItem c a -> ListItem c b
fmap :: forall a b. (a -> b) -> ListItem c a -> ListItem c b
$c<$ :: forall c a b. a -> ListItem c b -> ListItem c a
<$ :: forall a b. a -> ListItem c b -> ListItem c a
Functor, Functor (ListItem c)
Functor (ListItem c) =>
(forall a. a -> ListItem c a)
-> (forall a b.
    ListItem c (a -> b) -> ListItem c a -> ListItem c b)
-> (forall a b c.
    (a -> b -> c) -> ListItem c a -> ListItem c b -> ListItem c c)
-> (forall a b. ListItem c a -> ListItem c b -> ListItem c b)
-> (forall a b. ListItem c a -> ListItem c b -> ListItem c a)
-> Applicative (ListItem c)
forall c. Functor (ListItem c)
forall a. a -> ListItem c a
forall c a. a -> ListItem c a
forall a b. ListItem c a -> ListItem c b -> ListItem c a
forall a b. ListItem c a -> ListItem c b -> ListItem c b
forall a b. ListItem c (a -> b) -> ListItem c a -> ListItem c b
forall c a b. ListItem c a -> ListItem c b -> ListItem c a
forall c a b. ListItem c a -> ListItem c b -> ListItem c b
forall c a b. ListItem c (a -> b) -> ListItem c a -> ListItem c b
forall a b c.
(a -> b -> c) -> ListItem c a -> ListItem c b -> ListItem c c
forall c a b c.
(a -> b -> c) -> ListItem c a -> ListItem c b -> ListItem c c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall c a. a -> ListItem c a
pure :: forall a. a -> ListItem c a
$c<*> :: forall c a b. ListItem c (a -> b) -> ListItem c a -> ListItem c b
<*> :: forall a b. ListItem c (a -> b) -> ListItem c a -> ListItem c b
$cliftA2 :: forall c a b c.
(a -> b -> c) -> ListItem c a -> ListItem c b -> ListItem c c
liftA2 :: forall a b c.
(a -> b -> c) -> ListItem c a -> ListItem c b -> ListItem c c
$c*> :: forall c a b. ListItem c a -> ListItem c b -> ListItem c b
*> :: forall a b. ListItem c a -> ListItem c b -> ListItem c b
$c<* :: forall c a b. ListItem c a -> ListItem c b -> ListItem c a
<* :: forall a b. ListItem c a -> ListItem c b -> ListItem c a
Applicative, Applicative (ListItem c)
Applicative (ListItem c) =>
(forall a b. ListItem c a -> (a -> ListItem c b) -> ListItem c b)
-> (forall a b. ListItem c a -> ListItem c b -> ListItem c b)
-> (forall a. a -> ListItem c a)
-> Monad (ListItem c)
forall c. Applicative (ListItem c)
forall a. a -> ListItem c a
forall c a. a -> ListItem c a
forall a b. ListItem c a -> ListItem c b -> ListItem c b
forall a b. ListItem c a -> (a -> ListItem c b) -> ListItem c b
forall c a b. ListItem c a -> ListItem c b -> ListItem c b
forall c a b. ListItem c a -> (a -> ListItem c b) -> ListItem c b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall c a b. ListItem c a -> (a -> ListItem c b) -> ListItem c b
>>= :: forall a b. ListItem c a -> (a -> ListItem c b) -> ListItem c b
$c>> :: forall c a b. ListItem c a -> ListItem c b -> ListItem c b
>> :: forall a b. ListItem c a -> ListItem c b -> ListItem c b
$creturn :: forall c a. a -> ListItem c a
return :: forall a. a -> ListItem c a
Monad, ListItem c a
-> (CSS (ListItem c a) -> CSS (ListItem c a)) -> ListItem c a
([Rule] -> [Rule]) -> ListItem c a -> ListItem c a
(ListItem c a
 -> (CSS (ListItem c a) -> CSS (ListItem c a)) -> ListItem c a)
-> (([Rule] -> [Rule]) -> ListItem c a -> ListItem c a)
-> Styleable (ListItem c a)
forall h.
(h -> (CSS h -> CSS h) -> h)
-> (([Rule] -> [Rule]) -> h -> h) -> Styleable h
forall c a.
ListItem c a
-> (CSS (ListItem c a) -> CSS (ListItem c a)) -> ListItem c a
forall c a. ([Rule] -> [Rule]) -> ListItem c a -> ListItem c a
$c~ :: forall c a.
ListItem c a
-> (CSS (ListItem c a) -> CSS (ListItem c a)) -> ListItem c a
~ :: ListItem c a
-> (CSS (ListItem c a) -> CSS (ListItem c a)) -> ListItem c a
$cmodCSS :: forall c a. ([Rule] -> [Rule]) -> ListItem c a -> ListItem c a
modCSS :: ([Rule] -> [Rule]) -> ListItem c a -> ListItem c a
Styleable)