diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..45ef8b2 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "fornax": { + "version": "0.14.1", + "commands": [ + "fornax" + ] + } + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index dfcfd56..f3f7f70 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,4 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ +src/_public \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7530b0 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# nfdi4plants-fornax-template + +This fornax template implements the existing [nfdi-web-components](https://github.com/nfdi4plants/web-components) for **documentation**. \ No newline at end of file diff --git a/src/_lib/Fornax.Core.dll b/src/_lib/Fornax.Core.dll new file mode 100644 index 0000000..2b49b4b Binary files /dev/null and b/src/_lib/Fornax.Core.dll differ diff --git a/src/_lib/Markdig.dll b/src/_lib/Markdig.dll new file mode 100644 index 0000000..7d72255 Binary files /dev/null and b/src/_lib/Markdig.dll differ diff --git a/src/config.fsx b/src/config.fsx new file mode 100644 index 0000000..ce55050 --- /dev/null +++ b/src/config.fsx @@ -0,0 +1,43 @@ +#r "_lib/Fornax.Core.dll" + +open Config +open System.IO + +let postPredicate (projectRoot: string, page: string) = + let fileName = Path.Combine(projectRoot,page) + let ext = Path.GetExtension page + if ext = ".md" then + let ctn = File.ReadAllText fileName + page.Contains("_public") |> not + && ctn.Contains("layout: post") + else + false + +let staticPredicate (projectRoot: string, page: string) = + let ext = Path.GetExtension page + let fileShouldBeExcluded = + ext = ".fsx" || + ext = ".md" || + page.Contains "_public" || + page.Contains "_bin" || + page.Contains "_lib" || + page.Contains "_data" || + page.Contains "_settings" || + page.Contains "_config.yml" || + page.Contains ".sass-cache" || + page.Contains ".git" || + page.Contains ".ionide" + fileShouldBeExcluded |> not + + +let config = { + Generators = [ + {Script = "less.fsx"; Trigger = OnFileExt ".less"; OutputFile = ChangeExtension "css" } + {Script = "sass.fsx"; Trigger = OnFileExt ".scss"; OutputFile = ChangeExtension "css" } + {Script = "post.fsx"; Trigger = OnFilePredicate postPredicate; OutputFile = ChangeExtension "html" } + {Script = "staticfile.fsx"; Trigger = OnFilePredicate staticPredicate; OutputFile = SameFileName } + {Script = "index.fsx"; Trigger = Once; OutputFile = MultipleFiles id } + {Script = "about.fsx"; Trigger = Once; OutputFile = NewFileName "about.html" } + {Script = "contact.fsx"; Trigger = Once; OutputFile = NewFileName "contact.html" } + ] +} diff --git a/src/generators/about.fsx b/src/generators/about.fsx new file mode 100644 index 0000000..f0d789f --- /dev/null +++ b/src/generators/about.fsx @@ -0,0 +1,40 @@ +#r "../_lib/Fornax.Core.dll" +#load "layout.fsx" + +open Html + +let about = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci." + +let generate' (ctx : SiteContents) (_: string) = + let siteInfo = ctx.TryGetValue () + let desc = + siteInfo + |> Option.map (fun si -> si.description) + |> Option.defaultValue "" + + + Layout.layout ctx "About" [ + section [Class "hero is-info is-medium is-bold"] [ + div [Class "hero-body"] [ + div [Class "container has-text-centered"] [ + h1 [Class "title"] [!!desc] + ] + ] + ] + div [Class "container"] [ + section [Class "articles"] [ + div [Class "column is-8 is-offset-2"] [ + div [Class "card article"] [ + div [Class "card-content"] [ + div [Class "content article-body"] [ + !! about + ] + ] + ] + ] + ] + ]] + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + generate' ctx page + |> Layout.render ctx diff --git a/src/generators/contact.fsx b/src/generators/contact.fsx new file mode 100644 index 0000000..bd08ac9 --- /dev/null +++ b/src/generators/contact.fsx @@ -0,0 +1,40 @@ +#r "../_lib/Fornax.Core.dll" +#load "layout.fsx" + +open Html + +let about = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci." + +let generate' (ctx : SiteContents) (_: string) = + let siteInfo = ctx.TryGetValue () + let desc = + siteInfo + |> Option.map (fun si -> si.description) + |> Option.defaultValue "" + + + Layout.layout ctx "Home" [ + section [Class "hero is-info is-medium is-bold"] [ + div [Class "hero-body"] [ + div [Class "container has-text-centered"] [ + h1 [Class "title"] [!!desc] + ] + ] + ] + div [Class "container"] [ + section [Class "articles"] [ + div [Class "column is-8 is-offset-2"] [ + div [Class "card article"] [ + div [Class "card-content"] [ + div [Class "content article-body"] [ + !! about + ] + ] + ] + ] + ] + ]] + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + generate' ctx page + |> Layout.render ctx \ No newline at end of file diff --git a/src/generators/index.fsx b/src/generators/index.fsx new file mode 100644 index 0000000..7508b50 --- /dev/null +++ b/src/generators/index.fsx @@ -0,0 +1,67 @@ +#r "../_lib/Fornax.Core.dll" +#load "layout.fsx" + +open Html + +let generate' (ctx : SiteContents) (_: string) = + let posts = ctx.TryGetValues () |> Option.defaultValue Seq.empty + let siteInfo = ctx.TryGetValue () + let desc, postPageSize = + siteInfo + |> Option.map (fun si -> si.description, si.postPageSize) + |> Option.defaultValue ("", 10) + + + let psts = + posts + |> Seq.sortByDescending Layout.published + |> Seq.toList + |> List.chunkBySize postPageSize + |> List.map (List.map (Layout.postLayout true)) + + let pages = List.length psts + + let getFilenameForIndex i = + if i = 0 then + sprintf "index.html" + else + sprintf "posts/page%i.html" i + + let layoutForPostSet i psts = + let nextPage = + if i = (pages - 1) then "#" + else "/" + getFilenameForIndex (i + 1) + + let previousPage = + if i = 0 then "#" + else "/" + getFilenameForIndex (i - 1) + + Layout.layout ctx "Home" [ + section [Class "hero is-info is-medium is-bold"] [ + div [Class "hero-body"] [ + div [Class "container has-text-centered"] [ + h1 [Class "title"] [!!desc] + ] + ] + ] + div [Class "container"] [ + section [Class "articles"] [ + div [Class "column is-8 is-offset-2"] psts + ] + ] + div [Class "container"] [ + div [Class "container has-text-centered"] [ + a [Href previousPage] [!! "Previous"] + !! (sprintf "%i of %i" (i + 1) pages) + a [Href nextPage] [!! "Next"] + ] + ]] + + psts + |> List.mapi (fun i psts -> + getFilenameForIndex i, + layoutForPostSet i psts + |> Layout.render ctx) + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + generate' ctx page \ No newline at end of file diff --git a/src/generators/layout.fsx b/src/generators/layout.fsx new file mode 100644 index 0000000..393393e --- /dev/null +++ b/src/generators/layout.fsx @@ -0,0 +1,106 @@ +#r "../_lib/Fornax.Core.dll" +#if !FORNAX +#load "../loaders/postloader.fsx" +#load "../loaders/pageloader.fsx" +#load "../loaders/globalloader.fsx" +#endif + +open Html + +let injectWebsocketCode (webpage:string) = + let websocketScript = + """ + + """ + let head = "" + let index = webpage.IndexOf head + webpage.Insert ( (index + head.Length + 1),websocketScript) + +let layout (ctx : SiteContents) active bodyCnt = + let pages = ctx.TryGetValues () |> Option.defaultValue Seq.empty + let siteInfo = ctx.TryGetValue () + let ttl = + siteInfo + |> Option.map (fun si -> si.title) + |> Option.defaultValue "" + + let menuEntries = + pages + |> Seq.map (fun p -> + let cls = if p.title = active then "navbar-item is-active" else "navbar-item" + a [Class cls; Href p.link] [!! p.title ]) + |> Seq.toList + + html [] [ + head [] [ + meta [CharSet "utf-8"] + meta [Name "viewport"; Content "width=device-width, initial-scale=1"] + title [] [!! ttl] + link [Rel "icon"; Type "image/png"; Sizes "32x32"; Href "/images/favicon.png"] + link [Rel "stylesheet"; Href "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"] + link [Rel "stylesheet"; Href "https://fonts.googleapis.com/css?family=Open+Sans"] + link [Rel "stylesheet"; Href "https://unpkg.com/bulma@0.8.0/css/bulma.min.css"] + link [Rel "stylesheet"; Type "text/css"; Href "/style/style.css"] + + ] + body [] [ + nav [Class "navbar"] [ + div [Class "container"] [ + div [Class "navbar-brand"] [ + a [Class "navbar-item"; Href "/"] [ + img [Src "/images/bulma.png"; Alt "Logo"] + ] + span [Class "navbar-burger burger"; HtmlProperties.Custom ("data-target", "navbarMenu")] [ + span [] [] + span [] [] + span [] [] + ] + ] + div [Id "navbarMenu"; Class "navbar-menu"] menuEntries + ] + ] + yield! bodyCnt + ] + ] + +let render (ctx : SiteContents) cnt = + let disableLiveRefresh = ctx.TryGetValue () |> Option.map (fun n -> n.disableLiveRefresh) |> Option.defaultValue false + cnt + |> HtmlElement.ToString + |> fun n -> if disableLiveRefresh then n else injectWebsocketCode n + +let published (post: Postloader.Post) = + post.published + |> Option.defaultValue System.DateTime.Now + |> fun n -> n.ToString("yyyy-MM-dd") + +let postLayout (useSummary: bool) (post: Postloader.Post) = + div [Class "card article"] [ + div [Class "card-content"] [ + div [Class "media-content has-text-centered"] [ + p [Class "title article-title"; ] [ a [Href post.link] [!! post.title]] + p [Class "subtitle is-6 article-subtitle"] [ + a [Href "#"] [!! (defaultArg post.author "")] + !! (sprintf "on %s" (published post)) + ] + ] + div [Class "content article-body"] [ + !! (if useSummary then post.summary else post.content) + + ] + ] + ] diff --git a/src/generators/post.fsx b/src/generators/post.fsx new file mode 100644 index 0000000..43baa9b --- /dev/null +++ b/src/generators/post.fsx @@ -0,0 +1,38 @@ +#r "../_lib/Fornax.Core.dll" +#load "layout.fsx" + +open Html + + +let generate' (ctx : SiteContents) (page: string) = + let post = + ctx.TryGetValues () + |> Option.defaultValue Seq.empty + |> Seq.find (fun n -> n.file = page) + + let siteInfo = ctx.TryGetValue () + let desc = + siteInfo + |> Option.map (fun si -> si.description) + |> Option.defaultValue "" + + Layout.layout ctx post.title [ + section [Class "hero is-info is-medium is-bold"] [ + div [Class "hero-body"] [ + div [Class "container has-text-centered"] [ + h1 [Class "title"] [!!desc] + ] + ] + ] + div [Class "container"] [ + section [Class "articles"] [ + div [Class "column is-8 is-offset-2"] [ + Layout.postLayout false post + ] + ] + ] + ] + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + generate' ctx page + |> Layout.render ctx \ No newline at end of file diff --git a/src/generators/staticfile.fsx b/src/generators/staticfile.fsx new file mode 100644 index 0000000..9fe7954 --- /dev/null +++ b/src/generators/staticfile.fsx @@ -0,0 +1,7 @@ +#r "../_lib/Fornax.Core.dll" + +open System.IO + +let generate (ctx : SiteContents) (projectRoot: string) (page: string) = + let inputPath = Path.Combine(projectRoot, page) + File.ReadAllBytes inputPath \ No newline at end of file diff --git a/src/images/avatar.jpg b/src/images/avatar.jpg new file mode 100644 index 0000000..b1217e2 Binary files /dev/null and b/src/images/avatar.jpg differ diff --git a/src/images/bulma.png b/src/images/bulma.png new file mode 100644 index 0000000..a016c2b Binary files /dev/null and b/src/images/bulma.png differ diff --git a/src/images/favicon.png b/src/images/favicon.png new file mode 100644 index 0000000..e730894 Binary files /dev/null and b/src/images/favicon.png differ diff --git a/src/js/sampleJsFile.js b/src/js/sampleJsFile.js new file mode 100644 index 0000000..88be1a7 --- /dev/null +++ b/src/js/sampleJsFile.js @@ -0,0 +1 @@ +var x = 1 \ No newline at end of file diff --git a/src/loaders/globalloader.fsx b/src/loaders/globalloader.fsx new file mode 100644 index 0000000..6c52274 --- /dev/null +++ b/src/loaders/globalloader.fsx @@ -0,0 +1,16 @@ +#r "../_lib/Fornax.Core.dll" + +type SiteInfo = { + title: string + description: string + postPageSize: int +} + +let loader (projectRoot: string) (siteContent: SiteContents) = + let siteInfo = + { title = "Sample Fornax blog"; + description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit" + postPageSize = 5 } + siteContent.Add(siteInfo) + + siteContent diff --git a/src/loaders/pageloader.fsx b/src/loaders/pageloader.fsx new file mode 100644 index 0000000..113e0c4 --- /dev/null +++ b/src/loaders/pageloader.fsx @@ -0,0 +1,13 @@ +#r "../_lib/Fornax.Core.dll" + +type Page = { + title: string + link: string +} + +let loader (projectRoot: string) (siteContent: SiteContents) = + siteContent.Add({title = "Home"; link = "/"}) + siteContent.Add({title = "About"; link = "/about.html"}) + siteContent.Add({title = "Contact"; link = "/contact.html"}) + + siteContent diff --git a/src/loaders/postloader.fsx b/src/loaders/postloader.fsx new file mode 100644 index 0000000..fd08754 --- /dev/null +++ b/src/loaders/postloader.fsx @@ -0,0 +1,129 @@ +#r "../_lib/Fornax.Core.dll" +#r "../_lib/Markdig.dll" + +open System.IO +open Markdig + +type PostConfig = { + disableLiveRefresh: bool +} +type Post = { + file: string + link : string + title: string + author: string option + published: System.DateTime option + tags: string list + content: string + summary: string +} + +let contentDir = "posts" + +let markdownPipeline = + MarkdownPipelineBuilder() + .UsePipeTables() + .UseGridTables() + .Build() + +let isSeparator (input : string) = + input.StartsWith "---" + +let isSummarySeparator (input: string) = + input.Contains "" + + +///`fileContent` - content of page to parse. Usually whole content of `.md` file +///returns content of config that should be used for the page +let getConfig (fileContent : string) = + let fileContent = fileContent.Split '\n' + let fileContent = fileContent |> Array.skip 1 //First line must be --- + let indexOfSeperator = fileContent |> Array.findIndex isSeparator + let splitKey (line: string) = + let seperatorIndex = line.IndexOf(':') + if seperatorIndex > 0 then + let key = line.[.. seperatorIndex - 1].Trim().ToLower() + let value = line.[seperatorIndex + 1 ..].Trim() + Some(key, value) + else + None + fileContent + |> Array.splitAt indexOfSeperator + |> fst + |> Seq.choose splitKey + |> Map.ofSeq + +///`fileContent` - content of page to parse. Usually whole content of `.md` file +///returns HTML version of content of the page +let getContent (fileContent : string) = + let fileContent = fileContent.Split '\n' + let fileContent = fileContent |> Array.skip 1 //First line must be --- + let indexOfSeperator = fileContent |> Array.findIndex isSeparator + let _, content = fileContent |> Array.splitAt indexOfSeperator + + let summary, content = + match content |> Array.tryFindIndex isSummarySeparator with + | Some indexOfSummary -> + let summary, _ = content |> Array.splitAt indexOfSummary + summary, content + | None -> + content, content + + let summary = summary |> Array.skip 1 |> String.concat "\n" + let content = content |> Array.skip 1 |> String.concat "\n" + + Markdown.ToHtml(summary, markdownPipeline), + Markdown.ToHtml(content, markdownPipeline) + +let trimString (str : string) = + str.Trim().TrimEnd('"').TrimStart('"') + +let loadFile (rootDir: string) (n: string) = + let text = File.ReadAllText n + + let config = getConfig text + let summary, content = getContent text + + let chopLength = + if rootDir.EndsWith(Path.DirectorySeparatorChar) then rootDir.Length + else rootDir.Length + 1 + + let dirPart = + n + |> Path.GetDirectoryName + |> fun x -> x.[chopLength .. ] + + let file = Path.Combine(dirPart, (n |> Path.GetFileNameWithoutExtension) + ".md").Replace("\\", "/") + let link = "/" + Path.Combine(dirPart, (n |> Path.GetFileNameWithoutExtension) + ".html").Replace("\\", "/") + + let title = config |> Map.find "title" |> trimString + let author = config |> Map.tryFind "author" |> Option.map trimString + let published = config |> Map.tryFind "published" |> Option.map (trimString >> System.DateTime.Parse) + + let tags = + let tagsOpt = + config + |> Map.tryFind "tags" + |> Option.map (trimString >> fun n -> n.Split ',' |> Array.toList) + defaultArg tagsOpt [] + + { file = file + link = link + title = title + author = author + published = published + tags = tags + content = content + summary = summary } + +let loader (projectRoot: string) (siteContent: SiteContents) = + let postsPath = Path.Combine(projectRoot, contentDir) + let options = EnumerationOptions(RecurseSubdirectories = true) + let files = Directory.GetFiles(postsPath, "*", options) + files + |> Array.filter (fun n -> n.EndsWith ".md") + |> Array.map (loadFile projectRoot) + |> Array.iter siteContent.Add + + siteContent.Add({disableLiveRefresh = false}) + siteContent diff --git a/src/posts/post.md b/src/posts/post.md new file mode 100644 index 0000000..cf7c358 --- /dev/null +++ b/src/posts/post.md @@ -0,0 +1,15 @@ +--- +layout: post +title: Some nice post title +author: @k_cieslak +published: 2020-02-19 +--- +# Introduction + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +Phasellus aliquam tellus eu augue vulputate laoreet. Nunc tincidunt sed mauris eu vestibulum. Quisque id ex eget erat elementum euismod vel nec ex. Nunc et blandit neque. Duis erat ex, facilisis non consectetur sit amet, consectetur mattis ex. Vestibulum quis ligula pharetra, semper nibh nec, porta augue. In placerat auctor risus, eu dictum purus iaculis et. Vivamus viverra sollicitudin augue, in sollicitudin leo malesuada non. + +In hac habitasse platea dictumst. Quisque a diam egestas, ornare felis quis, gravida arcu. In vel tellus facilisis, rhoncus ligula sit amet, feugiat massa. Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur varius interdum dolor, ut pretium augue egestas id. Aenean vulputate commodo nibh tristique egestas. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus elementum non mi sit amet lacinia. \ No newline at end of file diff --git a/src/posts/post2.md b/src/posts/post2.md new file mode 100644 index 0000000..16a15b1 --- /dev/null +++ b/src/posts/post2.md @@ -0,0 +1,15 @@ +--- +layout: post +title: Some other post title +author: @k_cieslak +published: 2020-02-20 +--- +# Something else + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +In est nulla, ornare vitae elit sed, consequat sollicitudin dui. Duis posuere nulla malesuada elit volutpat ultricies. Mauris et tellus tortor. In ligula elit, pellentesque eget est et, mattis rhoncus nisl. Sed orci ex, mollis quis justo eu, dapibus tincidunt turpis. Sed rhoncus odio non lacus ullamcorper volutpat. Suspendisse blandit ullamcorper condimentum. Quisque et viverra nisi. Vivamus in mollis nulla. Nulla faucibus sed ligula et blandit. + +Vivamus nec libero faucibus, cursus ex et, consequat mauris. Pellentesque commodo ullamcorper vestibulum. Donec efficitur, ipsum et dapibus varius, purus mauris gravida augue, eu mattis lorem turpis eget dui. Curabitur nibh erat, posuere sed eros a, blandit venenatis risus. Vestibulum cursus imperdiet ultrices. In eu efficitur dui, eget tempus enim. Nunc imperdiet, enim et sagittis lacinia, lacus metus eleifend purus, blandit pellentesque leo ante ac velit. Nam ac sagittis est. Cras accumsan, odio vel lacinia mollis, metus tortor malesuada nisi, et consectetur neque quam in erat. Sed ultricies aliquam hendrerit. Etiam non aliquam ipsum, id rutrum magna. Morbi id tincidunt mauris. Vestibulum nec iaculis massa. Etiam fringilla, orci quis faucibus vulputate, risus nibh finibus nisl, et vehicula ipsum leo a tortor. Curabitur mauris elit, bibendum vitae velit at, dignissim ornare arcu. diff --git a/src/posts/post3.md b/src/posts/post3.md new file mode 100644 index 0000000..9939e1a --- /dev/null +++ b/src/posts/post3.md @@ -0,0 +1,15 @@ +--- +layout: post +title: On this great day +author: @k_cieslak +published: 2020-03-20 +--- +# On this great day + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +In est nulla, ornare vitae elit sed, consequat sollicitudin dui. Duis posuere nulla malesuada elit volutpat ultricies. Mauris et tellus tortor. In ligula elit, pellentesque eget est et, mattis rhoncus nisl. Sed orci ex, mollis quis justo eu, dapibus tincidunt turpis. Sed rhoncus odio non lacus ullamcorper volutpat. Suspendisse blandit ullamcorper condimentum. Quisque et viverra nisi. Vivamus in mollis nulla. Nulla faucibus sed ligula et blandit. + +Vivamus nec libero faucibus, cursus ex et, consequat mauris. Pellentesque commodo ullamcorper vestibulum. Donec efficitur, ipsum et dapibus varius, purus mauris gravida augue, eu mattis lorem turpis eget dui. Curabitur nibh erat, posuere sed eros a, blandit venenatis risus. Vestibulum cursus imperdiet ultrices. In eu efficitur dui, eget tempus enim. Nunc imperdiet, enim et sagittis lacinia, lacus metus eleifend purus, blandit pellentesque leo ante ac velit. Nam ac sagittis est. Cras accumsan, odio vel lacinia mollis, metus tortor malesuada nisi, et consectetur neque quam in erat. Sed ultricies aliquam hendrerit. Etiam non aliquam ipsum, id rutrum magna. Morbi id tincidunt mauris. Vestibulum nec iaculis massa. Etiam fringilla, orci quis faucibus vulputate, risus nibh finibus nisl, et vehicula ipsum leo a tortor. Curabitur mauris elit, bibendum vitae velit at, dignissim ornare arcu. diff --git a/src/posts/post4.md b/src/posts/post4.md new file mode 100644 index 0000000..3185563 --- /dev/null +++ b/src/posts/post4.md @@ -0,0 +1,15 @@ +--- +layout: post +title: We learnt +author: @k_cieslak +published: 2020-03-25 +--- +# We learnt + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +In est nulla, ornare vitae elit sed, consequat sollicitudin dui. Duis posuere nulla malesuada elit volutpat ultricies. Mauris et tellus tortor. In ligula elit, pellentesque eget est et, mattis rhoncus nisl. Sed orci ex, mollis quis justo eu, dapibus tincidunt turpis. Sed rhoncus odio non lacus ullamcorper volutpat. Suspendisse blandit ullamcorper condimentum. Quisque et viverra nisi. Vivamus in mollis nulla. Nulla faucibus sed ligula et blandit. + +Vivamus nec libero faucibus, cursus ex et, consequat mauris. Pellentesque commodo ullamcorper vestibulum. Donec efficitur, ipsum et dapibus varius, purus mauris gravida augue, eu mattis lorem turpis eget dui. Curabitur nibh erat, posuere sed eros a, blandit venenatis risus. Vestibulum cursus imperdiet ultrices. In eu efficitur dui, eget tempus enim. Nunc imperdiet, enim et sagittis lacinia, lacus metus eleifend purus, blandit pellentesque leo ante ac velit. Nam ac sagittis est. Cras accumsan, odio vel lacinia mollis, metus tortor malesuada nisi, et consectetur neque quam in erat. Sed ultricies aliquam hendrerit. Etiam non aliquam ipsum, id rutrum magna. Morbi id tincidunt mauris. Vestibulum nec iaculis massa. Etiam fringilla, orci quis faucibus vulputate, risus nibh finibus nisl, et vehicula ipsum leo a tortor. Curabitur mauris elit, bibendum vitae velit at, dignissim ornare arcu. diff --git a/src/posts/post5.md b/src/posts/post5.md new file mode 100644 index 0000000..a2d42b4 --- /dev/null +++ b/src/posts/post5.md @@ -0,0 +1,15 @@ +--- +layout: post +title: All about +author: @k_cieslak +published: 2020-04-21 +--- +# All about + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +In est nulla, ornare vitae elit sed, consequat sollicitudin dui. Duis posuere nulla malesuada elit volutpat ultricies. Mauris et tellus tortor. In ligula elit, pellentesque eget est et, mattis rhoncus nisl. Sed orci ex, mollis quis justo eu, dapibus tincidunt turpis. Sed rhoncus odio non lacus ullamcorper volutpat. Suspendisse blandit ullamcorper condimentum. Quisque et viverra nisi. Vivamus in mollis nulla. Nulla faucibus sed ligula et blandit. + +Vivamus nec libero faucibus, cursus ex et, consequat mauris. Pellentesque commodo ullamcorper vestibulum. Donec efficitur, ipsum et dapibus varius, purus mauris gravida augue, eu mattis lorem turpis eget dui. Curabitur nibh erat, posuere sed eros a, blandit venenatis risus. Vestibulum cursus imperdiet ultrices. In eu efficitur dui, eget tempus enim. Nunc imperdiet, enim et sagittis lacinia, lacus metus eleifend purus, blandit pellentesque leo ante ac velit. Nam ac sagittis est. Cras accumsan, odio vel lacinia mollis, metus tortor malesuada nisi, et consectetur neque quam in erat. Sed ultricies aliquam hendrerit. Etiam non aliquam ipsum, id rutrum magna. Morbi id tincidunt mauris. Vestibulum nec iaculis massa. Etiam fringilla, orci quis faucibus vulputate, risus nibh finibus nisl, et vehicula ipsum leo a tortor. Curabitur mauris elit, bibendum vitae velit at, dignissim ornare arcu. diff --git a/src/posts/post6.md b/src/posts/post6.md new file mode 100644 index 0000000..616ab63 --- /dev/null +++ b/src/posts/post6.md @@ -0,0 +1,15 @@ +--- +layout: post +title: Paging +author: @k_cieslak +published: 2020-05-01 +--- +# Paging + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +In est nulla, ornare vitae elit sed, consequat sollicitudin dui. Duis posuere nulla malesuada elit volutpat ultricies. Mauris et tellus tortor. In ligula elit, pellentesque eget est et, mattis rhoncus nisl. Sed orci ex, mollis quis justo eu, dapibus tincidunt turpis. Sed rhoncus odio non lacus ullamcorper volutpat. Suspendisse blandit ullamcorper condimentum. Quisque et viverra nisi. Vivamus in mollis nulla. Nulla faucibus sed ligula et blandit. + +Vivamus nec libero faucibus, cursus ex et, consequat mauris. Pellentesque commodo ullamcorper vestibulum. Donec efficitur, ipsum et dapibus varius, purus mauris gravida augue, eu mattis lorem turpis eget dui. Curabitur nibh erat, posuere sed eros a, blandit venenatis risus. Vestibulum cursus imperdiet ultrices. In eu efficitur dui, eget tempus enim. Nunc imperdiet, enim et sagittis lacinia, lacus metus eleifend purus, blandit pellentesque leo ante ac velit. Nam ac sagittis est. Cras accumsan, odio vel lacinia mollis, metus tortor malesuada nisi, et consectetur neque quam in erat. Sed ultricies aliquam hendrerit. Etiam non aliquam ipsum, id rutrum magna. Morbi id tincidunt mauris. Vestibulum nec iaculis massa. Etiam fringilla, orci quis faucibus vulputate, risus nibh finibus nisl, et vehicula ipsum leo a tortor. Curabitur mauris elit, bibendum vitae velit at, dignissim ornare arcu. diff --git a/src/posts/subdir/post3.md b/src/posts/subdir/post3.md new file mode 100644 index 0000000..4ebbff6 --- /dev/null +++ b/src/posts/subdir/post3.md @@ -0,0 +1,15 @@ +--- +layout: post +title: A post in sub-dir +author: @k_cieslak +published: 2020-04-29 +--- +# A post in sub-dir + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nisi diam, vehicula quis blandit id, suscipit sed libero. Proin at diam dolor. In hac habitasse platea dictumst. Donec quis dui vitae quam eleifend dignissim non sed libero. In hac habitasse platea dictumst. In ullamcorper mollis risus, a vulputate quam accumsan at. Donec sed felis sodales, blandit orci id, vulputate orci. + + + +In est nulla, ornare vitae elit sed, consequat sollicitudin dui. Duis posuere nulla malesuada elit volutpat ultricies. Mauris et tellus tortor. In ligula elit, pellentesque eget est et, mattis rhoncus nisl. Sed orci ex, mollis quis justo eu, dapibus tincidunt turpis. Sed rhoncus odio non lacus ullamcorper volutpat. Suspendisse blandit ullamcorper condimentum. Quisque et viverra nisi. Vivamus in mollis nulla. Nulla faucibus sed ligula et blandit. + +Vivamus nec libero faucibus, cursus ex et, consequat mauris. Pellentesque commodo ullamcorper vestibulum. Donec efficitur, ipsum et dapibus varius, purus mauris gravida augue, eu mattis lorem turpis eget dui. Curabitur nibh erat, posuere sed eros a, blandit venenatis risus. Vestibulum cursus imperdiet ultrices. In eu efficitur dui, eget tempus enim. Nunc imperdiet, enim et sagittis lacinia, lacus metus eleifend purus, blandit pellentesque leo ante ac velit. Nam ac sagittis est. Cras accumsan, odio vel lacinia mollis, metus tortor malesuada nisi, et consectetur neque quam in erat. Sed ultricies aliquam hendrerit. Etiam non aliquam ipsum, id rutrum magna. Morbi id tincidunt mauris. Vestibulum nec iaculis massa. Etiam fringilla, orci quis faucibus vulputate, risus nibh finibus nisl, et vehicula ipsum leo a tortor. Curabitur mauris elit, bibendum vitae velit at, dignissim ornare arcu. diff --git a/src/style/style.css b/src/style/style.css new file mode 100644 index 0000000..2c59059 --- /dev/null +++ b/src/style/style.css @@ -0,0 +1,73 @@ +html,body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 14px; + background: #F0F2F4; + } + .navbar.is-white { + background: #F0F2F4; + } + .navbar-brand .brand-text { + font-size: 1.11rem; + font-weight: bold; + } + .hero-body + {background-image: url(https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Plum_trees_Kitano_Tenmangu.jpg/1200px-Plum_trees_Kitano_Tenmangu.jpg); + background-position: center; + background-size: cover; + background-repeat: no-repeat; + height: 500px; + } + .articles { + margin: 5rem 0; + margin-top: -200px; + } + .articles .content p { + line-height: 1.9; + margin: 15px 0; + } + .author-image { + position: absolute; + top: -30px; + left: 50%; + width: 60px; + height: 60px; + margin-left: -30px; + border: 3px solid #ccc; + border-radius: 50%; + } + .media-center { + display: block; + margin-bottom: 1rem; + } + .media-content { + margin-top: 3rem; + } + .article, .promo-block { + margin-top: 6rem; + } + div.column.is-8:first-child { + padding-top: 0; + margin-top: 0; + } + .article-title { + font-size: 2rem; + font-weight: lighter; + line-height: 2; + } + .article-subtitle { + color: #909AA0; + margin-bottom: 3rem; + } + .article-body { + line-height: 1.4; + margin: 0 6rem; + } + @media screen and (max-width: 991px) { + .article-body { + line-height: 1.4; + margin: 0; + } + } + .promo-block .container { + margin: 1rem 5rem; + } \ No newline at end of file