init
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
result
|
||||
.direnv
|
92
README.md
Normal file
|
@ -0,0 +1,92 @@
|
|||
# Fediversity web site
|
||||
|
||||
This web site is built with a static site generator based on the Nix language [module system](https://nix.dev/tutorials/module-system/).
|
||||
It has unique features such as:
|
||||
- correct-by-construction relative links, automatic redirects for moved pages
|
||||
- correct-by-construction content fields
|
||||
- customisable templating and content structure, all seamlessly expressed in the Nix language
|
||||
- correct-by-construction spec-compliant HTML output
|
||||
- content source organisation independent of output structure
|
||||
|
||||
Structured content is managed through Nix expressions, and copy is written in [CommonMark](https://commonmark.org/).
|
||||
|
||||
# Contributing
|
||||
|
||||
- [Install Nix](https://nix.dev/install-nix)
|
||||
- [Set up `direnv`](https://github.com/nix-community/nix-direnv#installation)
|
||||
- Run `direnv allow` in the directory where repository is stored on your machine
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> This is a security boundary, and allows automatically running code from this repository on your machine.
|
||||
|
||||
- Start a live preview in a different terminal:
|
||||
|
||||
```bash
|
||||
devmode
|
||||
```
|
||||
|
||||
This will open your default web browser and automatically reload the page when the source changes.
|
||||
|
||||
- Edit any of the files, see [repository layout](#repository-layout) for guidance
|
||||
|
||||
# Testing
|
||||
|
||||
As a derivation, e.g. for CI:
|
||||
|
||||
```bash
|
||||
nix-build -A tests
|
||||
```
|
||||
|
||||
In the development shell:
|
||||
|
||||
```bash
|
||||
run-tests
|
||||
```
|
||||
|
||||
Running tests in a loop on source code changes:
|
||||
|
||||
```bash
|
||||
test-loop
|
||||
```
|
||||
|
||||
# Repository layout
|
||||
|
||||
- [content](./content)
|
||||
|
||||
Content of the web site is managed here.
|
||||
The entry point is [`content/default.nix`](./content/default.nix) and is built to correspond to `index.html` in the result.
|
||||
All other content sources are automatically included in `imports`, and can be accessed though the `config` module argument.
|
||||
|
||||
- [structure](./structure)
|
||||
|
||||
Definitions of content data structures, such as pages, articles, menus, collections, etc.
|
||||
|
||||
- [presentation](./presentation)
|
||||
|
||||
Code specific to how the web site is rendered.
|
||||
In particular, it encodes the mechanism for distributing content to files, and for putting together files for the final result.
|
||||
|
||||
In principle, different output formats (such as RSS feeds) are possible, and would be implemented there.
|
||||
|
||||
- [default.nix](./default.nix)
|
||||
|
||||
Entry point for building the project.
|
||||
This is where content, structure, and presentation are wired up.
|
||||
|
||||
- [shell.nix](./shell.nix)
|
||||
|
||||
Convenience wrapper to enable running `nix-shell` without arguments.
|
||||
|
||||
- [lib.nix](./lib.nix)
|
||||
|
||||
Reusable convenience functions.
|
||||
Also exposed under the `lib` attribute in [default.nix](./default.nix).
|
||||
|
||||
- [npins](./npins)
|
||||
|
||||
Dependencies, managed with [`npins`](https://github.com/andir/npins/).
|
||||
|
||||
- [README.md](./README.md)
|
||||
|
||||
This file.
|
BIN
assets/images/avatar-sm.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
assets/images/avatar.png
Executable file
After Width: | Height: | Size: 2.2 KiB |
BIN
assets/images/avhuffelenmastodonpin.jpg
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
assets/images/banner.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
assets/images/bergen-airport.jpeg
Normal file
After Width: | Height: | Size: 3.2 MiB |
BIN
assets/images/call-to-action.png
Executable file
After Width: | Height: | Size: 19 KiB |
BIN
assets/images/checkbox-illustration-scaled.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
assets/images/checkbox-illustration.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
assets/images/code.png
Normal file
After Width: | Height: | Size: 769 B |
BIN
assets/images/dc1.jpg
Normal file
After Width: | Height: | Size: 5.8 MiB |
BIN
assets/images/favicon-archive.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
assets/images/gallery/01.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
assets/images/gallery/02.jpg
Normal file
After Width: | Height: | Size: 697 KiB |
BIN
assets/images/gallery/03.jpg
Normal file
After Width: | Height: | Size: 254 KiB |
BIN
assets/images/gallery/04.jpg
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
assets/images/gallery/05.jpg
Normal file
After Width: | Height: | Size: 210 KiB |
BIN
assets/images/gallery/06.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
assets/images/globe.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
1
assets/images/home.svg
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
assets/images/image-placeholder.png
Executable file
After Width: | Height: | Size: 4.8 KiB |
BIN
assets/images/kabelachterkant.jpg
Normal file
After Width: | Height: | Size: 7.4 MiB |
BIN
assets/images/logo-archive.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
assets/images/logo-darkmode-archive.png
Normal file
After Width: | Height: | Size: 3 KiB |
BIN
assets/images/logo-darkmode.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
assets/images/logo.png
Normal file
After Width: | Height: | Size: 19 KiB |
1
assets/images/mastodon.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="18px" height="18px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><path d="M17.038,10.791c-0.247,1.27 -2.211,2.659 -4.466,2.928c-1.176,0.141 -2.334,0.27 -3.569,0.213c-2.019,-0.092 -3.613,-0.482 -3.613,-0.482c0,0.197 0.012,0.384 0.037,0.559c0.262,1.993 1.976,2.112 3.599,2.168c1.638,0.056 3.097,-0.404 3.097,-0.404l0.067,1.481c0,-0 -1.146,0.615 -3.187,0.728c-1.126,0.062 -2.523,-0.028 -4.151,-0.459c-3.531,-0.934 -4.138,-4.698 -4.231,-8.516c-0.028,-1.134 -0.011,-2.203 -0.011,-3.097c0,-3.905 2.559,-5.05 2.559,-5.05c1.29,-0.592 3.503,-0.841 5.804,-0.86l0.057,-0c2.301,0.019 4.516,0.268 5.806,0.86c0,0 2.558,1.145 2.558,5.05c0,-0 0.032,2.881 -0.356,4.881Zm-2.661,-4.578c-0,-0.967 -0.246,-1.735 -0.74,-2.303c-0.51,-0.568 -1.178,-0.859 -2.006,-0.859c-0.959,0 -1.684,0.368 -2.164,1.105l-0.467,0.783l-0.467,-0.783c-0.48,-0.737 -1.205,-1.105 -2.164,-1.105c-0.828,0 -1.496,0.291 -2.005,0.859c-0.495,0.568 -0.741,1.336 -0.741,2.303l0,4.728l1.873,-0l0,-4.589c0,-0.968 0.407,-1.459 1.222,-1.459c0.9,0 1.351,0.583 1.351,1.734l0,2.512l1.862,0l0,-2.512c0,-1.151 0.451,-1.734 1.351,-1.734c0.815,0 1.222,0.491 1.222,1.459l-0,4.589l1.873,-0l-0,-4.728Z" style="fill:#fff;"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/images/no-search-found.png
Executable file
After Width: | Height: | Size: 8.1 KiB |
BIN
assets/images/og-image.png
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
assets/images/rack.jpg
Normal file
After Width: | Height: | Size: 4.7 MiB |
BIN
assets/images/service-1.png
Executable file
After Width: | Height: | Size: 11 KiB |
BIN
assets/images/service-2.png
Executable file
After Width: | Height: | Size: 19 KiB |
BIN
assets/images/service-3.png
Executable file
After Width: | Height: | Size: 16 KiB |
BIN
assets/images/stepping-up.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
assets/images/tvtoren1.jpg
Normal file
After Width: | Height: | Size: 2.7 MiB |
BIN
assets/images/uitzicht.jpg
Normal file
After Width: | Height: | Size: 3.9 MiB |
BIN
assets/images/user.png
Normal file
After Width: | Height: | Size: 852 B |
BIN
assets/images/users-scaled.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
assets/images/users.png
Normal file
After Width: | Height: | Size: 968 B |
1
assets/images/users.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" viewBox="0 0 24 24" fill="none" stroke="#ff6e00" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-users"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg>
|
After Width: | Height: | Size: 397 B |
BIN
assets/images/website-new.png
Normal file
After Width: | Height: | Size: 18 KiB |
59
assets/scss/base.scss
Executable file
|
@ -0,0 +1,59 @@
|
|||
html {
|
||||
@apply text-base-sm md:text-base;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-body font-primary font-normal leading-relaxed text-text;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
@apply font-secondary font-bold leading-tight text-dark;
|
||||
}
|
||||
|
||||
h1,
|
||||
.h1 {
|
||||
@apply text-h1-sm md:text-h1;
|
||||
}
|
||||
|
||||
h2,
|
||||
.h2 {
|
||||
@apply text-h2-sm md:text-h2;
|
||||
}
|
||||
|
||||
h3,
|
||||
.h3 {
|
||||
@apply text-h3-sm md:text-h3;
|
||||
}
|
||||
|
||||
h4,
|
||||
.h4 {
|
||||
@apply text-h4;
|
||||
}
|
||||
|
||||
h5,
|
||||
.h5 {
|
||||
@apply text-h5;
|
||||
}
|
||||
|
||||
h6,
|
||||
.h6 {
|
||||
@apply text-h6;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
@apply font-semibold;
|
||||
}
|
||||
|
||||
code {
|
||||
@apply after:border-none;
|
||||
}
|
||||
|
||||
blockquote > p {
|
||||
@apply my-0 #{!important};
|
||||
}
|
15
assets/scss/buttons.scss
Executable file
|
@ -0,0 +1,15 @@
|
|||
.btn {
|
||||
@apply inline-block rounded border border-transparent px-5 py-2 font-semibold capitalize transition;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
@apply rounded-sm px-4 py-1.5 text-sm;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
@apply border-primary bg-primary text-white;
|
||||
}
|
||||
|
||||
.btn-outline-primary {
|
||||
@apply border-dark text-dark hover:bg-dark bg-transparent hover:text-white;
|
||||
}
|
74
assets/scss/components.scss
Executable file
|
@ -0,0 +1,74 @@
|
|||
main {
|
||||
min-height: 70vh;
|
||||
}
|
||||
|
||||
// section style
|
||||
.section {
|
||||
@apply py-24 xl:py-28;
|
||||
&-sm {
|
||||
@apply py-16 xl:py-20;
|
||||
}
|
||||
}
|
||||
|
||||
// container
|
||||
.container {
|
||||
@apply mx-auto px-4 2xl:max-w-[1320px];
|
||||
}
|
||||
|
||||
// form style
|
||||
.form-input {
|
||||
@apply bg-theme-light text-dark placeholder:text-light focus:border-primary w-full rounded border-transparent px-6 py-4 focus:ring-transparent;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
@apply font-secondary text-dark mb-4 block text-xl font-normal;
|
||||
}
|
||||
|
||||
// social icons
|
||||
.social-icons {
|
||||
@apply space-x-4;
|
||||
li {
|
||||
@apply inline-block;
|
||||
a {
|
||||
@apply bg-primary flex h-9 w-9 items-center justify-center rounded text-center leading-9 text-white;
|
||||
svg {
|
||||
@apply h-5 w-5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// swiper pagination
|
||||
.swiper-pagination-bullet {
|
||||
@apply bg-theme-light h-2.5 w-2.5 opacity-100 mx-1.5 #{!important};
|
||||
|
||||
&-active {
|
||||
@apply bg-primary h-4 w-4 #{!important};
|
||||
}
|
||||
}
|
||||
|
||||
// content style
|
||||
.content {
|
||||
@apply prose max-w-none;
|
||||
@apply prose-headings:mb-[.3em] prose-headings:mt-[.6em] prose-headings:text-dark;
|
||||
@apply prose-h1:text-h1-sm md:prose-h1:text-h1;
|
||||
@apply prose-h2:text-h2-sm md:prose-h2:text-h2;
|
||||
@apply prose-h3:text-h3-sm md:prose-h3:text-h3;
|
||||
@apply prose-img:max-w-full prose-img:rounded;
|
||||
@apply prose-hr:border-border;
|
||||
@apply prose-p:text-base prose-p:text-text;
|
||||
@apply prose-blockquote:rounded-lg prose-blockquote:border prose-blockquote:border-l-[10px] prose-blockquote:border-primary prose-blockquote:bg-theme-light prose-blockquote:px-8 prose-blockquote:py-10 prose-blockquote:font-secondary prose-blockquote:text-2xl prose-blockquote:not-italic prose-blockquote:text-dark;
|
||||
@apply prose-pre:rounded-lg prose-pre:bg-theme-light;
|
||||
@apply prose-code:px-1;
|
||||
@apply prose-strong:text-dark;
|
||||
@apply prose-a:text-text prose-a:underline hover:prose-a:text-primary;
|
||||
@apply prose-li:text-text;
|
||||
@apply prose-table:relative prose-table:overflow-hidden prose-table:rounded-lg prose-table:before:absolute prose-table:before:left-0 prose-table:before:top-0 prose-table:before:h-full prose-table:before:w-full prose-table:before:rounded-[inherit] prose-table:before:border prose-table:before:content-[""];
|
||||
@apply prose-thead:border-border prose-thead:bg-theme-light;
|
||||
@apply prose-th:relative prose-th:z-10 prose-th:px-4 prose-th:py-[18px] prose-th:text-dark;
|
||||
@apply prose-tr:border-border;
|
||||
@apply prose-td:relative prose-td:z-10 prose-td:px-3 prose-td:py-[18px];
|
||||
.btn {
|
||||
@apply no-underline hover:text-white #{!important};
|
||||
}
|
||||
}
|
127
assets/scss/custom.scss
Executable file
|
@ -0,0 +1,127 @@
|
|||
// Add your own custom styles here
|
||||
.grid-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.column {
|
||||
flex-basis: calc(50% - 10px); /* Adjust width as necessary */
|
||||
}
|
||||
|
||||
.list {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.list-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.link {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hr-list {
|
||||
border: 0;
|
||||
border-top: 1px solid #ccc;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.list-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.link {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.time {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
|
||||
.grid-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.grid-item {
|
||||
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.header-with-image {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.header-with-image img {
|
||||
margin-right: 10px;
|
||||
max-width: 100px; /* Adjust as needed */
|
||||
max-height: 100px; /* Adjust as needed */
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.read-more-link {
|
||||
color: #FF6E00; /* Use the variable defined in theme.json */
|
||||
}
|
||||
|
||||
.center-wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
}
|
||||
|
||||
.grid-container-small {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.hr-list {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
margin-right: .5rem;
|
||||
}
|
||||
|
||||
.center-layout {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.hr-list2 {
|
||||
border: 20;
|
||||
border-top: 1px solid #FF6E00;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.header-with-image2 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.header-with-image2 img {
|
||||
display: inline-block;
|
||||
|
||||
}
|
||||
|
||||
.line {
|
||||
border-top: 1px solid #FF6E00; /* Change color and thickness as needed */
|
||||
margin: 10px 0; /* Adjust spacing between the line and the divs */
|
||||
}
|
30
assets/scss/main.scss
Executable file
|
@ -0,0 +1,30 @@
|
|||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
@import "base";
|
||||
}
|
||||
|
||||
@layer components {
|
||||
@import "components";
|
||||
@import "navigation";
|
||||
@import "buttons";
|
||||
}
|
||||
|
||||
@layer utilities {
|
||||
@import "utilities";
|
||||
}
|
||||
|
||||
@import "search";
|
||||
@import "social-share";
|
||||
@import "gallery-slider";
|
||||
@import "images";
|
||||
@import "toc";
|
||||
@import "tab";
|
||||
@import "accordion";
|
||||
@import "modal";
|
||||
@import "notice";
|
||||
|
||||
@import "module-overrides";
|
||||
@import "custom";
|
57
assets/scss/module-overrides.scss
Normal file
|
@ -0,0 +1,57 @@
|
|||
// table of contents
|
||||
.table-of-content {
|
||||
@apply overflow-hidden rounded;
|
||||
}
|
||||
|
||||
// share icons
|
||||
.share-icons {
|
||||
.share-link {
|
||||
@apply h-9 w-9 rounded leading-9;
|
||||
@apply bg-primary hover:bg-primary;
|
||||
}
|
||||
.share-icon svg {
|
||||
}
|
||||
}
|
||||
|
||||
// notice
|
||||
.notice {
|
||||
@apply rounded-lg;
|
||||
}
|
||||
|
||||
// tab
|
||||
.tab {
|
||||
@apply border-border overflow-hidden rounded-lg border;
|
||||
&-nav {
|
||||
@apply border-border bg-theme-light pl-4;
|
||||
|
||||
&-item {
|
||||
@apply text-dark px-8 text-lg #{!important};
|
||||
&.active {
|
||||
@apply border-dark;
|
||||
}
|
||||
}
|
||||
}
|
||||
&-content {
|
||||
&-panel {
|
||||
@apply px-4 pt-0 #{!important};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// accordion
|
||||
.accordion {
|
||||
@apply border-border bg-theme-light mb-6 overflow-hidden rounded-lg border;
|
||||
&-header {
|
||||
@apply text-dark;
|
||||
}
|
||||
}
|
||||
|
||||
// cookie consent
|
||||
.cookie-box {
|
||||
@apply rounded-lg #{!important};
|
||||
}
|
||||
|
||||
// slider
|
||||
.gallery-slider {
|
||||
@apply ml-0 #{!important};
|
||||
}
|
87
assets/scss/navigation.scss
Executable file
|
@ -0,0 +1,87 @@
|
|||
// navbar toggler
|
||||
input#nav-toggle:checked + label #show-button {
|
||||
@apply hidden;
|
||||
}
|
||||
|
||||
input#nav-toggle:checked + label #hide-button {
|
||||
@apply block;
|
||||
}
|
||||
|
||||
input#nav-toggle:checked ~ #nav-menu {
|
||||
@apply block;
|
||||
}
|
||||
|
||||
.header {
|
||||
@apply bg-body py-6;
|
||||
}
|
||||
|
||||
// navbar items
|
||||
.navbar {
|
||||
@apply relative flex flex-wrap items-center justify-between;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
@apply text-dark text-xl font-semibold;
|
||||
image {
|
||||
@apply max-h-full max-w-full;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-nav {
|
||||
@apply text-center lg:text-left;
|
||||
}
|
||||
|
||||
// .nav-item {
|
||||
// @apply mx-3;
|
||||
// }
|
||||
|
||||
.nav-link {
|
||||
@apply text-dark hover:text-primary block p-3 cursor-pointer font-semibold transition lg:px-2 lg:py-3;
|
||||
}
|
||||
|
||||
.nav-dropdown {
|
||||
@apply mr-0;
|
||||
& > svg {
|
||||
@apply pointer-events-none;
|
||||
}
|
||||
&.active {
|
||||
.nav-dropdown-list {
|
||||
@apply block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.nav-dropdown-list {
|
||||
@apply bg-body z-10 min-w-[180px] rounded p-4 shadow hidden lg:invisible lg:absolute lg:block lg:opacity-0;
|
||||
}
|
||||
|
||||
.nav-dropdown-item {
|
||||
@apply [&:not(:last-child)]:mb-2;
|
||||
}
|
||||
|
||||
.nav-dropdown-link {
|
||||
@apply text-dark hover:text-primary block py-1 font-semibold transition;
|
||||
}
|
||||
|
||||
//theme-switcher
|
||||
.theme-switcher {
|
||||
@apply inline-flex;
|
||||
|
||||
label {
|
||||
@apply bg-border relative inline-block h-4 w-6 cursor-pointer rounded-2xl lg:w-10;
|
||||
}
|
||||
|
||||
input {
|
||||
@apply absolute opacity-0;
|
||||
}
|
||||
|
||||
span {
|
||||
@apply bg-dark absolute -top-1 left-0 flex h-6 w-6 items-center justify-center rounded-full transition-all duration-300;
|
||||
}
|
||||
|
||||
input:checked + label {
|
||||
span {
|
||||
@apply lg:left-4;
|
||||
}
|
||||
}
|
||||
}
|
20
assets/scss/utilities.scss
Executable file
|
@ -0,0 +1,20 @@
|
|||
.bg-gradient {
|
||||
@apply bg-gradient-to-b from-[rgba(249,249,249,1)] from-[0.53%] to-white to-[83.28%];
|
||||
}
|
||||
|
||||
.rounded-sm {
|
||||
@apply rounded-[4px];
|
||||
}
|
||||
.rounded {
|
||||
@apply rounded-[6px];
|
||||
}
|
||||
.rounded-lg {
|
||||
@apply rounded-[12px];
|
||||
}
|
||||
.rounded-xl {
|
||||
@apply rounded-[16px];
|
||||
}
|
||||
|
||||
.shadow {
|
||||
box-shadow: 0px 4px 40px rgba(0, 0, 0, 0.05);
|
||||
}
|
184
content/default.nix
Normal file
|
@ -0,0 +1,184 @@
|
|||
{ config, lib, ... }:
|
||||
let
|
||||
inherit (config) pages;
|
||||
cfg = config;
|
||||
in
|
||||
{
|
||||
imports = lib.nixFiles ./.;
|
||||
|
||||
collections.news.type = cfg.content-types.article;
|
||||
collections.events.type = cfg.content-types.event;
|
||||
|
||||
pages.index =
|
||||
{ config, link, ... }:
|
||||
{
|
||||
title = "Welcome to the Fediversity project";
|
||||
description = "Fediversity web site";
|
||||
summary = ''
|
||||
This web site hosts up-to-date information about the the NGI Zero Fediversity project.
|
||||
'';
|
||||
body = ''
|
||||
${pages.fediversity.summary}
|
||||
|
||||
[Learn more about Fediversity](${link pages.fediversity})
|
||||
'';
|
||||
outputs.html = (cfg.templates.html.page config).override (
|
||||
_final: prev: {
|
||||
html = {
|
||||
head.title.text = "Fediversity";
|
||||
head.link.stylesheets = prev.html.head.link.stylesheets ++ [
|
||||
{ href = "${link cfg.assets."index.css"}"; }
|
||||
];
|
||||
body.content =
|
||||
let
|
||||
to-section =
|
||||
{
|
||||
heading,
|
||||
body,
|
||||
attrs ? { },
|
||||
}:
|
||||
{
|
||||
section = {
|
||||
heading.content = heading;
|
||||
inherit attrs;
|
||||
content = [
|
||||
(cfg.templates.html.markdown {
|
||||
name = "${config.name}-${lib.slug heading}";
|
||||
inherit body;
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
in
|
||||
[
|
||||
(lib.head prev.html.body.content)
|
||||
{
|
||||
section = {
|
||||
attrs = { };
|
||||
heading.content = config.title;
|
||||
content =
|
||||
[
|
||||
(cfg.templates.html.markdown { inherit (config) name body; })
|
||||
]
|
||||
++ (map to-section [
|
||||
{
|
||||
heading = "Fediversity grants";
|
||||
body = ''
|
||||
${pages.grants.summary}
|
||||
|
||||
[Learn more about Fediversity grants](${link pages.grants})
|
||||
'';
|
||||
}
|
||||
{
|
||||
heading = "Consortium";
|
||||
body = ''
|
||||
The Consortium behind the Fediversity project is a cooperation between NLnet, Open Internet Discourse Foundation, NORDUnet and Tweag.
|
||||
|
||||
${toString (
|
||||
map
|
||||
(partner: ''
|
||||
### ${partner.title}
|
||||
|
||||
${partner.summary}
|
||||
|
||||
[Read more about ${partner.title}](${link partner})
|
||||
'')
|
||||
(
|
||||
with pages;
|
||||
[
|
||||
nlnet
|
||||
oid
|
||||
tweag
|
||||
nordunet
|
||||
]
|
||||
)
|
||||
)}
|
||||
'';
|
||||
}
|
||||
{
|
||||
heading = "Fediverse explained";
|
||||
body = ''
|
||||
${toString (
|
||||
map
|
||||
(role: ''
|
||||
### ${role.title}
|
||||
|
||||
${role.summary}
|
||||
|
||||
[Read more about ${role.title}](${link role})
|
||||
'')
|
||||
(
|
||||
with pages;
|
||||
[
|
||||
individuals
|
||||
developers
|
||||
european-commission
|
||||
]
|
||||
)
|
||||
)}
|
||||
'';
|
||||
}
|
||||
]);
|
||||
};
|
||||
}
|
||||
]
|
||||
++ (map to-section [
|
||||
{
|
||||
heading = "News";
|
||||
attrs = {
|
||||
class = [ "collection" ];
|
||||
};
|
||||
body =
|
||||
let
|
||||
sorted = with lib; reverseList (sortOn (entry: entry.date) cfg.collections.news.entry);
|
||||
in
|
||||
lib.join "\n" (
|
||||
map (article: ''
|
||||
- ${article.date} [${article.title}](${link article})
|
||||
'') sorted
|
||||
);
|
||||
}
|
||||
{
|
||||
heading = "Events";
|
||||
attrs = {
|
||||
class = [ "collection" ];
|
||||
};
|
||||
body =
|
||||
let
|
||||
sorted = with lib; reverseList (sortOn (entry: entry.start-date) cfg.collections.events.entry);
|
||||
in
|
||||
lib.join "\n" (
|
||||
map (article: ''
|
||||
- ${article.start-date} [${article.title}](${link article})
|
||||
'') sorted
|
||||
);
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
assets."index.css".path =
|
||||
with lib;
|
||||
builtins.toFile "index.css" ''
|
||||
section h1, section h2, section h3
|
||||
{
|
||||
text-align: center;
|
||||
}
|
||||
section h1 {
|
||||
font-size: 3em;
|
||||
}
|
||||
section h2 {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
section h3 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
section.collection h1 {
|
||||
font-size: 2em;
|
||||
text-align: left;
|
||||
}
|
||||
'';
|
||||
}
|
19
content/developers.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.developers = {
|
||||
title = "Developers";
|
||||
description = "Information for developers about the Fediversity project";
|
||||
summary = ''
|
||||
As a developer building the next generation of social platforms, you are looking to make it easier to facilitate your customers to use your product. Fediversity can help.
|
||||
'';
|
||||
body = ''
|
||||
The Fediversity Project enables easy hosting for a wide variety of fediverse platforms, all based on NixOS. At the start, the project will support Mastodon, PixelFed,PeerTube, Matrix and Nexcloud, and the project is actively working to expand this offering. Other services that are offered are email (based on Stalwart) and domain registry.
|
||||
|
||||
As part of the NGI Funding, the Fediversity Project also offers grants to developers to expand the ecosystem. The NLNet website has more information on how you as a developer can apply to grants, ranging from 5.000 to 50.000 euro's.
|
||||
|
||||
If you are a developer of fediverse software, and would like to get your platform also offered for easy hosting as part of the Fediversity Project, please reach out to us. You can contact us HERE.
|
||||
|
||||
As the project is based upon NixOS, we are actively supporting making fediverse projects available as nix packages. If your project is on the fence about this, please reach out. Nix packages make updating and maintaining fediverse projects a breeze!
|
||||
'';
|
||||
};
|
||||
}
|
15
content/european-commission.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.european-commission = {
|
||||
title = "European Commission";
|
||||
description = "Information about the Fediversity project for the grant providers";
|
||||
summary = ''
|
||||
The Fediversity Project operates on a grant gratiously provided by the HORIZON fund by the EC. Learn more about the accountability of the project.
|
||||
'';
|
||||
body = ''
|
||||
The Fediversity project implements the visions outlined by the Next Generation Internet (NGI) initiative for an open internet in several ways. Most importantly, it helps with decentralisation of the internet, a core principle of the NGI, by making it easier for people to participate in the Open Social Web on their own terms. NGI's goal of empowering individuals in the digital sphere is helped by making it easy for them to set up their own servers and platforms. While a variety of Fediverse software exist, there are still barriers of entry for people. In order for people to be truly empowered, joining the fediverse needs to be as weasy as possible. Additionally, the Fediverse emphasises interoperability and openness, which are key concerns addressed by the NGI.
|
||||
|
||||
Part of the values of openness and transparency of is that the Fediversity project is that all the deliverables of the projects are have a 'Public' Dissemination level. On this page an overview of all deliverables of the Fediversity project can be found.
|
||||
'';
|
||||
};
|
||||
}
|
26
content/events.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
{ config, lib, ... }:
|
||||
{
|
||||
pages.events =
|
||||
{ link, ... }:
|
||||
rec {
|
||||
title = "Events";
|
||||
description = "Events related to the Fediverse and NixOS";
|
||||
summary = description;
|
||||
body =
|
||||
with lib;
|
||||
let
|
||||
events = map (
|
||||
event: with lib; ''
|
||||
## [${event.title}](${link event})
|
||||
|
||||
${event.start-date} ${
|
||||
optionalString (!isNull event.end-date && event.end-date != event.start-date) "to ${event.end-date}"
|
||||
} in ${event.location}
|
||||
''
|
||||
) config.collections.events.entry;
|
||||
in
|
||||
''
|
||||
${join "\n" events}
|
||||
'';
|
||||
};
|
||||
}
|
25
content/events/2024-11-zurich-zhf.nix
Normal file
|
@ -0,0 +1,25 @@
|
|||
{ config, ... }:
|
||||
{
|
||||
collections.events.entry =
|
||||
{ link, ... }:
|
||||
{
|
||||
title = "NixOS 24.11 ZHF hackathon";
|
||||
name = "zhf-24-11";
|
||||
description = "NixOS 24.11 ZHF hackathon in Zürich";
|
||||
start-date = "2024-11-23";
|
||||
end-date = "2024-11-24";
|
||||
start-time = "10:00";
|
||||
end-time = "17:00";
|
||||
location = "OST Campus Rapperswil";
|
||||
body = ''
|
||||
The biannual [Zürich NixOS ZHF hackathon](https://zurich.nix.ug/) has become somewhat of an institution for maintaining the tradition of preparing the upcoming NixOS release.
|
||||
|
||||
The main goal of the two-day gathering is to bring down the number of build failures on the [continuous integration system Hydra](https://status.nixos.org/) before the release: ZHF stands for *Zero Hydra Failures*.
|
||||
It also presents a great opportunity to learn Nix, squash bugs together, get to know each other, discuss current events, and make plans for the future.
|
||||
|
||||
This is the greatest event in the series so far, with more than 40 participants from all over Europe, including many high-profile contributors and maintainers in the Nix ecosystem.
|
||||
|
||||
[Fediversity engineers attended](${link config.collections.news.by-name.zhf-24-11}) to present prototypes and exchange ideas with other developers.
|
||||
'';
|
||||
};
|
||||
}
|
26
content/events/owc-annual-conference-2024.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.events.entry =
|
||||
{ ... }:
|
||||
{
|
||||
title = "OW2con 2024";
|
||||
description = "OW2con is the annual European open source conference in Paris";
|
||||
start-date = "2024-06-11";
|
||||
end-date = "2024-06-12";
|
||||
start-time = "09:00";
|
||||
end-time = "18:00";
|
||||
location = "Paris-Chatillon";
|
||||
body = ''
|
||||
OW2con is the European open source conference organized by OW2.
|
||||
An international meeting of developpers, IT companies, academics and non-profit organizations, OW2con brings together the entire open source community, during two days of presentations ranging from tech topics to business and ethical issues of open source.
|
||||
It also offers a unique opportunity to establish contact with peers through friendly networking sessions.
|
||||
OW2con is [open](https://www.ngi.eu/event/open-source-community-annual-conference-2024/) to all, the event is free and all sessions are held in English.
|
||||
|
||||
The OW2con’24 call for presentations is open.
|
||||
This year we are giving the highlight on the theme of open source funding:
|
||||
What are the current solutions for innovators, start-ups or ISVs to finance their development?
|
||||
Private or public financing?
|
||||
Are national and European public policies up to the challenges?
|
||||
'';
|
||||
};
|
||||
}
|
20
content/events/publicspaces-conference-2024.nix
Normal file
|
@ -0,0 +1,20 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.events.entry =
|
||||
{ ... }:
|
||||
{
|
||||
title = "PublicSpaces Conference 2024";
|
||||
description = "A conference by PublicSpaces, Taking Back the Internet.";
|
||||
start-date = "2024-06-06";
|
||||
end-date = "2024-06-07";
|
||||
start-time = "09:00";
|
||||
end-time = "18:00";
|
||||
location = "Pakhuis de Zwijger - Amsterdam";
|
||||
body = ''
|
||||
On June 6th and 7th, PublicSpaces and Waag Futurelab proudly present the fourth edition of the PublicSpaces conference under the theme 'Empowering the Internet'.
|
||||
Held at Pakhuis de Zwijger, this two-day event will feature panels, keynotes, roundtable discussions, lectures, as well as art and cultural showcases, all aimed at collectively shaping the rules for a more inclusive internet.
|
||||
Join us as we navigate towards a digital landscape where everyone has a voice.
|
||||
For more information, check out the [website](https://publicspaces.net/2024/02/01/save-the-date-publicspaces-conferentie-2024/)
|
||||
'';
|
||||
};
|
||||
}
|
27
content/events/waag-state-internet-2024.nix
Normal file
|
@ -0,0 +1,27 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.events.entry =
|
||||
{ ... }:
|
||||
{
|
||||
title = "State of the Internet 2024";
|
||||
description = "The State of the Internet 2024 by Waag";
|
||||
start-date = "2024-05-16";
|
||||
end-date = "2024-05-16";
|
||||
start-time = "18:00";
|
||||
end-time = "20:00";
|
||||
location = "OBA Oosterdok - Amsterdam";
|
||||
body = ''
|
||||
Join us at the State of the Internet 2024, where Waag Futurelab, alongside the Municipality of Amsterdam and the OBA, delves into the depths of the online realm.
|
||||
Featuring Kim van Sparrentak, Member of the European Parliament, discussing Europe's efforts to regulate Big Tech and enhance digital rights.
|
||||
Explore the impact of pivotal European laws like the GDPR and AI Act while celebrating 30 years of Waag Futurelab's dedication to democratizing technology access for all.
|
||||
|
||||
The event takes place at:
|
||||
|
||||
OBA Oosterdok <br>
|
||||
Oosterdokskade 143 <br>
|
||||
1011 DK Amsterdam
|
||||
|
||||
Registration available [here](https://waag.org/nl/event/de-staat-van-het-internet-2024-met-kim-van-sparrentak/).
|
||||
'';
|
||||
};
|
||||
}
|
19
content/fediversity.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.fediversity = {
|
||||
title = "Fediversity";
|
||||
description = "More information about the Fediversity project";
|
||||
summary = ''
|
||||
The Fediversity Project is a comprehensive effort to bring easy-to-use, hosted cloud services that have service portability and personal freedom at their core to everyone.
|
||||
'';
|
||||
body = ''
|
||||
Fediversity is a comprehensive effort to bring easy-to-use, hosted cloud services with service portability and personal freedom at their core to everyone. It wants to provide everyone with high-quality, secure IT systems for everyday use. Without tracking, without exploitation, in a way that runs everywhere and scales effortlessly. Fediversity is based on NixOS, a disruptive Linux distribution with a unique approach to package and configuration management. Built on top of the Nix package manager, NixOS is completely declarative, makes upgrading systems reliable, and has many other advantages. Because it is reproducible, it is ideally suited for complex deployment scenario’s where consistent behaviour, stability and configurability matter.
|
||||
|
||||
One such “complex” deployment scenario is running state-of-the-art services for the Fediverse, like PeerTube, Mastodon, Owncast or Lemmy — especially if you want to for instance add services like live chat or transcoding. But even running more traditional services like modern e-mail servers with possible whistles and bells can be daunting. The same holds for deploying a VPN, private cloud storage, wiki, etc. Fediversity will enable all of these use cases, and more — finally bringing these to the market in a way that is as conveient as using a hosted service.
|
||||
|
||||
Fediversity is a pilot funded by the European Commission, building on many projects funding through the Next Generation Internet initiative. The results of the project should greatly simplify the creation and delivery of robust and secure services, on the web and beyond.
|
||||
|
||||
Fediversity will deliver an ambitious development effort, but this is a vast domain with many more challenges than what any preconceived effort could tackle by itself. This is why we invite your contribution to help us reshape the state of play, and together create an open, trustworthy and reliable internet for all.
|
||||
'';
|
||||
};
|
||||
}
|
19
content/grants.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.grants = {
|
||||
title = "Grants";
|
||||
description = "How to apply for grants as part of the Fediversity Project";
|
||||
summary = ''
|
||||
Fediversity will award 450 000 euro in small to medium-size R&D grants towards solutions that bring the next generation of social networks closer. We are seeking project proposals between 5.000 and 50.000 euro’s — which should get you on your way.
|
||||
'';
|
||||
body = ''
|
||||
Fediversity invites other people to join this ambitious development effort. It is a vast domain with many more challenges than what any preconceived effort could tackle by itself. This is why we invite your contribution to help us reshape the state of play, and together create an open, trustworthy and reliable internet for all.
|
||||
|
||||
This is your opportunity to make a real difference. You tell us how your project can help Fediversity go harder, better, faster, stronger. In order to enable you to make such contributions, NLnet will award 450 000 euro in small to medium-size R&D grants towards solutions that bring the next generation of social networks closer. NLnet is seeking project proposals between 5.000 and 50.000 euro’s — which should get you on your way.
|
||||
|
||||
Noteworthy fact: many projects which are to be deployed inside Fediversity were themselves bootstrapped on precisely such a grant from NGI, and now it is your turn.
|
||||
|
||||
For more information on how to apply, check the NLnet website.
|
||||
'';
|
||||
};
|
||||
}
|
20
content/individuals.nix
Normal file
|
@ -0,0 +1,20 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.individuals = {
|
||||
title = "Individuals";
|
||||
description = "Information about the project for regular people";
|
||||
summary = ''
|
||||
Always be in control with your own data on social networks, whether that’s with Mastodon, PeerTube or Pixelfed: Fediversity makes it possible.
|
||||
'';
|
||||
body = ''
|
||||
The fediverse shows great potential in fundamentally rethinking how we approach the internet. It is a new way of thinking about how the internet can be a social web, and solves for the problems that the current Big Tech platforms have, while at the same time enabling a new wave of innovation and new ideas on the social web.
|
||||
|
||||
- Giving people control of their data and social connections, allowing them to choose whatever platform and product they want.
|
||||
- Giving people control of their privacy and their feeds, without black-box algorithms that decide for them what they get to see.
|
||||
|
||||
The Fediversity project is working on making it easier for people to join the fediverse, and taking full control on their own online social presence. We make it easier for you to join the fediverse, giving you an easy way to select what you need. With one click, you can select whether you need photo sharing, microblogging, video sharing, blogging or simply email. You can get a domain name as well, so you can be up and running with a professional social presence on the new internet in without any effort.
|
||||
|
||||
Fediversity is currently in development, and you can follow us on Mastodon for all the latest information.
|
||||
'';
|
||||
};
|
||||
}
|
49
content/navigation.nix
Normal file
|
@ -0,0 +1,49 @@
|
|||
{ config, ... }:
|
||||
let
|
||||
inherit (config) pages;
|
||||
in
|
||||
{
|
||||
menus.main = {
|
||||
label = "Main";
|
||||
items = [
|
||||
{
|
||||
page = pages.index // {
|
||||
title = "Start";
|
||||
};
|
||||
}
|
||||
{
|
||||
menu.label = "For you";
|
||||
menu.items = map (page: { inherit page; }) (
|
||||
with pages;
|
||||
[
|
||||
individuals
|
||||
developers
|
||||
european-commission
|
||||
]
|
||||
);
|
||||
}
|
||||
{
|
||||
menu.label = "Consortium";
|
||||
menu.items = map (page: { inherit page; }) (
|
||||
with pages;
|
||||
[
|
||||
nlnet
|
||||
oid
|
||||
tweag
|
||||
nordunet
|
||||
]
|
||||
);
|
||||
}
|
||||
{ page = pages.fediversity; }
|
||||
{ page = pages.grants; }
|
||||
{ page = pages.news; }
|
||||
{ page = pages.events; }
|
||||
{
|
||||
link = {
|
||||
label = "Contact";
|
||||
url = "mailto:contact@fediversity.eu";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
24
content/news.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
{ config, lib, ... }:
|
||||
{
|
||||
pages.news =
|
||||
{ link, ... }:
|
||||
rec {
|
||||
title = "News";
|
||||
description = "News about Fediversity";
|
||||
summary = description;
|
||||
body =
|
||||
with lib;
|
||||
let
|
||||
news = map (article: ''
|
||||
## [${article.title}](${link article})
|
||||
|
||||
${article.date} by ${article.author}
|
||||
|
||||
${article.summary}
|
||||
'') config.collections.news.entry;
|
||||
in
|
||||
''
|
||||
${join "\n\n" news}
|
||||
'';
|
||||
};
|
||||
}
|
24
content/news/2024-11-zurich-zhf.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
{ config, ... }:
|
||||
{
|
||||
collections.news.entry =
|
||||
{ link, ... }:
|
||||
rec {
|
||||
name = "zhf-24-11";
|
||||
title = "NixOS 24.11 release hackathon and workshop";
|
||||
description = "Fediversity engineers met in Zürich at a NixOS 24.11 ZHF hackathon";
|
||||
date = "2024-11-28";
|
||||
author = "Valentin Gagarin";
|
||||
summary = ''
|
||||
Fediversity engineers met in Zürich at a [NixOS 24.11 ZHF hackathon](${link config.collections.events.by-name.zhf-24-11}) to present prototypes and exchange ideas with the Nix community.
|
||||
'';
|
||||
body = ''
|
||||
${summary}
|
||||
|
||||
Robert held a lightning talk on the design of [NixOps4](https://github.com/nixops4/nixops4), which is currently in the prototype stage of development.
|
||||
Before that, Nicolas had already shown an internal demonstration that NixOps4 is capable of deploying multiple NixOS services in the Fediversity test environment.
|
||||
|
||||
In the afternoon, Robert, Valentin, and Koen got together with Eli from [Thymis](https://thymis.io) and Johannes from [Clan](https://clan.lol/) to walk each other through the architecture of their respective systems.
|
||||
This was an extraordinarily fruitful encounter that helped us to identify overlaps and potential for future collaboration!
|
||||
'';
|
||||
};
|
||||
}
|
23
content/news/nordunet-conference.nix
Normal file
|
@ -0,0 +1,23 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.news.entry = {
|
||||
title = "Nordunet Conference 2024";
|
||||
description = "Report from the NORDUnet Conference 2024";
|
||||
date = "2024-09-17";
|
||||
author = "Laurens Hof";
|
||||
summary = ''
|
||||
Fediversity was represented in Bergen at the Nordunet Conference for 2024, with both the Internet Discourse Foundation and Nordunet themselves being present.
|
||||
'';
|
||||
body = ''
|
||||
Fediversity was represented in Bergen at the Nordunet Conference for 2024, with both the Internet Discourse Foundation and Nordunet themselves being present. This was a great opportunity for the different organisations in the consortium to meet with each other and exchange ideas.
|
||||
|
||||
One of those new ideas that came out of the conference is to think about offering [EduMEET](https://edumeet.org/) as a part of Fediversity. EduMEET is an open source video conferencing platform that is build for and by the Research and Education community. EduMEET allows for the possibility of recording conference calls, but does not offer an easy place to host these recordings. PeerTube is already mature fediverse software that offers video hosting. Combining these two pieces of software in the offering to onboard public organisations can make it easier to offer a complete package for the organisations. It can potentially help lower the barrier of entry, while at the same time making it more attractive for public education organisations to start using fediverse software.
|
||||
|
||||
Fediversity is now starting to explore if and how efforts with Nordunet to promote EduMEET can be combined with Fediversity's (and thus Nordunet!) project to promote the fediverse.
|
||||
|
||||
Another aspect that came out of the conference is the possibility to use [Argus](https://openargus.org/) as a real-time monitoring tool as part of our hosting stack that we're building. How to do real-time monitoring was so far still unclear in our plans for building a Nix panel, but Argus might just be the open source tool we're looking for.
|
||||
|
||||
It was exciting to meet so many people in the community that are all working towards building better digital systems for public organisations, and we're proud to contribute our small piece to a much larger puzzle. Hope to meet more of you all soon!
|
||||
'';
|
||||
};
|
||||
}
|
22
content/news/project-launch.nix
Normal file
|
@ -0,0 +1,22 @@
|
|||
{ ... }:
|
||||
|
||||
{
|
||||
collections.news.entry =
|
||||
{ ... }:
|
||||
{
|
||||
title = "Fediversity project publicly announced";
|
||||
description = "The Fediversity project has officially been announced";
|
||||
date = "2024-01-01";
|
||||
author = "Laurens Hof";
|
||||
summary = ''
|
||||
We are pleased to introduce the launch of our new website dedicated to the Fediversity project.
|
||||
'';
|
||||
body = ''
|
||||
The Consortium behind the Fediversity project announces that the project has officially been started. NLnet, Tweag, NorduNet and the Open Internet Discourse Foundation are working together to build a new service for cloud hosters.
|
||||
|
||||
Fediversity is a comprehensive effort to bring easy-to-use, hosted cloud services with service portability and personal freedom at their core to everyone. It wants to provide everyone with high-quality, secure IT systems for everyday use. Without tracking, without exploitation, in a way that runs everywhere and scales effortlessly. Fediversity is based on NixOS, a disruptive Linux distribution with a unique approach to package and configuration management. Built on top of the Nix package manager, NixOS is completely declarative, makes upgrading systems reliable, and has many other advantages. Because it is reproducible, it is ideally suited for complex deployment scenario's where consistent behaviour, stability and configurability matter.
|
||||
|
||||
Fediversity has received funding from the European Union’s Horizon Europe research and innovation programme under grant agreement No. 101136078.
|
||||
'';
|
||||
};
|
||||
}
|
19
content/news/publicspaces-conference-2024.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.news.entry = {
|
||||
title = "PublicSpaces Conference 2024";
|
||||
description = "Report from the PublicSpaces Conference 2024 - 'Take Back the Internet'";
|
||||
date = "2024-07-30";
|
||||
author = "Laurens Hof";
|
||||
summary = ''
|
||||
PublicSpaces and Waag Futurelabs recently held their yearly conference in Amsterdam, titled ‘Taking Back the Internet’
|
||||
'';
|
||||
body = ''
|
||||
PublicSpaces and Waag Futurelabs recently held their yearly conference in Amsterdam, titled 'Taking Back the Internet'. PublicSpaces is a network of public organisations fighting for an internet based on public values. The Fediversity Project attended, to share ideas, and learn more about how people and organisations think about an ethical internet. If you are interested, you can view all sessions [here](https://conference.publicspaces.net/en/archive/pubconf2024) (hosted on PeerTube!).
|
||||
|
||||
Alexandra van Huffelen, who was Dutch Secretary of State of Digitalisation until last month, gave the opening talk to discuss digitalisation and public values. In the talk, van Huffelen said that the Netherlands has a prominent lead in the EU with the promotion of public values in the digital infrastructure. Van Huffelen has been a prominent supporter of open standards and decentralisation, and has pushed the usage of Mastodon within the Dutch government, which fits well with the goals and vision of the Fediversity project. Project Lead Koen de Jonge took the opportunity shortly before the talk to hand van Huffelen a Mastodon pin, which she proudly wore during her talk, as you can see in the header image!
|
||||
|
||||
There were quite some other talks about the Fediverse as well, discussing how to move the space forward. The goal of the Fediversity Project is to provide the technological infrastructure that makes it easier for people to join an open, free and fair social internet. The strength of Fediversity is in our technological capabilities, making the infrastructure more accessible. For our project to be successful, we also need a social infrastructure, that teaches people what it is and how it is beneficial for them, and how to get them on board. We also need public organisations to lead by example. Both of these social aspects of growing the fediverse were on full display during the PublicSpaces conference, and there is a real enthusiasm in growing the social internet. Fediversity is a strong supporter of organisations like PublicSpaces; while organisations like PublicSpaces help facilitate people and organisations with their thinking about why they should join the fediverse, and which steps should they take, Fediversity can provide the technological infrastructure that makes it all as easy as possible.
|
||||
'';
|
||||
};
|
||||
}
|
19
content/news/tech-session.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.news.entry = {
|
||||
title = "Fediversity tech session";
|
||||
description = "Fediversity tech session - NixOS and Kubernetes";
|
||||
date = "2024-08-05";
|
||||
author = "Laurens Hof";
|
||||
summary = ''
|
||||
Recently Fediversity hosted a tech session on NixOS and Kubernetes. We invited people within the community to discuss some design considerations of the Fediversity project with us.
|
||||
'';
|
||||
body = ''
|
||||
Recently Fediversity hosted a tech session on NixOS and Kubernetes. We invited people within the community to discuss some design considerations of the Fediversity project with us.
|
||||
|
||||
One of the core ideas of Fediversity is to build on top of NixOS. NixOS makes upgrading system reliable, and complex deployment reproducable. One of the goals of the Fediversity project that provides an interesting challenge is to help people move away from the cloud hyperscalers. Offering our project on Kubernetes offers easy integration with the storage platforms of the hyperscalers. Easy integration with the hyperscalers is an explicit anti-goal of Fediversity, but we're not sure if we can offer all the functionality with NixOS yet.
|
||||
|
||||
You can check out our entire conversation right here.
|
||||
'';
|
||||
};
|
||||
}
|
19
content/news/website-launch.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{ ... }:
|
||||
{
|
||||
collections.news.entry = {
|
||||
title = "Fediversity website launch";
|
||||
description = "Announcing our new website for the Fediversity project";
|
||||
date = "2024-05-15";
|
||||
author = "Laurens Hof";
|
||||
summary = ''
|
||||
We are pleased to introduce the launch of our new website dedicated to the Fediversity project.
|
||||
'';
|
||||
body = ''
|
||||
We are pleased to introduce the launch of our new website dedicated to the Fediversity project.
|
||||
|
||||
The project is broad in scope, and the website reflects this. Whether you are a developer, an individual interested in the project, or want to know how the grant money is spend, the website keeps you up to date with everything you need to know.
|
||||
|
||||
We're excited to show you more of the progress of the Fediversity project, and how we can build a next generation of the open internet together!
|
||||
'';
|
||||
};
|
||||
}
|
16
content/partners/nlnet.nix
Normal file
|
@ -0,0 +1,16 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.nlnet = {
|
||||
title = "NLnet";
|
||||
description = "Details about the NLnet Foundation";
|
||||
summary = ''
|
||||
NLnet supports organisations and people who contribute to an open internet for all. They fund projects that help fix the internet through open hardware, open software, open standards, open science and open data.
|
||||
'';
|
||||
body = ''
|
||||
The NLnet Foundation supports organisations and people who contribute to an open internet for all. NLnet funds projects that help fix the internet through open hardware, open software, open standards, open science and open data. After its historical contribution to the early internet in Europe in the 1980’s, NLnet has been financially supporting the open internet since 1997.
|
||||
|
||||
NLnet provides grants to free and open source projects between 5.000 and 50.000 euro with the possibility to scale up. Funding is open to anyone: organisations of any type and individuals. Within NGI Fediversity, NLnet facilitates the open calls for third-party funding and contributes to outreach and dissemination.
|
||||
'';
|
||||
|
||||
};
|
||||
}
|
15
content/partners/nordunet.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.nordunet = {
|
||||
title = "NORDUnet";
|
||||
description = "Details about NORDUnet";
|
||||
summary = ''
|
||||
NORDUnet is a collaboration of the National Research and Education Networks (NREN) of the Nordic countries.
|
||||
'';
|
||||
body = ''
|
||||
NORDUnet connects universities and research institutions across Denmark, Finland, Iceland, Norway, and Sweden. It enables collaboration, data sharing, and access to online resources for academic and research purposes.
|
||||
|
||||
Fun fact: the website of NORDUnet, nordu.net is the oldest still active domain on the internet.
|
||||
'';
|
||||
};
|
||||
}
|
21
content/partners/oid.nix
Normal file
|
@ -0,0 +1,21 @@
|
|||
{ ... }:
|
||||
{
|
||||
|
||||
pages.oid = {
|
||||
title = "Open Internet Discourse Foundation";
|
||||
description = "Details about the Open Internet Discourse Foundation";
|
||||
summary = ''
|
||||
The Open Internet Discourse Foundation (OID) is founded on the belief that everyone deserves the freedom to express themselves and use the internet without constraints, and is committed to help build a better internet where individuals can truly be who they are.
|
||||
'';
|
||||
body = ''
|
||||
The three pillars that are at the core of the OID Foundation:
|
||||
|
||||
OID believes in the fundamental right of individuals to privacy, self-determination, and freedom of expression.
|
||||
Building sustainably. The OID Foundation believes that the internet is crucial infrastructure for society, and as such, should be build from the perspective that software projects can exist and be maintained for a long time; decades, not years.
|
||||
Transparancy. The OID Foundation takes the commitment to openness seriously, and strives to use open software in all aspects.
|
||||
In order to realise our vision, we need a healthy, functional and open internet. This is where OID comes in, working on the infrastructure that powers the internet in a way that promotes it’s values.
|
||||
|
||||
OID Foundation is rooted in constructive optimism, believing in tackling challenges head-on with a positive outlook, viewing each obstacle as an opportunity for improvement. As a practical example of the long-term vision is the work on NixOS that the OID is doing, where the reproducibility and long-term maintainability of NixOS’s package management help with an open and sustainable internet.
|
||||
'';
|
||||
};
|
||||
}
|
13
content/partners/tweag.nix
Normal file
|
@ -0,0 +1,13 @@
|
|||
{ ... }:
|
||||
{
|
||||
pages.tweag = {
|
||||
title = "Tweag";
|
||||
description = "Details about Tweag";
|
||||
summary = ''
|
||||
Tweag is the open source program office (OSPO) of Modus Create, and has extensive experience working with Nix, and many people at the forefront of the Nix community are Tweagers
|
||||
'';
|
||||
body = ''
|
||||
Tweag is the open source program office (OSPO) of Modus Create, a global digital consulting firm that helps enterprises build competitive advantage through digital innovation. Tweagers are leading contributors to several open source projects — from functional programming languages to cross-platform frameworks. Tweag has extensive experience working with Nix, and many people at the forefront of the Nix community are Tweagers.
|
||||
'';
|
||||
};
|
||||
}
|
89
content_/_index.md
Executable file
|
@ -0,0 +1,89 @@
|
|||
---
|
||||
# Banner
|
||||
banner:
|
||||
title: "Welcome to the Fediversity Project"
|
||||
content: ""
|
||||
# image: "/images/checkbox-illustration-scaled.png"
|
||||
image: "/images/home.svg"
|
||||
button:
|
||||
enable: true
|
||||
label: "For You"
|
||||
link: "/individuals"
|
||||
|
||||
# Features
|
||||
features3:
|
||||
- title: "Consortium"
|
||||
image: "/images/users.svg"
|
||||
content: "The Consortium behind the Fediversity project is a cooperation between NLnet, Open Internet Discourse Foundation, NORDUnet and Tweag."
|
||||
button:
|
||||
enable: false
|
||||
label: "Learn more"
|
||||
link: ""
|
||||
|
||||
- title: "NLnet"
|
||||
image: "/images/users.svg"
|
||||
content: "NLnet supports organisations and people who contribute to an open internet for all. They fund projects that help fix the internet through open hardware, open software, open standards, open science and open data."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/nlnet"
|
||||
|
||||
- title: "Open Internet Discourse"
|
||||
image: "/images/users.svg"
|
||||
content: "The Open Internet Discourse Foundation (OID) is founded on the belief that everyone deserves the freedom to express themselves and use the internet without constraints, and is committed to help build a better internet where individuals can truly be who they are."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/oid"
|
||||
|
||||
- title: "Tweag"
|
||||
image: "/images/users.svg"
|
||||
content: "Tweag is the open source program office (OSPO) of Modus Create, and has extensive experience working with Nix, and many people at the forefront of the Nix community are Tweagers."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/tweag"
|
||||
|
||||
- title: "NORDUnet"
|
||||
image: "/images/users.svg"
|
||||
content: "NORDUnet is a collaboration of the National Research and Education Networks of the Nordic countries."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/nordunet"
|
||||
|
||||
features:
|
||||
- title: "Fediversity Grants"
|
||||
image: "/images/stepping-up.png"
|
||||
content: ""
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/grants"
|
||||
|
||||
features2:
|
||||
- title: "Individuals"
|
||||
image: "/images/user.png"
|
||||
content: "Always be in control with your own data on social networks, whether that's with Mastodon, PeerTube or Pixelfed: Fediversity makes it possible."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/individuals"
|
||||
|
||||
- title: "Developers"
|
||||
image: "/images/code.png"
|
||||
content: "As a developer building the next generation of social platforms, you are looking to make it easier to facilitate your customers to use your product. Fediversity can help."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/developers"
|
||||
|
||||
- title: "European Commission"
|
||||
image: "/images/globe.png"
|
||||
content: "The Fediversity Project operates on a grant gratiously provided by the HORIZON fund by the EC. Learn more about the accountability of the project."
|
||||
button:
|
||||
enable: true
|
||||
label: "Learn more"
|
||||
link: "/ec"
|
||||
|
||||
---
|
3
content_/authors/_index.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
title: "Authors"
|
||||
---
|
12
content_/authors/laurens-hof.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: Laurens Hof
|
||||
email: laurens@procolix.com
|
||||
image: "/images/avatar.png"
|
||||
description: storyteller
|
||||
social:
|
||||
- name: github
|
||||
icon: fa-brands fa-github
|
||||
link: https://github.com
|
||||
---
|
||||
|
||||
Story teller for the Fediversity Project.
|
18
content_/contact/_index.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
title: "Contact"
|
||||
meta_title: ""
|
||||
description: "How to contact us"
|
||||
draft: false
|
||||
---
|
||||
|
||||
Please feel free to reach out to us via email at the following addresses for any inquiries or assistance. We’re here to help and eager to hear from you!
|
||||
|
||||
For generic questions about the Fediversity project:
|
||||
|
||||
contact@fediversity.eu
|
||||
For questions about the administrative side of the Fediversity Project:
|
||||
|
||||
fediversity@nlnet.nl
|
||||
If you have questions about the funding rounds that are part of the Fediversity project, you can find out more information on the NLnet website:
|
||||
|
||||
https://nlnet.nl/fediversity/guideforapplicants/
|
12
content_/pages/privacy-policy.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Privacy"
|
||||
# meta title
|
||||
meta_title: ""
|
||||
# meta description
|
||||
description: "Privacy Policy"
|
||||
# save as draft
|
||||
draft: false
|
||||
---
|
||||
|
||||
The Fediversity website does not track you, and does not process any of your data.
|
||||
|
102
default.nix
Normal file
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
sources ? import ../npins,
|
||||
system ? builtins.currentSystem,
|
||||
pkgs ? import sources.nixpkgs {
|
||||
inherit system;
|
||||
config = { };
|
||||
overlays = [ ];
|
||||
},
|
||||
lib ? import "${sources.nixpkgs}/lib",
|
||||
}:
|
||||
let
|
||||
lib' =
|
||||
final: prev:
|
||||
let
|
||||
new = import ./lib.nix { lib = final; };
|
||||
in
|
||||
new // { types = prev.recursiveUpdate prev.types new.types; };
|
||||
lib'' = lib.extend lib';
|
||||
|
||||
in
|
||||
rec {
|
||||
lib = lib'';
|
||||
result = lib.evalModules {
|
||||
modules = [
|
||||
./structure
|
||||
./content
|
||||
./presentation
|
||||
{
|
||||
_module.args = {
|
||||
inherit pkgs;
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
inherit (result.config) build;
|
||||
|
||||
shell =
|
||||
let
|
||||
run-tests = pkgs.writeShellApplication {
|
||||
name = "run-tests";
|
||||
text =
|
||||
with pkgs;
|
||||
with lib;
|
||||
''
|
||||
${getExe nix-unit} ${toString ./tests.nix} "$@"
|
||||
'';
|
||||
};
|
||||
test-loop = pkgs.writeShellApplication {
|
||||
name = "test-loop";
|
||||
text =
|
||||
with pkgs;
|
||||
with lib;
|
||||
''
|
||||
${getExe watchexec} -w ${toString ./.} -- ${getExe nix-unit} ${toString ./tests.nix}
|
||||
'';
|
||||
};
|
||||
devmode = pkgs.devmode.override {
|
||||
buildArgs = "${toString ./.} -A build --show-trace";
|
||||
open = "/index.html";
|
||||
};
|
||||
in
|
||||
pkgs.mkShellNoCC {
|
||||
packages = [
|
||||
pkgs.npins
|
||||
run-tests
|
||||
test-loop
|
||||
devmode
|
||||
];
|
||||
};
|
||||
|
||||
inherit sources pkgs;
|
||||
tests =
|
||||
with pkgs;
|
||||
with lib;
|
||||
let
|
||||
source = fileset.toSource {
|
||||
root = ../.;
|
||||
fileset = fileset.unions [
|
||||
./default.nix
|
||||
./tests.nix
|
||||
./lib.nix
|
||||
../npins
|
||||
];
|
||||
};
|
||||
in
|
||||
runCommand "run-tests"
|
||||
{
|
||||
buildInputs = [ pkgs.nix ];
|
||||
}
|
||||
''
|
||||
export HOME="$(realpath .)"
|
||||
# HACK: nix-unit initialises its own entire Nix, so it needs a store to operate on,
|
||||
# but since we're in a derivation, we can't fetch sources, so copy Nixpkgs manually here.
|
||||
# `''${sources.nixpkgs}` resolves to `<hash>-source`,
|
||||
# adding it verbatim will result in <hash'>-<hash>-source, so rename it first
|
||||
cp -r ${sources.nixpkgs} source
|
||||
nix-store --add --store "$HOME" source
|
||||
${getExe nix-unit} --gc-roots-dir "$HOME" --store "$HOME" ${source}/website/tests.nix "$@"
|
||||
touch $out
|
||||
'';
|
||||
}
|
BIN
images/screenshot.png
Normal file
After Width: | Height: | Size: 220 KiB |
BIN
images/tn.png
Normal file
After Width: | Height: | Size: 248 KiB |
21
layouts/404.html
Executable file
|
@ -0,0 +1,21 @@
|
|||
{{ define "main" }}
|
||||
<section class="section-sm text-center">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<div class="sm:col-10 md:col-8 lg:col-6">
|
||||
<span class="text-[8rem] block font-bold text-dark"> 404 </span>
|
||||
<h1 class="h2 mb-4">Page not found</h1>
|
||||
<div class="content">
|
||||
<p>
|
||||
The page you are looking for might have been removed, had its name
|
||||
changed, or is temporarily unavailable.
|
||||
</p>
|
||||
</div>
|
||||
<a href="{{ site.BaseURL | relLangURL }}" class="btn btn-primary mt-8">
|
||||
Back to home
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
39
layouts/_default/baseof.html
Executable file
|
@ -0,0 +1,39 @@
|
|||
<!doctype html>
|
||||
<html
|
||||
itemscope
|
||||
class="{{- if not site.Params.theme_switcher -}}
|
||||
{{- site.Params.theme_default -}}
|
||||
{{- end -}}"
|
||||
lang="{{ site.LanguageCode | default `en-US` }}"
|
||||
itemtype="http://schema.org/WebPage"
|
||||
>
|
||||
<head>
|
||||
<!-- head (don't cache it) -->
|
||||
{{ partial "essentials/head.html" . }}
|
||||
|
||||
<!-- style (always cache it) -->
|
||||
{{ partialCached "essentials/style.html" . }}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- cache partial only in production -->
|
||||
{{ if hugo.IsProduction }} {{ partialCached "preloader.html" . }} {{
|
||||
partialCached "gtm-noscript.html" . }} {{ else }} {{ partial
|
||||
"preloader.html" . }}
|
||||
|
||||
<!-- tailwind size indicator -->
|
||||
{{ partial "components/tw-size-indicator.html" . }} {{ end }}
|
||||
|
||||
<!-- header (don't cache it) -->
|
||||
{{ partial "essentials/header.html" . }} {{ partial "search-modal.html"
|
||||
(dict "Context" . ) }}
|
||||
|
||||
<main>{{ block "main" . }}{{ end }}</main>
|
||||
|
||||
<!-- footer -->
|
||||
{{ partial "essentials/footer.html" . }}
|
||||
|
||||
<!-- script (always cache it) -->
|
||||
{{ partialCached "essentials/script.html" . }}
|
||||
</body>
|
||||
</html>
|
16
layouts/_default/list.html
Executable file
|
@ -0,0 +1,16 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<ul class="text-center">
|
||||
{{ range .RegularPages }}
|
||||
<li class="m-3">
|
||||
<a href="{{ .Permalink }}" class="text-dark block text-xl">
|
||||
{{ .Title }}
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
12
layouts/_default/single.html
Executable file
|
@ -0,0 +1,12 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
<section class="section-sm">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<div class="lg:col-10">
|
||||
<div class="content">{{ .Content }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
20
layouts/_default/taxonomy.html
Executable file
|
@ -0,0 +1,20 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<div class="row gx-5">
|
||||
<!-- blog posts -->
|
||||
<div class="lg:col-8">
|
||||
<div class="row">
|
||||
{{ range .Data.Pages }}
|
||||
<div class="md:col-6 mb-14">
|
||||
{{ partial "components/blog-card" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
|
32
layouts/_default/terms.html
Executable file
|
@ -0,0 +1,32 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<ul class="text-center">
|
||||
{{/* categories */}} {{ if eq .Permalink (`categories/` | absLangURL) }}
|
||||
{{ range site.Taxonomies.categories.ByCount }}
|
||||
<li class="m-3 inline-block">
|
||||
<a
|
||||
href="{{ .Page.Permalink }}"
|
||||
class="bg-theme-light text-dark block rounded px-4 py-2 text-xl"
|
||||
>
|
||||
{{ .Page.Title }}
|
||||
<span class="bg-body ml-2 rounded px-2"> {{ .Count }} </span>
|
||||
</a>
|
||||
</li>
|
||||
{{ end }} {{ end }} {{/* tags */}} {{ if eq .Permalink (`tags/` |
|
||||
absLangURL) }} {{ range site.Taxonomies.tags.ByCount }}
|
||||
<li class="m-3 inline-block">
|
||||
<a
|
||||
href="{{ .Page.Permalink }}"
|
||||
class="bg-theme-light text-dark block rounded px-4 py-2 text-xl"
|
||||
>
|
||||
{{ .Page.Title }}
|
||||
<span class="bg-body ml-2 rounded px-2"> {{ .Count }} </span>
|
||||
</a>
|
||||
</li>
|
||||
{{ end }} {{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
14
layouts/about/list.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
{{ define "main" }}
|
||||
<section class="section-sm">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<div class="md:col-10 lg:col-7 text-center">
|
||||
{{ partial "image" (dict "Src" .Params.image "Alt" .Title "Class"
|
||||
"mx-auto mb-6" "Size" "200x200") }}
|
||||
<h2 class="h3 mb-6">{{ .Title }}</h2>
|
||||
<div class="content">{{ .Content }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
14
layouts/authors/list.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
{{ range .RegularPages }}
|
||||
<div class="md:col-6 lg:col-4 mb-14">
|
||||
{{ partial "components/author-card" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
46
layouts/authors/single.html
Executable file
|
@ -0,0 +1,46 @@
|
|||
{{ define "main" }}
|
||||
<section class="section-sm pb-0">
|
||||
<div class="container">
|
||||
<div class="row border-border justify-center border-b pb-14">
|
||||
<div class="lg:col-4 text-center">
|
||||
{{ $image:= .Params.image }} {{ if $image }} {{ partial "image" (dict
|
||||
"Src" $image "Alt" .Title "Class" "mx-auto" "Size" "200x200") }} {{ else
|
||||
if .Params.Email }}
|
||||
<img
|
||||
class="mx-auto"
|
||||
alt="{{ .Title }}"
|
||||
height="200"
|
||||
width="200"
|
||||
src="https://www.gravatar.com/avatar/{{ md5 .Params.email }}?s=128&pg&d=identicon"
|
||||
/>
|
||||
{{ end }}
|
||||
<h1 class="h3 mt-10">{{ .Title }}</h1>
|
||||
<div class="content mt-6">{{ .Content }}</div>
|
||||
<ul class="social-icons ml-4 mt-10 text-center">
|
||||
{{ range .Params.social }}
|
||||
<li>
|
||||
<a
|
||||
href="{{ .link | safeURL }}"
|
||||
target="_blank"
|
||||
rel="noopener nofollow"
|
||||
>
|
||||
<span class="sr-only">{{ .title }}</span>
|
||||
<i class="{{ .icon }}"></i>
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row pb-16 pt-14">
|
||||
{{ $filterByAuthor := where site.RegularPages "Params.author" "==" .Title
|
||||
}} {{ range $filterByAuthor }}
|
||||
<div class="md:col-6 lg:col-4 mb-12">
|
||||
{{ partial "components/blog-card" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
22
layouts/blog/list.html
Normal file
|
@ -0,0 +1,22 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<div class="row gx-5">
|
||||
<!-- blog posts -->
|
||||
<!--<div class="lg:col-8">-->
|
||||
<div class="row">
|
||||
{{ $paginator:= .Paginate .RegularPages }} {{ range $paginator.Pages
|
||||
}}
|
||||
<div class="md:col-6 mb-14">
|
||||
{{ partial "components/blog-card" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ partial "components/pagination.html" . }}
|
||||
<!--</div>-->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
68
layouts/blog/single.html
Normal file
|
@ -0,0 +1,68 @@
|
|||
{{ define "main" }}
|
||||
<section class="section pt-7">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<article class="lg:col-10">
|
||||
|
||||
{{ $image:= .Params.image }} {{ if $image }}
|
||||
<div class="mb-10 flex flex-wrap"> <!-- Add flex-wrap class to allow wrapping -->
|
||||
<div class="w-full lg:w-1/2 mb-4 lg:mb-0 pr-8"> <!-- Specify width for the text content and add margin to the right -->
|
||||
<h1 class="h2 mb-4">{{ .Title }}</h1>
|
||||
<ul class="mb-4">
|
||||
<!-- List items for author, categories, and publish date -->
|
||||
<li class="mr-4 inline-block">
|
||||
<a
|
||||
href="{{ `authors/` | relLangURL }}{{ .Params.Author | urlize }}/"
|
||||
>
|
||||
<i class="fa-regular fa-circle-user mr-2"></i>{{ .Params.author }}
|
||||
</a>
|
||||
</li>
|
||||
<li class="mr-4 inline-block">
|
||||
<i class="fa-regular fa-clock mr-2"></i>
|
||||
{{ time.Format ":date_long" .PublishDate }}
|
||||
</li>
|
||||
</ul>
|
||||
<div class="content mb-10">{{ .Content }}</div>
|
||||
<!-- Other content elements -->
|
||||
</div>
|
||||
<div class="w-full lg:w-1/2"> <!-- Specify width for the image content -->
|
||||
<div>
|
||||
{{ partial "image" (dict "Src" $image "Alt" .Title "Class" "w-full rounded") }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
<div class="row items-start justify-between">
|
||||
{{ $tags:= .Params.tags }} {{ if $tags }}
|
||||
<div class="lg:col-5 mb-10 flex items-center lg:mb-0">
|
||||
<h5 class="mr-3">{{ i18n "tags" }} :</h5>
|
||||
<ul>
|
||||
{{ range $i,$p:= $tags }}
|
||||
<li class="inline-block">
|
||||
<a
|
||||
class="bg-theme-light hover:bg-primary m-1 block rounded px-3 py-1 hover:text-white"
|
||||
href="{{ `tags/` | relLangURL }}{{ . | urlize | lower }}/"
|
||||
>
|
||||
{{ . | humanize }}
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</article>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
64
layouts/contact/list.html
Executable file
|
@ -0,0 +1,64 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
|
||||
|
||||
<section class="section-sm">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<div class="lg:col-10">
|
||||
<div class="content">{{ .Content }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section class="section-sm">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="md:col-10 lg:col-6 mx-auto">
|
||||
<form action="{{ site.Params.contact_form_action }}" method="POST">
|
||||
<div class="mb-6">
|
||||
<label for="name" class="form-label">
|
||||
Name <span class="text-red-500">*</span>
|
||||
</label>
|
||||
<input
|
||||
id="name"
|
||||
name="name"
|
||||
class="form-input"
|
||||
placeholder=""
|
||||
type="text"
|
||||
/>
|
||||
</div>
|
||||
<div class="mb-6">
|
||||
<label for="email" class="form-label">
|
||||
Email address <span class="text-red-500">*</span>
|
||||
</label>
|
||||
<input
|
||||
id="email"
|
||||
name="email"
|
||||
class="form-input"
|
||||
placeholder=""
|
||||
type="email"
|
||||
/>
|
||||
</div>
|
||||
<div class="mb-6">
|
||||
<label for="message" class="form-label">
|
||||
Send us a message! <span class="text-red-500">*</span>
|
||||
</label>
|
||||
<textarea
|
||||
id="message"
|
||||
name="message"
|
||||
class="form-input"
|
||||
placeholder=""
|
||||
rows="8"
|
||||
></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{ end }}
|
31
layouts/events/list.html
Normal file
|
@ -0,0 +1,31 @@
|
|||
{{ define "main" }} {{ partial "page-header" . }}
|
||||
<div class="center-layout">
|
||||
<ul class="list">
|
||||
{{ if gt (len (where .Site.RegularPages "Section" "events")) 0 }}
|
||||
<section>
|
||||
<div class="header-with-image">
|
||||
<img src="/images/users.png" alt="Image">
|
||||
<h4 class="mb-4">Events</h4>
|
||||
</div>
|
||||
<ul class="list">
|
||||
{{ range (first 5 (where .Site.RegularPages "Section" "events").ByDate.Reverse) }}
|
||||
<li class="list-item">
|
||||
<div class="content">
|
||||
<a class="link" href="{{ .RelPermalink }}" style="color: #FF6E00">{{ .Title }}</a>
|
||||
</div>
|
||||
<hr class="hr-list">
|
||||
|
||||
<time class="g time" datetime="{{ dateFormat "2006-01-02" .Date }}">{{ dateFormat "02-01-2006" .Date }}</time>
|
||||
<hr class="hr-list2">
|
||||
</li>
|
||||
<div class="line"></div>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
</section>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
{{ end }}
|
73
layouts/events/single.html
Normal file
|
@ -0,0 +1,73 @@
|
|||
{{ define "main" }}
|
||||
<section class="section pt-7">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<article class="lg:col-10">
|
||||
|
||||
{{ $image:= .Params.image }} {{ if $image }}
|
||||
<div class="mb-10 flex flex-wrap"> <!-- Add flex-wrap class to allow wrapping -->
|
||||
<div class="w-full lg:w-1/2 mb-4 lg:mb-0 pr-8"> <!-- Specify width for the text content and add margin to the right -->
|
||||
<h1 class="h2 mb-4">{{ .Title }}</h1>
|
||||
<ul class="mb-4">
|
||||
<!-- List items for author, categories, and publish date -->
|
||||
<li class="mr-4 inline-block">
|
||||
<i class="fa-regular fa-clock mr-2"></i>
|
||||
Start: {{ .Params.datetime_start }}
|
||||
</li>
|
||||
<br>
|
||||
<li class="mr-4 inline-block">
|
||||
<i class="fa-regular fa-clock mr-2"></i>
|
||||
End: {{ .Params.datetime_end }}
|
||||
</li>
|
||||
<br>
|
||||
<li class="mr-4 inline-block">
|
||||
<i class="fa-regular fa-globe mr-2"></i>
|
||||
Location: {{ .Params.location }}
|
||||
</li>
|
||||
|
||||
|
||||
</ul>
|
||||
<div class="content mb-10">{{ .Content }}</div>
|
||||
<!-- Other content elements -->
|
||||
</div>
|
||||
<div class="w-full lg:w-1/2"> <!-- Specify width for the image content -->
|
||||
<div>
|
||||
{{ partial "image" (dict "Src" $image "Alt" .Title "Class" "w-full rounded") }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
<div class="row items-start justify-between">
|
||||
{{ $tags:= .Params.tags }} {{ if $tags }}
|
||||
<div class="lg:col-5 mb-10 flex items-center lg:mb-0">
|
||||
<h5 class="mr-3">{{ i18n "tags" }} :</h5>
|
||||
<ul>
|
||||
{{ range $i,$p:= $tags }}
|
||||
<li class="inline-block">
|
||||
<a
|
||||
class="bg-theme-light hover:bg-primary m-1 block rounded px-3 py-1 hover:text-white"
|
||||
href="{{ `tags/` | relLangURL }}{{ . | urlize | lower }}/"
|
||||
>
|
||||
{{ . | humanize }}
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</article>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
208
layouts/index.html
Executable file
|
@ -0,0 +1,208 @@
|
|||
{{ define "main" }}
|
||||
<!-- Banner -->
|
||||
{{ with .Params.banner }}
|
||||
<section class="section pt-14">
|
||||
<div class="container">
|
||||
<div class="row justify-center">
|
||||
<div class="lg:col-7 md:col-9 mb-8 text-center">
|
||||
<h1 class="mb-4 text-h3 lg:text-h1">{{ .title | markdownify }}</h1>
|
||||
<p class="mb-8">{{ .content | markdownify }}</p>
|
||||
{{ with .button }} {{ if .enable }}
|
||||
<a
|
||||
class="btn btn-primary"
|
||||
href="{{ .link | absURL }}"
|
||||
{{
|
||||
if
|
||||
strings.HasPrefix
|
||||
.link
|
||||
`http`
|
||||
}}
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
{{
|
||||
end
|
||||
}}
|
||||
>
|
||||
{{ .label }}
|
||||
<i class="fa fa-arrow-right pl-2"></i>
|
||||
</a>
|
||||
{{ end }} {{ end }}
|
||||
</div>
|
||||
<div class="col-12">
|
||||
{{ partial "image" (dict "Src" .image "Alt" "Banner image" "Loading"
|
||||
"eager" "Class" "mx-auto lg:!max-w-[800px]" "DisplayXL" "800x" ) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
<!-- /Banner -->
|
||||
|
||||
<!-- Consortium -->
|
||||
<center><h2> Consortium</h2></center>
|
||||
|
||||
|
||||
<div class="container">
|
||||
<div class="grid-container">
|
||||
{{ range $i, $e := .Params.features3 }}
|
||||
|
||||
<div class="grid-item">
|
||||
|
||||
<div class="header-with-image2">
|
||||
<img src="{{ .image }}" alt="Image">
|
||||
<h5 class="mb-4">{{ .title | markdownify }}</h4>
|
||||
</div>
|
||||
|
||||
|
||||
<p class="mb-8 text-lg">{{ .content | markdownify }}
|
||||
{{ with .button }} {{ if .enable }}
|
||||
<a class="mt-6" href="{{ .link | absURL }}" style="color:#FF6E00">
|
||||
Read more
|
||||
<i class="fa fa-arrow-right pl-2"></i>
|
||||
</a>
|
||||
{{ end }} {{ end }}
|
||||
</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- /Consortium -->
|
||||
|
||||
<!-- Features -->
|
||||
{{ range $i, $e:= .Params.features }}
|
||||
<section class="section-sm {{ if (modBool $i 2) }}bg-gradient{{ end }}">
|
||||
<div class="container">
|
||||
<div class="row items-center justify-between">
|
||||
<div
|
||||
class="mb:md-0 {{ if not (modBool $i 2) }}
|
||||
md:order-2
|
||||
{{ end }} md:col-5 mb-6"
|
||||
>
|
||||
{{ partial "image" (dict "Src" .image "Alt" "feature image" "DisplayXL"
|
||||
"520x" "DisplayLG" "425x" "DisplayMD" "360x") }}
|
||||
</div>
|
||||
<div
|
||||
class="{{ if not (modBool $i 2) }}
|
||||
md:order-1
|
||||
{{ end }} md:col-7 lg:col-6"
|
||||
>
|
||||
<h2 class="mb-4">{{ .title | markdownify }}</h2>
|
||||
<p class="mb-8 text-lg">{{ .content | markdownify }}</p>
|
||||
<ul>
|
||||
{{ range .bulletpoints }}
|
||||
<li class="relative mb-4 pl-6">
|
||||
<i class="fa fa-check absolute left-0 top-1.5"></i>
|
||||
{{ . | markdownify }}
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ with .button }} {{ if .enable }}
|
||||
<a class="btn btn-primary mt-6" href="{{ .link | absURL }}">
|
||||
{{ .label }}
|
||||
<i class="fa fa-arrow-right pl-2"></i>
|
||||
</a>
|
||||
{{ end }} {{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
<!-- /Features -->
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- features2test-->
|
||||
<center><h2> Fediverse Explained</h2></center>
|
||||
|
||||
|
||||
<div class="container">
|
||||
<div class="grid-container">
|
||||
{{ range $i, $e := .Params.features2 }}
|
||||
<div class="grid-item">
|
||||
<div class="header-with-image">
|
||||
<img src="{{ .image }}" alt="Image">
|
||||
<h4 class="mb-4">{{ .title | markdownify }}</h4>
|
||||
</div>
|
||||
|
||||
<p class="mb-8 text-lg">{{ .content | markdownify }}</p>
|
||||
{{ with .button }} {{ if .enable }}
|
||||
<a class="btn btn-primary mt-6" href="{{ .link | absURL }}">
|
||||
{{ .label }}
|
||||
<i class="fa fa-arrow-right pl-2"></i>
|
||||
</a>
|
||||
{{ end }} {{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<!-- features2test-->
|
||||
|
||||
{{ if gt (len (where .Site.RegularPages "Section" "blog")) 0 }}
|
||||
<section>
|
||||
|
||||
<div class="center-wrapper">
|
||||
<div class="grid-container-small">
|
||||
<div class="column">
|
||||
<ul class="list">
|
||||
{{ if gt (len (where .Site.RegularPages "Section" "events")) 0 }}
|
||||
<section>
|
||||
<div class="header-with-image">
|
||||
<img src="/images/users.png" alt="Image">
|
||||
<h4 class="mb-4">Events</h4>
|
||||
</div>
|
||||
<ul class="list">
|
||||
{{ range (first 5 (where .Site.RegularPages "Section" "events").ByDate.Reverse) }}
|
||||
<li class="list-item">
|
||||
<div class="content">
|
||||
<a class="link" href="{{ .RelPermalink }}" style="color: #FF6E00">{{ .Title }}</a>
|
||||
</div>
|
||||
<hr class="hr-list">
|
||||
|
||||
<time class="g time" datetime="{{ dateFormat "2006-01-02" .Date }}">{{ dateFormat "02-01-2006" .Date }}</time>
|
||||
<hr class="hr-list2">
|
||||
</li>
|
||||
<div class="line"></div>
|
||||
{{ end }}
|
||||
</section>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="column">
|
||||
<ul class="list">
|
||||
{{ if gt (len (where .Site.RegularPages "Section" "blog")) 0 }}
|
||||
<section>
|
||||
<div class="header-with-image">
|
||||
<img src="/images/users.png" alt="Image">
|
||||
<h4 class="mb-4">Latest News</h4>
|
||||
</div>
|
||||
<ul class="list">
|
||||
{{ range (first 5 (where .Site.RegularPages "Section" "blog").ByDate.Reverse) }}
|
||||
<li class="list-item">
|
||||
<div class="content">
|
||||
<a class="link" href="{{ .RelPermalink }}" style="color: #FF6E00">{{ .Title }}</a>
|
||||
</div>
|
||||
<hr class="hr-list">
|
||||
|
||||
<time class="g time" datetime="{{ dateFormat "2006-01-02" .Date }}">{{ dateFormat "02-01-2006" .Date }}</time>
|
||||
<hr class="hr-list2">
|
||||
</li>
|
||||
<div class="line"></div>
|
||||
{{ end }}
|
||||
</section>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }}
|
||||
|
||||
|
||||
{{ end }}
|
25
layouts/partials/call-to-action.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<!-- Call to actions -->
|
||||
{{ with site.GetPage "sections/call-to-action" }} {{ if .Params.enable }}
|
||||
<section class="mb-28">
|
||||
<div class="container">
|
||||
<div class="bg-theme-light rounded-xl px-4 py-16 xl:p-20">
|
||||
<div class="row items-center justify-between">
|
||||
<div class="md:col-5 lg:col-4 mb-10 md:order-2 md:mb-0">
|
||||
{{ partial "image" (dict "Src" .image "Alt" "call to action" "Class"
|
||||
"w-full") }}
|
||||
</div>
|
||||
<div class="md:col-7 md:order-1">
|
||||
<h2 class="mb-2">{{ .Title | markdownify }}</h2>
|
||||
<p class="mb-6">{{ .Params.description | markdownify }}</p>
|
||||
{{ with .Params.button }} {{ if .enable }}
|
||||
<a class="btn btn-primary" href="{{ .link | absURL }}">
|
||||
{{ .label }}
|
||||
</a>
|
||||
{{ end }} {{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{ end }} {{ end }}
|
||||
<!-- /Call to actions -->
|
27
layouts/partials/components/author-card.html
Executable file
|
@ -0,0 +1,27 @@
|
|||
<div class="bg-theme-light rounded p-8 text-center">
|
||||
{{ $image:= .Params.image }} {{ if $image }} {{ partial "image" (dict "Src"
|
||||
$image "Alt" .Title "Class" "mx-auto mb-6 rounded" "size" "120x120") }} {{
|
||||
else if .Params.Email }}
|
||||
<img
|
||||
class="mx-auto mb-6 rounded"
|
||||
alt="{{ .Title }}"
|
||||
height="120"
|
||||
width="120"
|
||||
src="https://www.gravatar.com/avatar/{{ md5 .Params.email }}?s=128&pg&d=identicon"
|
||||
/>
|
||||
{{ end }}
|
||||
<h4 class="mb-3">
|
||||
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
|
||||
</h4>
|
||||
<p class="mb-4">{{ .Summary }}</p>
|
||||
<ul class="social-icons">
|
||||
{{ range .Params.social }}
|
||||
<li>
|
||||
<a href="{{ .link | safeURL }}" target="_blank" rel="noopener nofollow">
|
||||
<span class="sr-only">{{ .title }}</span>
|
||||
<i class="{{ .icon }}"></i>
|
||||
</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
30
layouts/partials/components/blog-card.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
<div class="bg-body">
|
||||
{{ $image:= .Params.image }} {{ if $image }} {{ partial "image" (dict "Src" $image "Alt" .Title "Class" "w-full rounded") }} {{ end }}
|
||||
<h4 class="mb-3">
|
||||
<a href="{{ .RelPermalink }}"> {{ .Title }} </a>
|
||||
</h4>
|
||||
{{ $categories:= .Params.categories }} {{ if $categories }}
|
||||
<ul class="mb-4">
|
||||
<li class="mr-4 inline-block">
|
||||
<a href="{{ `authors/` | relLangURL }}{{ .Params.Author | urlize }}/">
|
||||
<i class="fa-regular fa-circle-user mr-2"></i>{{ .Params.author }}
|
||||
</a>
|
||||
</li>
|
||||
<li class="mr-4 inline-block">
|
||||
<i class="fa-regular fa-folder mr-1"></i>
|
||||
{{ range $i,$p:= $categories }}
|
||||
<a
|
||||
href="{{ `categories/` | relLangURL }}{{ . | urlize | lower }}/"
|
||||
class="ms-1"
|
||||
>{{ . | humanize }}{{ if ne $i (sub (len $categories) 1) }} {{ "," }} {{
|
||||
end }}
|
||||
</a>
|
||||
{{ end }}
|
||||
</li>
|
||||
</ul>
|
||||
{{ end }}
|
||||
<p class="mb-6">{{ .Summary }}</p>
|
||||
<a class="btn btn-outline-primary btn-sm" href="{{ .RelPermalink }}">
|
||||
{{ i18n "read_more" }}
|
||||
</a>
|
||||
</div>
|
25
layouts/partials/components/breadcrumb.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
{{ $context := .Context }} {{ $class := .Class }} {{ $base :=
|
||||
site.Home.Permalink }}
|
||||
|
||||
<ul class="{{ $class }} inline-flex space-x-1 capitalize">
|
||||
<li>
|
||||
<a class="text-primary" href="{{ $base }}">
|
||||
{{ i18n "home" | default "Home" }}
|
||||
</a>
|
||||
<span class="inlin-block mr-1">/</span>
|
||||
</li>
|
||||
{{ range $i, $e:= $context.Ancestors.Reverse }} {{ if and (not .IsHome) (ne
|
||||
.Title "Pages") }}
|
||||
<li>
|
||||
<a class="text-primary" href="{{ .RelPermalink }}">
|
||||
{{ i18n (printf "%s" (lower .Title)) | default .Title }}
|
||||
</a>
|
||||
<span class="inlin-block mr-1">/</span>
|
||||
</li>
|
||||
{{ end }} {{ end }}
|
||||
<li>
|
||||
<span class="text-primary">
|
||||
{{ i18n (printf "%s" (lower $context.Title)) | default $context.Title }}
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|