@@ -8,14 +8,17 @@ module Route.Blog exposing (Model, Msg, route, Data, ActionData)
8
8
9
9
import Article
10
10
import BackendTask exposing (BackendTask )
11
+ import Colours
11
12
import Css exposing (..)
13
+ import Date exposing (Date )
12
14
import Effect
13
15
import ErrorPage
14
16
import FatalError exposing (FatalError )
15
17
import Head
16
18
import Head.Seo as Seo
17
- import Html.Styled as Html exposing (Attribute , Html , styled )
18
- import Html.Styled.Attributes exposing (css )
19
+ import Html as HtmlOriginal
20
+ import Html.Styled as Html exposing (Html , styled )
21
+ import Html.Styled.Attributes exposing (css , fromUnstyled )
19
22
import Pages.Url
20
23
import PagesMsg
21
24
import Route exposing (Route )
@@ -24,6 +27,7 @@ import Server.Request
24
27
import Server.Response
25
28
import Shared
26
29
import UrlPath
30
+ import Util
27
31
import View exposing (View )
28
32
29
33
@@ -88,19 +92,20 @@ view :
88
92
-> View msg
89
93
view app shared =
90
94
{ title = " Blog | Joshua Ji"
91
- , body = [ content ]
95
+ , body = [ content app . data ]
92
96
}
93
97
94
98
95
- content : Html msg
96
- content =
99
+ content : Data -> Html msg
100
+ content articles =
97
101
Html . div
98
102
[ css
99
103
[ maxWidth ( px 900 )
100
104
, margin2 zero auto
101
105
, displayFlex
102
106
, flexDirection column
103
- , property " gap" " 4em"
107
+ , property " gap" " 1em"
108
+ , padding ( em 1 )
104
109
]
105
110
]
106
111
[ Html . h1
@@ -111,4 +116,63 @@ content =
111
116
]
112
117
]
113
118
[ Html . text " Blog" ]
119
+ , Html . div
120
+ [ css
121
+ [ Util . flexDirection Util . Column
122
+ , property " gap" " 1em"
123
+ ]
124
+ ]
125
+ <|
126
+ List . map viewBlogPost articles
127
+ ]
128
+
129
+
130
+ viewBlogPost : ( Route , Article .ArticleMetadata ) -> Html msg
131
+ viewBlogPost ( route_, metadata ) =
132
+ Html . div
133
+ [ css
134
+ [ Util . flexDirection Util . Column
135
+ , width ( pct 100 )
136
+ , padding ( em 1.5 )
137
+ , border3 ( px 1 ) solid ( Colours . toCss Colours . gray)
138
+ , borderRadius ( em 0.5 )
139
+ , hover
140
+ [ borderColor ( Colours . toCss Colours . black) ]
141
+ , property " gap" " 0.5em"
142
+ ]
143
+ ]
144
+ [ Route . toLink ( blogPostTitle metadata) route_
145
+ , blogDate metadata. published
146
+ , blogDescription metadata. description
114
147
]
148
+
149
+
150
+ blogPostTitle : Article .ArticleMetadata -> List (HtmlOriginal .Attribute msg ) -> Html msg
151
+ blogPostTitle metadata attrs =
152
+ Html . a
153
+ ( [ css
154
+ [ fontSize ( em 1.25 )
155
+ , fontWeight bold
156
+ , textDecoration none
157
+ , color ( Colours . toCss Colours . black)
158
+ , hover
159
+ [ color ( Colours . toCss Colours . themeBlue) ]
160
+ ]
161
+ ]
162
+ ++ List . map fromUnstyled attrs
163
+ )
164
+ [ Html . text metadata. title ]
165
+
166
+
167
+ blogDate : Date -> Html msg
168
+ blogDate date =
169
+ Html . p
170
+ [ css
171
+ [ fontSize ( em 0.75 ) ]
172
+ ]
173
+ [ Html . text <| Date . format " MMM d y" date ]
174
+
175
+
176
+ blogDescription : String -> Html msg
177
+ blogDescription description =
178
+ Html . p [] [ Html . text description ]
0 commit comments