restructured to public folder
43
.eleventy.js
|
|
@ -1,43 +0,0 @@
|
||||||
const { DateTime } = require("luxon")
|
|
||||||
const syntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight")
|
|
||||||
|
|
||||||
module.exports = function (eleventyConfig) {
|
|
||||||
eleventyConfig.addPlugin(syntaxHighlight)
|
|
||||||
|
|
||||||
//eleventyConfig.addPassthroughCopy("css")
|
|
||||||
//eleventyConfig.addPassthroughCopy("src/_assets/*.png")
|
|
||||||
//eleventyConfig.addPassthroughCopy("src/_assets/*.jpg")
|
|
||||||
eleventyConfig.addPassthroughCopy("src/pwa.webmanifest")
|
|
||||||
eleventyConfig.addPassthroughCopy("src/css/*.css")
|
|
||||||
eleventyConfig.addPassthroughCopy("src/libs/**/*.js")
|
|
||||||
eleventyConfig.addPassthroughCopy({ "src/_assets/": "assets" })
|
|
||||||
|
|
||||||
eleventyConfig.addFilter("formatDate", (dateObj) => {
|
|
||||||
return DateTime.fromJSDate(dateObj, {
|
|
||||||
zone: "Europe/Berlin",
|
|
||||||
})
|
|
||||||
.setLocale("de")
|
|
||||||
.toLocaleString(DateTime.DATE_FULL)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Filter for showing excerpts of posts on the "/posts/" site, limited to 180 characters (about 4 lines on mobile)
|
|
||||||
eleventyConfig.addFilter("createExcerpt", (post) => {
|
|
||||||
// This removes "<" and ">" from the output
|
|
||||||
const content = post.replace(/(<([^>]+)>)/gi, "")
|
|
||||||
return content.substr(0, content.lastIndexOf(" ", 450)) + "..."
|
|
||||||
})
|
|
||||||
|
|
||||||
eleventyConfig.addFilter("stringify", (object) => {
|
|
||||||
return JSON.stringify(object, null, 2)
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
passthroughFileCopy: true,
|
|
||||||
dir: {
|
|
||||||
input: "src",
|
|
||||||
includes: "_includes",
|
|
||||||
data: "_data",
|
|
||||||
output: "build",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
README.md
|
|
||||||
node_modules
|
|
||||||
1
.gitignore
vendored
|
|
@ -1,2 +1,3 @@
|
||||||
node_modules
|
node_modules
|
||||||
build
|
build
|
||||||
|
_site
|
||||||
|
|
@ -9,9 +9,9 @@
|
||||||
<li id="portfolio-nav">
|
<li id="portfolio-nav">
|
||||||
<a href="/portfolio/" title="Portfolio">Portfolio</a>
|
<a href="/portfolio/" title="Portfolio">Portfolio</a>
|
||||||
</li>
|
</li>
|
||||||
<li id="workflows-nav">
|
<!--li id="workflows-nav">
|
||||||
<a href="/workflows/" title="Workflows">Workflows</a>
|
<a href="/workflows/" title="Workflows">Workflows</a>
|
||||||
</li>
|
</li-->
|
||||||
<li id="blog-nav">
|
<li id="blog-nav">
|
||||||
<a href="/blog/" title="Blog">Blog</a>
|
<a href="/blog/" title="Blog">Blog</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
@ -5,17 +5,17 @@
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
<link rel="stylesheet" href="/assets/fontawesome/css/all.css">
|
<link rel="stylesheet" href="/libraries/fontawesome/css/all.css">
|
||||||
<link rel="manifest" href="/pwa.webmanifest" />
|
<link rel="manifest" href="/pwa.webmanifest" />
|
||||||
<title>{{ title }}</title>
|
<title>{{ title }}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{% include "partials/header.njk" %}
|
{% include "_header.njk" %}
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
{{ content | safe }}
|
{{ content | safe }}
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
{% include "partials/footer.njk" %}
|
{% include "_footer.njk" %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -5,11 +5,11 @@
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
<link rel="stylesheet" href="/assets/fontawesome/css/all.css">
|
<link rel="stylesheet" href="/libraries/fontawesome/css/all.css">
|
||||||
<title>{{ title }}</title>
|
<title>{{ title }}</title>
|
||||||
</head>
|
</head>
|
||||||
<body style="background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(50, 50, 50, 0.9)), url('/assets/images/blog_mobile.jpg');">
|
<body>
|
||||||
{% include "partials/header.njk" %}
|
{% include "_header.njk" %}
|
||||||
|
|
||||||
<aside class="flex" style="margin-top: 70px;">
|
<aside class="flex" style="margin-top: 70px;">
|
||||||
<h1>{{title}}</h1>
|
<h1>{{title}}</h1>
|
||||||
|
|
@ -21,6 +21,6 @@
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
{% include "partials/footer.njk" %}
|
{% include "_footer.njk" %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -5,11 +5,13 @@
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
<link rel="stylesheet" href="/assets/fontawesome/css/all.css">
|
<link rel="stylesheet" href="/libraries/fontawesome/css/all.css">
|
||||||
<title>{{ title }}</title>
|
<title>{{ title }}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{% include "partials/header.njk" %}
|
|
||||||
|
{% include "_header.njk" %}
|
||||||
|
|
||||||
<div class="post">
|
<div class="post">
|
||||||
<aside>
|
<aside>
|
||||||
<a class="button" onclick="history.back()">
|
<a class="button" onclick="history.back()">
|
||||||
|
|
@ -26,12 +28,12 @@
|
||||||
<span>{{ page.date | formatDate }}</span>
|
<span>{{ page.date | formatDate }}</span>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<main class="flex container">
|
<main class="post-main">
|
||||||
<article>
|
<article>
|
||||||
{{ content | safe }}
|
{{ content | safe }}
|
||||||
</article>
|
</article>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
{% include "partials/footer.njk" %}
|
{% include "_footer.njk" %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
7
content/blog/blog.11tydata.js
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
export default {
|
||||||
|
layout: 'layouts/post.njk',
|
||||||
|
title: 'Unnamed',
|
||||||
|
tags: ['post'],
|
||||||
|
author: 'Luca Junge',
|
||||||
|
date: 'Created',
|
||||||
|
};
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: My blog posts
|
layout: layouts/overview.njk
|
||||||
layout: overview.njk
|
title: All blogposts
|
||||||
eleventyExcludeFromCollections: true
|
eleventyExcludeFromCollections: true
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -11,10 +11,10 @@ eleventyExcludeFromCollections: true
|
||||||
<a href="{{post.url}}">{{post.data.title}}</a>
|
<a href="{{post.url}}">{{post.data.title}}</a>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<time>{{post.date | formatDate }}</time>
|
<!--time>{{post.date | formatDate }}</time-->
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<p>{{post.templateContent | createExcerpt}}</p>
|
<p>{{post.data.excerpt}}</p>
|
||||||
|
|
||||||
<a class="button" href="{{post.url}}">
|
<a class="button" href="{{post.url}}">
|
||||||
Weiterlesen
|
Weiterlesen
|
||||||
6
content/blog/test.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
title: Hello World This is a title
|
||||||
|
excerpt: This is the excerpt
|
||||||
|
---
|
||||||
|
|
||||||
|
Creating a successful blog post involves a few key elements: engaging content, valuable insights, and a clear structure. Begin with a captivating introduction that highlights what readers will gain. In the body, break down the topic into digestible sections using headings for clarity. Keep paragraphs short, use bullet points, and include examples to keep readers interested. To wrap it up, a summary or actionable takeaway helps solidify the message. Don’t forget to add visuals, as they increase engagement and make the post more shareable.
|
||||||
13
content/contact.njk
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
title: "Kontakt"
|
||||||
|
layout: layouts/base.njk
|
||||||
|
permalink: /contact/index.html
|
||||||
|
---
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<div class="section-content">
|
||||||
|
<p>Feel free to contact me via <a href="mailto:mail@luca-junge.de">mail@luca-junge.de</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
4
content/css/fonts.css
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Montserrat';
|
||||||
|
src: url('/fonts/montserrat/Montserrat-VariableFont_wght.ttf');
|
||||||
|
}
|
||||||
12
content/css/hero.css
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
.hero {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin: 0px;
|
||||||
|
padding-top: calc(128px + 70px);
|
||||||
|
padding-bottom: 128px;
|
||||||
|
background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
|
||||||
|
url('/images/hero_image2_mobile.jpg');
|
||||||
|
background-size: cover;
|
||||||
|
object-fit: cover;
|
||||||
|
background-position: top left;
|
||||||
|
}
|
||||||
29
content/css/post.css
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
.post {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post > * {
|
||||||
|
max-width: var(--breakpoint-small);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post > aside {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-left: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post > aside > a.button {
|
||||||
|
align-self: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-main {
|
||||||
|
margin-left: 20px;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
79
content/css/sections.css
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
/* Styles for the sections, mainly used on the start page, the portfolio and workflow page */
|
||||||
|
|
||||||
|
section {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
color: #ffffff;
|
||||||
|
background-color: rgb(82, 76, 121);
|
||||||
|
padding-top: 128px;
|
||||||
|
padding-bottom: 128px;
|
||||||
|
}
|
||||||
|
|
||||||
|
section:nth-child(odd) {
|
||||||
|
background-color: #342e37;
|
||||||
|
}
|
||||||
|
|
||||||
|
section:nth-child(even) {
|
||||||
|
background-color: #342e37;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-content {
|
||||||
|
max-width: 1024px;
|
||||||
|
gap: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
margin-left: 64px;
|
||||||
|
margin-right: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-content div {
|
||||||
|
max-width: 50%;
|
||||||
|
display: flex;
|
||||||
|
row-gap: 14px;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
section h1,
|
||||||
|
section p {
|
||||||
|
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
section p {
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
line-height: 1.8em;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
section h1 {
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-background {
|
||||||
|
background-size: cover;
|
||||||
|
object-fit: cover;
|
||||||
|
background-position: center;
|
||||||
|
backdrop-filter: blur(3px);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 512px) {
|
||||||
|
/* Make the left-to-right sections top-to-bottom */
|
||||||
|
|
||||||
|
.section-content {
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-content div {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-content {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
51
content/css/style.css
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
@import url('./utilities.css');
|
||||||
|
@import url('./fonts.css');
|
||||||
|
@import url('./normalize.css');
|
||||||
|
@import url('./variables.css');
|
||||||
|
@import url('./header.css');
|
||||||
|
@import url('./footer.css');
|
||||||
|
@import url('./sections.css');
|
||||||
|
@import url('./hero.css');
|
||||||
|
@import url('./post.css');
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
color: #ffffff;
|
||||||
|
font-family: 'Montserrat', sans-serif;
|
||||||
|
background-color: #342e37;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Button */
|
||||||
|
button,
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: none;
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 12px 16px;
|
||||||
|
transition: background-color 0.25s ease-in-out, border 0.25s ease-in-out;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-backdrop-filter: blur(4px);
|
||||||
|
backdrop-filter: blur(4px);
|
||||||
|
background-color: rgba(0, 0, 0, 0.7);
|
||||||
|
border: 3px solid rgba(0, 0, 0, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover,
|
||||||
|
.button:hover,
|
||||||
|
button:focus-visible,
|
||||||
|
.button:focus-visible {
|
||||||
|
background-color: rgba(60, 60, 60, 0.7);
|
||||||
|
border: 3px solid rgba(60, 60, 60, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.inline-button {
|
||||||
|
color: rgb(51, 100, 224);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
23
content/css/utilities.css
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
:root {
|
||||||
|
--distance-small: 4px;
|
||||||
|
--distance-medium: 8px;
|
||||||
|
--distance-large: 12px;
|
||||||
|
--distance-huge: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-padding {
|
||||||
|
padding: var(--distance-large);
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: var(--breakpoint);
|
||||||
|
margin-left: 32px;
|
||||||
|
margin-right: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
14
content/css/variables.css
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
:root {
|
||||||
|
--white: #ffffff;
|
||||||
|
--black: #000000;
|
||||||
|
|
||||||
|
--background-color: #393e46;
|
||||||
|
--dark-background-color: #2d3138;
|
||||||
|
--text-color: #eeeeee;
|
||||||
|
--accent: #00adb5;
|
||||||
|
|
||||||
|
--border-radius: 8px;
|
||||||
|
|
||||||
|
--breakpoint-small: 512px;
|
||||||
|
--breakpoint: 1024px;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
layout: base.njk
|
layout: layouts/base.njk
|
||||||
title: luca-junge.de
|
title: luca-junge.de
|
||||||
permalink: /index.html
|
permalink: /index.html
|
||||||
---
|
---
|
||||||
|
|
@ -16,7 +16,7 @@ permalink: /index.html
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('./assets/images/museum2_mobile.jpg');">
|
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('/images/museum2_mobile.jpg');">
|
||||||
<div class="section-content">
|
<div class="section-content">
|
||||||
<div>
|
<div>
|
||||||
<h1>Interactive Applications & Games</h1>
|
<h1>Interactive Applications & Games</h1>
|
||||||
|
|
@ -28,7 +28,7 @@ permalink: /index.html
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="section-background" style="display: none; background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('./assets/images/portfolio_mobile.jpg');">
|
<section class="section-background" style="display: none; background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('/images/portfolio_mobile.jpg');">
|
||||||
<div class="section-content">
|
<div class="section-content">
|
||||||
<div>
|
<div>
|
||||||
<h1>Open Source Workflow</h1>
|
<h1>Open Source Workflow</h1>
|
||||||
|
|
@ -39,7 +39,7 @@ permalink: /index.html
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('./assets/images/portfolio_mobile.jpg');">
|
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('/images/portfolio_mobile.jpg');">
|
||||||
<div class="section-content">
|
<div class="section-content">
|
||||||
<div>
|
<div>
|
||||||
<h1>My Portfolio</h1>
|
<h1>My Portfolio</h1>
|
||||||
|
|
@ -51,20 +51,7 @@ permalink: /index.html
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('./assets/images/workflows_mobile.jpg');">
|
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('/images/blog_mobile.jpg');">
|
||||||
<div class="section-content">
|
|
||||||
<div>
|
|
||||||
<h1>My Workflows</h1>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<p>Over the years I have developed workflows and techniques to get the most out of my tools I use which I want to share here.</p>
|
|
||||||
<p>To see how I create my applications, see my documented workflows.</p>
|
|
||||||
<a class="button" href="/workflows/">Explore my Workflows</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('./assets/images/blog_mobile.jpg');">
|
|
||||||
<div class="section-content">
|
<div class="section-content">
|
||||||
<div>
|
<div>
|
||||||
<h1>My Blog</h1>
|
<h1>My Blog</h1>
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
---
|
---
|
||||||
|
layout: layouts/base.njk
|
||||||
title: "My Portfolio"
|
title: "My Portfolio"
|
||||||
layout: base.njk
|
permalink: /portfolio/index.html
|
||||||
---
|
---
|
||||||
|
|
||||||
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('/assets/images/under-construction_mobile.jpg');">
|
<section class="section-background" style="background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('/images/under-construction_mobile.jpg');">
|
||||||
<div class="section-content">
|
<div class="section-content">
|
||||||
<p>My Portfolio is currently under construction</p>
|
<p>My Portfolio is currently under construction</p>
|
||||||
</div>
|
</div>
|
||||||
34
eleventy.config.js
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */
|
||||||
|
export default function (eleventyConfig) {
|
||||||
|
// Folder configuration
|
||||||
|
eleventyConfig.setInputDirectory('content');
|
||||||
|
eleventyConfig.setIncludesDirectory('../_includes'); // relative to the input directory, therefore the ../
|
||||||
|
eleventyConfig.setOutputDirectory('_site');
|
||||||
|
|
||||||
|
// Ignores
|
||||||
|
eleventyConfig.ignores.add('node_modules');
|
||||||
|
eleventyConfig.ignores.add('README.md');
|
||||||
|
eleventyConfig.ignores.add('public/images/original/');
|
||||||
|
|
||||||
|
// Passthroughs
|
||||||
|
eleventyConfig.addPassthroughCopy('content/pwa.webmanifest');
|
||||||
|
eleventyConfig.addPassthroughCopy('content/css/*.css');
|
||||||
|
|
||||||
|
// TODO: Figure out how to prevent public/images/original from syncing
|
||||||
|
eleventyConfig.addPassthroughCopy({ 'public/': '/' });
|
||||||
|
|
||||||
|
eleventyConfig.setFrontMatterParsingOptions({
|
||||||
|
excerpt: true,
|
||||||
|
// Optional, default is "---"
|
||||||
|
excerpt_separator: '<!-- excerpt -->',
|
||||||
|
});
|
||||||
|
|
||||||
|
// Custom date filter
|
||||||
|
eleventyConfig.addFilter('formatDate', (dateObj) => {
|
||||||
|
return new Intl.DateTimeFormat('de-DE', {
|
||||||
|
day: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
year: 'numeric',
|
||||||
|
}).format(dateObj);
|
||||||
|
});
|
||||||
|
}
|
||||||
10462
package-lock.json
generated
44
package.json
|
|
@ -1,28 +1,20 @@
|
||||||
{
|
{
|
||||||
"name": "website",
|
"name": "luca-junge.de",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "",
|
"description": "Source code for my website",
|
||||||
"main": "index.js",
|
"type": "module",
|
||||||
"scripts": {
|
"main": "index.js",
|
||||||
"start": "npm run dev",
|
"scripts": {
|
||||||
"optimize": "./compress_images.sh",
|
"start": "npm run dev",
|
||||||
"dev": "npx @11ty/eleventy --serve",
|
"optimize": "./compress_images.sh",
|
||||||
"build": "npx @11ty/eleventy",
|
"dev": "npx @11ty/eleventy --serve",
|
||||||
"deploy": "rsync -av build/* server:/tmp/build/ && ssh server 'sudo cp -r /tmp/build/* ~/www/luca-junge.de/'"
|
"build": "npx @11ty/eleventy",
|
||||||
},
|
"deploy": "rsync -av --rsync-path='mkdir -p /tmp/luca-junge.de-build/ && rsync' _site/* server:/tmp/luca-junge.de-build/ && ssh server 'sudo cp -r /tmp/luca-junge.de-build/* ~/www/luca-junge.de/'"
|
||||||
"keywords": [],
|
},
|
||||||
"author": "Luca Junge",
|
"keywords": [],
|
||||||
"license": "MIT",
|
"author": "Luca Junge <LucaJunge@posteo.de> (https://luca-junge.de/)",
|
||||||
"devDependencies": {
|
"license": "MIT",
|
||||||
"@11ty/eleventy": "^1.0.2",
|
"devDependencies": {
|
||||||
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
|
"@11ty/eleventy": "^3.0.0"
|
||||||
"autoprefixer": "^10.4.13",
|
}
|
||||||
"npm-run-all": "^4.1.5",
|
|
||||||
"postcss": "^8.4.18",
|
|
||||||
"prettier": "2.7.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"chart.js": "^4.4.0",
|
|
||||||
"luxon": "^3.1.0"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 484 KiB After Width: | Height: | Size: 484 KiB |
|
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 266 KiB After Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 347 KiB After Width: | Height: | Size: 347 KiB |
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 3.7 MiB After Width: | Height: | Size: 3.7 MiB |
|
Before Width: | Height: | Size: 3.4 MiB After Width: | Height: | Size: 3.4 MiB |
|
Before Width: | Height: | Size: 6.1 MiB After Width: | Height: | Size: 6.1 MiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 8.9 MiB After Width: | Height: | Size: 8.9 MiB |
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.1 MiB |
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 3.8 MiB After Width: | Height: | Size: 3.8 MiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 241 KiB |
|
Before Width: | Height: | Size: 420 KiB After Width: | Height: | Size: 420 KiB |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 161 KiB |
|
|
@ -1,71 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<link rel="stylesheet" href="/css/style.css">
|
|
||||||
<link rel="stylesheet" href="/assets/fontawesome/css/all.css">
|
|
||||||
<script src="/libs/chart.min.js"></script>
|
|
||||||
<title>{{ title }}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
{% include "partials/header.njk" %}
|
|
||||||
|
|
||||||
<aside>
|
|
||||||
|
|
||||||
<a onclick="history.back()">
|
|
||||||
<i class="fa fa-solid fa-angle-left"></i>Zurück
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<h1 >{{ title }}</h1>
|
|
||||||
<span>{{ page.date | formatDate }}</span>
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
<main id="content">
|
|
||||||
<canvas id="chart" height="200"></canvas>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
{% include "partials/footer.njk" %}
|
|
||||||
|
|
||||||
<script>
|
|
||||||
let projectData = {{ projects | stringify | safe }}
|
|
||||||
let chart = new Chart(document.querySelector("#chart"), {
|
|
||||||
type: "pie",
|
|
||||||
data: {
|
|
||||||
labels: projectData.map(row => row.name),
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
data: projectData.map(row => row.amount)
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
plugins: {
|
|
||||||
tooltip: {
|
|
||||||
callbacks: {
|
|
||||||
label: function (context) {
|
|
||||||
let label = context.dataset.label || '';
|
|
||||||
|
|
||||||
if (label) {
|
|
||||||
label += ': ';
|
|
||||||
}
|
|
||||||
|
|
||||||
label += new Intl
|
|
||||||
.NumberFormat('de-DE', {
|
|
||||||
style: 'currency',
|
|
||||||
currency: 'EUR'
|
|
||||||
})
|
|
||||||
.format(context.parsed);
|
|
||||||
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
responsive: false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB |
|
|
@ -1,68 +0,0 @@
|
||||||
---
|
|
||||||
title: Adding custom icons for MIME types on linux
|
|
||||||
sources:
|
|
||||||
- https://blog.robertelder.org/custom-mime-type-ubuntu/
|
|
||||||
- another source
|
|
||||||
---
|
|
||||||
|
|
||||||
# The problem
|
|
||||||
|
|
||||||
I frequently work with 3D models in the web and therefore with .gltf or .glb files. These formats are the best choice for compressing and optimizing models for the web but they still seem to lack support in operating systems and their file managers. That is also the case for the preview icons. For example, that's how a .gltf file shows up in the default file manager in Fedora 38, which is Nautilus:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
That's obviously not very helpful. It's blurry, shows a warning symbol and does not really represent the file's contents.
|
|
||||||
|
|
||||||
I was wondering if it's possible to change icons for specific file types (also called MIME types) and as it turns out, it's possible!
|
|
||||||
|
|
||||||
## What to do
|
|
||||||
|
|
||||||
First, it's important to make the file extension known to the operating system. You can find existing custom definitions for all users in the `/usr/share/mime/packages` folder:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Notice the `gltf.xml` and `glb.xml` files? For every file type you want to add a custom icon to you need to add a corresponding `.xml` file. Let's look at the `glb.xml` file for reference:
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
|
|
||||||
<mime-type type="model/gltf-binary">
|
|
||||||
<comment>glTF Binary Format MIME Type</comment>
|
|
||||||
<glob pattern="*.glb"/>
|
|
||||||
</mime-type>
|
|
||||||
</mime-info>
|
|
||||||
```
|
|
||||||
|
|
||||||
The important part is the `<mime-type type="model/gltf-binary">` and the `<glob pattern="*.glb">` line. Add a new file and change the lines according to your MIME type and file extension and also name the file accordingly.
|
|
||||||
|
|
||||||
### Update the mime database
|
|
||||||
|
|
||||||
The next step is to update the mime database to give your defined MIME types to files ending with .glb or .gltf.
|
|
||||||
You can do that with:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo update-mime-database /usr/share/mime
|
|
||||||
```
|
|
||||||
|
|
||||||
This will generate a folder with your MIME type xml definition in `/usr/share/mime/`, so for `.glb` and `.gltf` it will create the following files:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
luca@carbon /usr/share/mime $ tree model
|
|
||||||
model
|
|
||||||
├── 3mf.xml
|
|
||||||
├── gltf-binary.xml
|
|
||||||
├── gltf+json.xml
|
|
||||||
└── ...
|
|
||||||
|
|
||||||
1 directory, 4 files
|
|
||||||
```
|
|
||||||
|
|
||||||
### Add the icons to your file types
|
|
||||||
|
|
||||||
The final step is getting your .svg icon ready and connect it to your MIME type. Copy your svg icon to `/usr/share/icons/hicolor/scalable/mimetypes/<mimetype-group>-<mimetype>.svg`. For .glb the mimetype-group would be `model` and the mimetype would be `gltf-binary`, resulting in this line for the whole filepath:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/usr/share/icons/hicolor/scalable/mimetypes/model-binary-gltf.svg
|
|
||||||
```
|
|
||||||
|
|
||||||
Now you just need to update your icon database with `sudo update-icon-caches /usr/share/icons/*` on Debian/Ubuntu or `sudo gtk-update-icon-cache /usr/share/icons/*` on Fedora. You may need to restart you system to get the icon to show up.
|
|
||||||
|
Before Width: | Height: | Size: 20 KiB |
|
|
@ -1,26 +0,0 @@
|
||||||
function showDraft(data) {
|
|
||||||
const isDraft = 'draft' in data && data.draft !== false
|
|
||||||
|
|
||||||
return !isDraft
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function () {
|
|
||||||
return {
|
|
||||||
eleventyComputed: {
|
|
||||||
eleventyExcludeFromCollections: function (data) {
|
|
||||||
if (showDraft(data)) {
|
|
||||||
return data.eleventyExcludeFromCollections;
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
permalink: function (data) {
|
|
||||||
if (showDraft(data)) {
|
|
||||||
return data.permalink
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"layout": "post.njk",
|
|
||||||
"title": "Unnamed",
|
|
||||||
"tags": "post",
|
|
||||||
"author": "Luca Junge",
|
|
||||||
"date": "Created"
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
---
|
|
||||||
title: Open Source Donations
|
|
||||||
layout: pie-chart.njk
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
{
|
|
||||||
"projects": [
|
|
||||||
{
|
|
||||||
"name": "Godot Engine",
|
|
||||||
"amount": "25"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Kenney (Game Assets)",
|
|
||||||
"amount": "4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mozilla Thunderbird",
|
|
||||||
"amount": "5.70"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
title: This is a test post with a very long title lorem ipsum dolor sit amet
|
|
||||||
draft: true
|
|
||||||
---
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
---
|
|
||||||
title: "Kontakt"
|
|
||||||
layout: base.njk
|
|
||||||
---
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<div class="section-content">
|
|
||||||
<p>Feel free to contact me via <a href="mailto:kontakt@luca-junge.de">kontakt@luca-junge.de</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</section>
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
@font-face {
|
|
||||||
font-family: "Montserrat";
|
|
||||||
src: url("/assets/fonts/Montserrat-VariableFont_wght.ttf");
|
|
||||||
}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
.hero {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
margin: 0px;
|
|
||||||
padding-top: calc(128px + 70px);
|
|
||||||
padding-bottom: 128px;
|
|
||||||
background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
|
|
||||||
url("/assets/images/hero_image2_mobile.jpg");
|
|
||||||
background-size: cover;
|
|
||||||
object-fit: cover;
|
|
||||||
background-position: top left;
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
.post {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
margin-top: 70px;
|
|
||||||
max-width: var(--breakpoint);
|
|
||||||
}
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
/* Styles for the sections, mainly used on the start page, the portfolio and workflow page */
|
|
||||||
|
|
||||||
section {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
color: #ffffff;
|
|
||||||
background-color: rgb(82, 76, 121);
|
|
||||||
padding-top: 128px;
|
|
||||||
padding-bottom: 128px;
|
|
||||||
}
|
|
||||||
|
|
||||||
section:nth-child(odd) {
|
|
||||||
background-color: rgb(82, 76, 121);
|
|
||||||
}
|
|
||||||
|
|
||||||
section:nth-child(even) {
|
|
||||||
background-color: rgb(150, 143, 194);
|
|
||||||
}
|
|
||||||
|
|
||||||
.section-content {
|
|
||||||
max-width: 1024px;
|
|
||||||
gap: 20px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
margin-left: 64px;
|
|
||||||
margin-right: 64px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section-content div {
|
|
||||||
max-width: 50%;
|
|
||||||
display: flex;
|
|
||||||
row-gap: 14px;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
section h1,
|
|
||||||
section p {
|
|
||||||
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.8);
|
|
||||||
}
|
|
||||||
|
|
||||||
section p {
|
|
||||||
padding: 0px;
|
|
||||||
margin: 0px;
|
|
||||||
line-height: 1.8em;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
section h1 {
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section-background {
|
|
||||||
background-size: cover;
|
|
||||||
object-fit: cover;
|
|
||||||
background-position: center;
|
|
||||||
backdrop-filter: blur(3px);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 512px) {
|
|
||||||
/* Make the left-to-right sections top-to-bottom */
|
|
||||||
|
|
||||||
|
|
||||||
.section-content {
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section-content div {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section-content {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
@import url("./utilities.css");
|
|
||||||
@import url("./fonts.css");
|
|
||||||
@import url("./normalize.css");
|
|
||||||
@import url("./variables.css");
|
|
||||||
@import url("./header.css");
|
|
||||||
@import url("./footer.css");
|
|
||||||
@import url("./sections.css");
|
|
||||||
@import url("./hero.css");
|
|
||||||
@import url("./post.css");
|
|
||||||
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
color: #ffffff;
|
|
||||||
font-family: "Montserrat", sans-serif;
|
|
||||||
background-color: rgba(59, 66, 82, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Button */
|
|
||||||
button,
|
|
||||||
.button {
|
|
||||||
display: inline-block;
|
|
||||||
box-sizing: border-box;
|
|
||||||
border: none;
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
padding: 12px 16px;
|
|
||||||
transition: background-color 0.25s ease-in-out, border 0.25s ease-in-out;
|
|
||||||
border-radius: 8px;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
-webkit-backdrop-filter: blur(4px);
|
|
||||||
backdrop-filter: blur(4px);
|
|
||||||
background-color: rgba(0, 0, 0, 0.7);
|
|
||||||
border: 3px solid rgba(0, 0, 0, 0.7);
|
|
||||||
}
|
|
||||||
|
|
||||||
button:hover,
|
|
||||||
.button:hover,
|
|
||||||
button:focus-visible,
|
|
||||||
.button:focus-visible {
|
|
||||||
background-color: rgba(60, 60, 60, 0.7);
|
|
||||||
border: 3px solid rgba(60, 60, 60, 0.7);
|
|
||||||
}
|
|
||||||
|
|
||||||
.inline-button {
|
|
||||||
color: rgb(51, 100, 224);
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
:root {
|
|
||||||
--distance-small: 4px;
|
|
||||||
--distance-medium: 8px;
|
|
||||||
--distance-large: 12px;
|
|
||||||
--distance-huge: 16px;
|
|
||||||
--breakpoint: 1024px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-padding {
|
|
||||||
padding: var(--distance-large);
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
max-width: var(--breakpoint);
|
|
||||||
margin-left: 32px;
|
|
||||||
margin-right: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flex {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
:root {
|
|
||||||
--white: #ffffff;
|
|
||||||
--black: #000000;
|
|
||||||
|
|
||||||
--background-color: #393e46;
|
|
||||||
--dark-background-color: #2d3138;
|
|
||||||
--text-color: #eeeeee;
|
|
||||||
--accent: #00adb5;
|
|
||||||
|
|
||||||
--border-radius: 8px;
|
|
||||||
}
|
|
||||||
1
src/libs/chart.min.js
vendored
|
|
@ -1,23 +0,0 @@
|
||||||
---
|
|
||||||
title: "My Workflows"
|
|
||||||
layout: overview.njk
|
|
||||||
eleventyExcludeFromCollections: true
|
|
||||||
---
|
|
||||||
|
|
||||||
{%- for post in collections.workflow -%}
|
|
||||||
<article>
|
|
||||||
<header>
|
|
||||||
<h1>
|
|
||||||
<a href="{{post.url}}">{{post.data.title}}</a>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<time>{{post.date | formatDate }}</time>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<p>{{post.templateContent | createExcerpt}}</p>
|
|
||||||
|
|
||||||
<a class="button" href="{{post.url}}">
|
|
||||||
Weiterlesen
|
|
||||||
</a>
|
|
||||||
</article>
|
|
||||||
{%- endfor -%}
|
|
||||||