]> Git — Sourcephile - sourcephile-web.git/blob - generator/Site/Tag.hs
init
[sourcephile-web.git] / generator / Site / Tag.hs
1 module Site.Tag where
2
3 import Data.List qualified as List
4 import Data.Map.Strict qualified as Map
5 import PyF
6 import Relude
7 import Text.Blaze.Html5 ((!))
8 import Text.Blaze.Html5 qualified as H
9 --import Text.Blaze.Html5.Attributes qualified as A
10 import Prelude ()
11
12 import Site.Model
13 import Utils.Html
14
15 renderTags :: Model -> Maybe H.Html
16 renderTags model = do
17 let tags = allTags model
18 if null tags
19 then Nothing
20 else Just do
21 H.aside ! classes ["mb-3"] $
22 H.nav ! classes [ "tags"
23 , "bg-gray-100"
24 , "border-1"
25 , "border-black"
26 , "p-0"
27 ] $ do
28 H.h2
29 ! classes [ "bg-black"
30 , "font-bold"
31 , "px-4"
32 , "text-left"
33 , "text-xs"
34 , "text-white"
35 ]
36 $ "All Tags"
37 H.span
38 ! classes ["flex", "flex-wrap", "justify-start", "p-2"]
39 $ forM_ tags $
40 renderTag model True
41
42 renderTag :: Model -> Bool -> Tag -> H.Html
43 renderTag model showCount tag =
44 H.a
45 ! smallCaps
46 [ "tag"
47 , "bg-yellow-200"
48 , "float-left"
49 , "hover:bg-yellow-400"
50 , "inline-block"
51 , "m-px"
52 , "pr-1"
53 , "text-black"
54 , "text-xs"
55 , "whitespace-nowrap"
56 ]
57 ! hrefRoute model (RouteFilter (Filter Nothing (Just tag)))
58 $ do
59 openIconic "tag" ! classes ["inline-block", "m-1"]
60 H.span ! classes ["inline-block"] $ H.text $ unTag tag
61 memptyIfFalse showCount $
62 H.span
63 ! classes ["ml-1", "text-gray-500"]
64 $ [fmt|({count})|]
65 where
66 count =
67 List.length $
68 List.filter (tag `elem`) $
69 metaTags . pageMeta <$> Map.elems (modelPosts model)
70