]> Git — Sourcephile - sourcephile-web.git/blob - generator/Site/Filter.hs
init
[sourcephile-web.git] / generator / Site / Filter.hs
1 module Site.Filter where
2
3 import Data.List qualified as List
4 import Data.Text qualified as Text
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.Lang
13 import Site.Model
14 import Site.Page
15 import Utils.Html
16
17 feedTitle :: Filter -> Text
18 feedTitle (Filter language tag) =
19 Text.unwords $
20 (if isNothing tag then ["All Posts"] else ["Posts"])
21 <> maybeToList ((\(Tag t) -> [fmt|tagged "{t}"|]) <$> tag)
22 <> maybeToList (("in " <>) . langText <$> language)
23
24 renderFilter :: Model -> Filter -> Content
25 renderFilter model filt = Content (Just (feedTitle filt)) $ do
26 H.a
27 ! classes
28 [ "fg-white"
29 , "hover:bg-orange-100"
30 , "block"
31 , "p-1"
32 ]
33 -- https://codepen.io/sosuke/pen/Pjoqqp for #F76300
34 ! A.style "filter: invert(31%) sepia(72%) saturate(2199%) hue-rotate(17deg) brightness(111%) contrast(108%);"
35 ! hrefRoute model (RouteFilterAtom filt)
36 $ openIconic "rss-alt"
37 ! classes ["h-4", "w-4"]
38 H.div
39 ! classes ["text-left"]
40 $ mconcat $ List.intersperse " • " $ langLink <$> [minBound ..]
41 H.div
42 ! classes ["space-y-8", "pb-8"]
43 $ renderPagesListing model (filterPosts model filt)
44 where
45 langLink l =
46 H.a
47 ! classes (["hover:underline"] <> prop)
48 ! hrefRoute model (RouteFilter filt{filterLang = if Just l == filterLang filt then Nothing else Just l})
49 $ H.text (textOfLang l)
50 where
51 prop
52 | Just x <- filterLang filt, x /= l = ["line-through"]
53 | otherwise = []