2021-05-15 19:42:16 +03:00
|
|
|
{ utils, posts, pkgs, config, ... }@context:
|
|
|
|
let
|
2021-05-16 03:57:35 +03:00
|
|
|
inherit (utils) readFile mapAttrsToList tags fetchGit map elemAt;
|
|
|
|
inherit (pkgs.lib) optional length splitString;
|
2021-05-15 19:42:16 +03:00
|
|
|
|
2021-05-16 03:05:10 +03:00
|
|
|
stylesheets = map tags.mkStylesheet [
|
|
|
|
"https://unpkg.com/purecss@2.0.6/build/pure-min.css"
|
|
|
|
"https://unpkg.com/purecss@2.0.6/build/grids-responsive-min.css"
|
|
|
|
"mine.css"
|
|
|
|
];
|
2021-05-16 00:43:38 +03:00
|
|
|
|
2021-05-16 03:57:35 +03:00
|
|
|
renderPost = { name, value }:
|
|
|
|
let
|
|
|
|
parts = splitString "_" name;
|
|
|
|
id = elemAt parts 1;
|
|
|
|
in
|
|
|
|
with tags; article [
|
|
|
|
(a { href = "#${id}"; class = "postheader"; } (h3 { inherit id; } ("## " + id)))
|
|
|
|
(h6 ("date: " + (elemAt parts 0)))
|
|
|
|
(readFile value)
|
|
|
|
];
|
|
|
|
|
2021-05-16 00:43:38 +03:00
|
|
|
pages =
|
|
|
|
mapAttrsToList
|
|
|
|
(name: relPath: tags.div { class = "pure-u-1"; } (tags.a { href = "./${relPath}"; class = "postheader"; } name))
|
|
|
|
(config.pages or { });
|
|
|
|
|
2021-05-16 02:56:54 +03:00
|
|
|
postsSectionContent = with tags; [
|
2021-05-16 00:43:38 +03:00
|
|
|
(a { href = "#posts"; class = "postheader"; } (h1 "# posts"))
|
2021-05-16 03:57:35 +03:00
|
|
|
] ++ (map renderPost posts);
|
2021-05-16 00:43:38 +03:00
|
|
|
|
|
|
|
sidebarSection = optional ((length pages) > 0) (
|
|
|
|
with tags; nav { class = "sidebar"; } ([
|
|
|
|
(a { href = "#pages"; class = "postheader"; } (h1 "# pages"))
|
|
|
|
(div { class = "pure-g"; } pages)
|
|
|
|
])
|
|
|
|
);
|
2021-05-16 02:56:54 +03:00
|
|
|
|
|
|
|
mkPage = content: with tags;
|
2021-05-15 19:42:16 +03:00
|
|
|
html [
|
2021-05-16 00:43:38 +03:00
|
|
|
(head (stylesheets ++ [
|
2021-05-15 19:42:16 +03:00
|
|
|
(title config.title)
|
2021-05-15 21:52:25 +03:00
|
|
|
(meta { name = "viewport"; content = "width=device-width, initial-scale=1"; })
|
2021-05-16 00:43:38 +03:00
|
|
|
]))
|
2021-05-16 02:56:54 +03:00
|
|
|
(body (sidebarSection ++ [ (div { class = "content"; } content) ]))
|
2021-05-15 19:42:16 +03:00
|
|
|
];
|
2021-05-15 21:29:30 +03:00
|
|
|
|
2021-05-16 02:56:54 +03:00
|
|
|
stylesheet =
|
|
|
|
with utils.css;
|
2021-05-16 03:05:10 +03:00
|
|
|
let
|
|
|
|
marginMobile = {
|
|
|
|
margin-left = "3%";
|
|
|
|
margin-right = "3%";
|
|
|
|
};
|
|
|
|
in
|
2021-05-16 02:56:54 +03:00
|
|
|
css [
|
|
|
|
(css {
|
|
|
|
body = {
|
|
|
|
font-family = [ "Raleway" "Helvetica" "Arial" "sans-serif" ];
|
|
|
|
};
|
2021-05-16 04:25:22 +03:00
|
|
|
pre = {
|
2021-05-16 02:56:54 +03:00
|
|
|
font-family = [ "Iosevka Term" "Iosevka" "monospace" ];
|
|
|
|
background = "#000000cc";
|
|
|
|
color = "#eeeeee";
|
|
|
|
};
|
|
|
|
"a.postheader,a.postheader:hover" = {
|
|
|
|
color = "inherit";
|
|
|
|
text-decoration = "none";
|
|
|
|
};
|
|
|
|
"a.postheader:hover" = {
|
|
|
|
text-decoration = "underline";
|
|
|
|
};
|
|
|
|
"div.content" = {
|
|
|
|
margin-top = "5%";
|
|
|
|
margin-bottom = "5%";
|
|
|
|
margin-left = "20%";
|
|
|
|
margin-right = "10%";
|
|
|
|
};
|
|
|
|
"nav.sidebar" = {
|
|
|
|
position = "fixed";
|
|
|
|
top = 0;
|
|
|
|
margin-left = "3%";
|
|
|
|
z-index = 1000;
|
|
|
|
};
|
|
|
|
})
|
|
|
|
(media "max-width: 48em" {
|
|
|
|
"nav.sidebar" = {
|
|
|
|
position = "relative";
|
|
|
|
margin-top = "5%";
|
2021-05-16 03:05:10 +03:00
|
|
|
} // marginMobile;
|
2021-05-16 02:56:54 +03:00
|
|
|
"div.content" = {
|
|
|
|
margin-top = 0;
|
2021-05-16 03:05:10 +03:00
|
|
|
} // marginMobile;
|
2021-05-16 02:56:54 +03:00
|
|
|
})
|
|
|
|
];
|
|
|
|
in
|
|
|
|
{
|
|
|
|
inherit stylesheets sidebarSection mkPage stylesheet;
|
|
|
|
|
|
|
|
site = {
|
|
|
|
"index.html" = mkPage postsSectionContent;
|
|
|
|
"mine.css" = stylesheet;
|
2021-05-15 21:29:30 +03:00
|
|
|
};
|
2021-05-15 19:42:16 +03:00
|
|
|
}
|