import Foundation
import HTML
import Saga
/// Displays lists of articles sectioned by a key.
///
///
struct ArticleGrid: NodeConvertible {
let articles: [(key: String, value: [Item])]
let canocicalURL: String
let title: String
let rssLink: String
let extraHeader: NodeConvertible
let renderArticle: (Item) -> Node
let header: (String) -> Node
init(
articles: [(key: String, value: [Item])],
canocicalURL: String,
title: String,
rssLink: String,
extraHeader: any NodeConvertible = Node.fragment([]),
renderArticle: @escaping (Item) -> Node = { renderArticleForGrid(article: $0, border: false) },
header: @escaping (String) -> Node
) {
self.articles = articles
self.canocicalURL = canocicalURL
self.title = title
self.rssLink = rssLink
self.extraHeader = extraHeader
self.renderArticle = renderArticle
self.header = header
}
func asNode() -> Node {
baseLayout(
canocicalURL: canocicalURL,
section: .articles,
title: title,
rssLink: rssLink,
extraHeader: extraHeader
) {
div(class: "mt-8 mb-10 bg-slate-800 border border-slate-200 rounded-lg") {
articles.map { key, articles in
section {
header(key)
div(class: "grid gap-10 mx-6 mb-16") {
articles.map(renderArticle)
}
}
}
}
}
}
}