Merge commit '994aa5d4c7d46d9cd8ee12df8f3f2b6f1f53799a'
This commit is contained in:
commit
526b7d49e2
BIN
website/.DS_Store
vendored
BIN
website/.DS_Store
vendored
Binary file not shown.
2
website/.gitignore
vendored
Normal file
2
website/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
result
|
||||||
|
.direnv
|
|
@ -1,21 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2023 - Present, Zeon Studio
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
Binary file not shown.
72
website/README.md
Normal file
72
website/README.md
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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.
|
|
@ -1,29 +0,0 @@
|
||||||
version: 1
|
|
||||||
frontend:
|
|
||||||
phases:
|
|
||||||
preBuild:
|
|
||||||
commands:
|
|
||||||
- yum install -y curl
|
|
||||||
- curl -LO "https://github.com/gohugoio/hugo/releases/download/v0.121.2/hugo_extended_0.121.2_Linux-64bit.tar.gz"
|
|
||||||
- tar -xvf hugo_extended_0.121.2_Linux-64bit.tar.gz
|
|
||||||
- mv hugo /usr/local/bin/
|
|
||||||
- rm hugo_extended_0.121.2_Linux-64bit.tar.gz
|
|
||||||
- echo "HUGO 0.121.2 INSTALLED"
|
|
||||||
- curl -LO "https://dl.google.com/go/go1.20.5.linux-amd64.tar.gz"
|
|
||||||
- tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
|
|
||||||
- export PATH=$PATH:/usr/local/go/bin
|
|
||||||
- rm go1.20.5.linux-amd64.tar.gz
|
|
||||||
- echo "GO 1.20.5 INSTALLED"
|
|
||||||
- npm install
|
|
||||||
build:
|
|
||||||
commands:
|
|
||||||
- npm run project-setup
|
|
||||||
- npm run build
|
|
||||||
artifacts:
|
|
||||||
# IMPORTANT - Please verify your build output directory
|
|
||||||
baseDirectory: /public
|
|
||||||
files:
|
|
||||||
- "**/*"
|
|
||||||
cache:
|
|
||||||
paths:
|
|
||||||
- node_modules/**/*
|
|
BIN
website/assets/.DS_Store
vendored
BIN
website/assets/.DS_Store
vendored
Binary file not shown.
|
@ -1,36 +0,0 @@
|
||||||
// main script
|
|
||||||
(function () {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
// Dropdown Menu Toggler For Mobile
|
|
||||||
// ----------------------------------------
|
|
||||||
const dropdownMenuToggler = document.querySelectorAll(
|
|
||||||
".nav-dropdown > .nav-link",
|
|
||||||
);
|
|
||||||
|
|
||||||
dropdownMenuToggler.forEach((toggler) => {
|
|
||||||
toggler?.addEventListener("click", (e) => {
|
|
||||||
e.target.closest(".nav-item").classList.toggle("active");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Testimonial Slider
|
|
||||||
// ----------------------------------------
|
|
||||||
new Swiper(".testimonial-slider", {
|
|
||||||
spaceBetween: 24,
|
|
||||||
loop: true,
|
|
||||||
pagination: {
|
|
||||||
el: ".testimonial-slider-pagination",
|
|
||||||
type: "bullets",
|
|
||||||
clickable: true,
|
|
||||||
},
|
|
||||||
breakpoints: {
|
|
||||||
768: {
|
|
||||||
slidesPerView: 2,
|
|
||||||
},
|
|
||||||
992: {
|
|
||||||
slidesPerView: 3,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
})();
|
|
BIN
website/assets/plugins/.DS_Store
vendored
BIN
website/assets/plugins/.DS_Store
vendored
Binary file not shown.
|
@ -1,179 +0,0 @@
|
||||||
/*!***************************************************
|
|
||||||
* Google Map
|
|
||||||
*****************************************************/
|
|
||||||
|
|
||||||
window.marker = null;
|
|
||||||
|
|
||||||
function initialize() {
|
|
||||||
var map,
|
|
||||||
mapId = document.getElementById("map");
|
|
||||||
var latitude = mapId.getAttribute("data-latitude");
|
|
||||||
var longitude = mapId.getAttribute("data-longitude");
|
|
||||||
var mapMarker = mapId.getAttribute("data-marker");
|
|
||||||
var mapMarkerName = mapId.getAttribute("data-marker-name");
|
|
||||||
var nottingham = new google.maps.LatLng(latitude, longitude);
|
|
||||||
var style = [
|
|
||||||
{
|
|
||||||
featureType: "administrative",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
saturation: "-100",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "administrative.province",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
visibility: "off",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "landscape",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
saturation: -100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
lightness: 65,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
visibility: "on",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "poi",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
saturation: -100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
lightness: "50",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
visibility: "simplified",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "road",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
saturation: "-100",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "road.highway",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
visibility: "simplified",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "road.arterial",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
lightness: "30",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "road.local",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
lightness: "40",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "transit",
|
|
||||||
elementType: "all",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
saturation: -100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
visibility: "simplified",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "water",
|
|
||||||
elementType: "geometry",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
hue: "#ffff00",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
lightness: -25,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
saturation: -97,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
featureType: "water",
|
|
||||||
elementType: "labels",
|
|
||||||
stylers: [
|
|
||||||
{
|
|
||||||
lightness: -25,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
saturation: -100,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
var mapOptions = {
|
|
||||||
center: nottingham,
|
|
||||||
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
|
||||||
backgroundColor: "#000",
|
|
||||||
zoom: 15,
|
|
||||||
panControl: !1,
|
|
||||||
zoomControl: !0,
|
|
||||||
mapTypeControl: !1,
|
|
||||||
scaleControl: !1,
|
|
||||||
streetViewControl: !1,
|
|
||||||
overviewMapControl: !1,
|
|
||||||
zoomControlOptions: {
|
|
||||||
style: google.maps.ZoomControlStyle.LARGE,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
map = new google.maps.Map(document.getElementById("map"), mapOptions);
|
|
||||||
var mapType = new google.maps.StyledMapType(style, {
|
|
||||||
name: "Grayscale",
|
|
||||||
});
|
|
||||||
map.mapTypes.set("grey", mapType);
|
|
||||||
map.setMapTypeId("grey");
|
|
||||||
var marker_image = mapMarker;
|
|
||||||
var pinIcon = new google.maps.MarkerImage(
|
|
||||||
marker_image,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
new google.maps.Size(30, 50),
|
|
||||||
);
|
|
||||||
marker = new google.maps.Marker({
|
|
||||||
position: nottingham,
|
|
||||||
map: map,
|
|
||||||
icon: pinIcon,
|
|
||||||
title: mapMarkerName,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var map = document.getElementById("map");
|
|
||||||
if (map != null) {
|
|
||||||
google.maps.event.addDomListener(window, "load", initialize);
|
|
||||||
}
|
|
|
@ -1,667 +0,0 @@
|
||||||
/**
|
|
||||||
* Swiper 8.0.7
|
|
||||||
* Most modern mobile touch slider and framework with hardware accelerated transitions
|
|
||||||
* https://swiperjs.com
|
|
||||||
*
|
|
||||||
* Copyright 2014-2022 Vladimir Kharlampidi
|
|
||||||
*
|
|
||||||
* Released under the MIT License
|
|
||||||
*
|
|
||||||
* Released on: March 4, 2022
|
|
||||||
*/
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: "swiper-icons";
|
|
||||||
src: url("data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA");
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
:root {
|
|
||||||
--swiper-theme-color: #007aff;
|
|
||||||
}
|
|
||||||
.swiper {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
list-style: none;
|
|
||||||
padding: 0;
|
|
||||||
/* Fix of Webkit flickering */
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
.swiper-vertical > .swiper-wrapper {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.swiper-wrapper {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
z-index: 1;
|
|
||||||
display: flex;
|
|
||||||
transition-property: transform;
|
|
||||||
box-sizing: content-box;
|
|
||||||
}
|
|
||||||
.swiper-android .swiper-slide,
|
|
||||||
.swiper-wrapper {
|
|
||||||
transform: translate3d(0px, 0, 0);
|
|
||||||
}
|
|
||||||
.swiper-pointer-events {
|
|
||||||
touch-action: pan-y;
|
|
||||||
}
|
|
||||||
.swiper-pointer-events.swiper-vertical {
|
|
||||||
touch-action: pan-x;
|
|
||||||
}
|
|
||||||
.swiper-slide {
|
|
||||||
flex-shrink: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
transition-property: transform;
|
|
||||||
}
|
|
||||||
.swiper-slide-invisible-blank {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
/* Auto Height */
|
|
||||||
.swiper-autoheight,
|
|
||||||
.swiper-autoheight .swiper-slide {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
.swiper-autoheight .swiper-wrapper {
|
|
||||||
align-items: flex-start;
|
|
||||||
transition-property: transform, height;
|
|
||||||
}
|
|
||||||
.swiper-backface-hidden .swiper-slide {
|
|
||||||
transform: translateZ(0);
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
}
|
|
||||||
/* 3D Effects */
|
|
||||||
.swiper-3d,
|
|
||||||
.swiper-3d.swiper-css-mode .swiper-wrapper {
|
|
||||||
perspective: 1200px;
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-wrapper,
|
|
||||||
.swiper-3d .swiper-slide,
|
|
||||||
.swiper-3d .swiper-slide-shadow,
|
|
||||||
.swiper-3d .swiper-slide-shadow-left,
|
|
||||||
.swiper-3d .swiper-slide-shadow-right,
|
|
||||||
.swiper-3d .swiper-slide-shadow-top,
|
|
||||||
.swiper-3d .swiper-slide-shadow-bottom,
|
|
||||||
.swiper-3d .swiper-cube-shadow {
|
|
||||||
transform-style: preserve-3d;
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-slide-shadow,
|
|
||||||
.swiper-3d .swiper-slide-shadow-left,
|
|
||||||
.swiper-3d .swiper-slide-shadow-right,
|
|
||||||
.swiper-3d .swiper-slide-shadow-top,
|
|
||||||
.swiper-3d .swiper-slide-shadow-bottom {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-slide-shadow {
|
|
||||||
background: rgba(0, 0, 0, 0.15);
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-slide-shadow-left {
|
|
||||||
background-image: linear-gradient(
|
|
||||||
to left,
|
|
||||||
rgba(0, 0, 0, 0.5),
|
|
||||||
rgba(0, 0, 0, 0)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-slide-shadow-right {
|
|
||||||
background-image: linear-gradient(
|
|
||||||
to right,
|
|
||||||
rgba(0, 0, 0, 0.5),
|
|
||||||
rgba(0, 0, 0, 0)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-slide-shadow-top {
|
|
||||||
background-image: linear-gradient(
|
|
||||||
to top,
|
|
||||||
rgba(0, 0, 0, 0.5),
|
|
||||||
rgba(0, 0, 0, 0)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
.swiper-3d .swiper-slide-shadow-bottom {
|
|
||||||
background-image: linear-gradient(
|
|
||||||
to bottom,
|
|
||||||
rgba(0, 0, 0, 0.5),
|
|
||||||
rgba(0, 0, 0, 0)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
/* CSS Mode */
|
|
||||||
.swiper-css-mode > .swiper-wrapper {
|
|
||||||
overflow: auto;
|
|
||||||
scrollbar-width: none;
|
|
||||||
/* For Firefox */
|
|
||||||
-ms-overflow-style: none;
|
|
||||||
/* For Internet Explorer and Edge */
|
|
||||||
}
|
|
||||||
.swiper-css-mode > .swiper-wrapper::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.swiper-css-mode > .swiper-wrapper > .swiper-slide {
|
|
||||||
scroll-snap-align: start start;
|
|
||||||
}
|
|
||||||
.swiper-horizontal.swiper-css-mode > .swiper-wrapper {
|
|
||||||
scroll-snap-type: x mandatory;
|
|
||||||
}
|
|
||||||
.swiper-vertical.swiper-css-mode > .swiper-wrapper {
|
|
||||||
scroll-snap-type: y mandatory;
|
|
||||||
}
|
|
||||||
.swiper-centered > .swiper-wrapper::before {
|
|
||||||
content: "";
|
|
||||||
flex-shrink: 0;
|
|
||||||
order: 9999;
|
|
||||||
}
|
|
||||||
.swiper-centered.swiper-horizontal
|
|
||||||
> .swiper-wrapper
|
|
||||||
> .swiper-slide:first-child {
|
|
||||||
margin-inline-start: var(--swiper-centered-offset-before);
|
|
||||||
}
|
|
||||||
.swiper-centered.swiper-horizontal > .swiper-wrapper::before {
|
|
||||||
height: 100%;
|
|
||||||
min-height: 1px;
|
|
||||||
width: var(--swiper-centered-offset-after);
|
|
||||||
}
|
|
||||||
.swiper-centered.swiper-vertical > .swiper-wrapper > .swiper-slide:first-child {
|
|
||||||
margin-block-start: var(--swiper-centered-offset-before);
|
|
||||||
}
|
|
||||||
.swiper-centered.swiper-vertical > .swiper-wrapper::before {
|
|
||||||
width: 100%;
|
|
||||||
min-width: 1px;
|
|
||||||
height: var(--swiper-centered-offset-after);
|
|
||||||
}
|
|
||||||
.swiper-centered > .swiper-wrapper > .swiper-slide {
|
|
||||||
scroll-snap-align: center center;
|
|
||||||
}
|
|
||||||
.swiper-virtual .swiper-slide {
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
transform: translateZ(0);
|
|
||||||
}
|
|
||||||
.swiper-virtual.swiper-css-mode .swiper-wrapper::after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after {
|
|
||||||
height: 1px;
|
|
||||||
width: var(--swiper-virtual-size);
|
|
||||||
}
|
|
||||||
.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after {
|
|
||||||
width: 1px;
|
|
||||||
height: var(--swiper-virtual-size);
|
|
||||||
}
|
|
||||||
:root {
|
|
||||||
--swiper-navigation-size: 44px;
|
|
||||||
/*
|
|
||||||
--swiper-navigation-color: var(--swiper-theme-color);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
.swiper-button-prev,
|
|
||||||
.swiper-button-next {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
width: calc(var(--swiper-navigation-size) / 44 * 27);
|
|
||||||
height: var(--swiper-navigation-size);
|
|
||||||
margin-top: calc(0px - (var(--swiper-navigation-size) / 2));
|
|
||||||
z-index: 10;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: var(--swiper-navigation-color, var(--swiper-theme-color));
|
|
||||||
}
|
|
||||||
.swiper-button-prev.swiper-button-disabled,
|
|
||||||
.swiper-button-next.swiper-button-disabled {
|
|
||||||
opacity: 0.35;
|
|
||||||
cursor: auto;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.swiper-button-prev:after,
|
|
||||||
.swiper-button-next:after {
|
|
||||||
font-family: swiper-icons;
|
|
||||||
font-size: var(--swiper-navigation-size);
|
|
||||||
text-transform: none !important;
|
|
||||||
letter-spacing: 0;
|
|
||||||
text-transform: none;
|
|
||||||
font-variant: initial;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
.swiper-button-prev,
|
|
||||||
.swiper-rtl .swiper-button-next {
|
|
||||||
left: 10px;
|
|
||||||
right: auto;
|
|
||||||
}
|
|
||||||
.swiper-button-prev:after,
|
|
||||||
.swiper-rtl .swiper-button-next:after {
|
|
||||||
content: "prev";
|
|
||||||
}
|
|
||||||
.swiper-button-next,
|
|
||||||
.swiper-rtl .swiper-button-prev {
|
|
||||||
right: 10px;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
.swiper-button-next:after,
|
|
||||||
.swiper-rtl .swiper-button-prev:after {
|
|
||||||
content: "next";
|
|
||||||
}
|
|
||||||
.swiper-button-lock {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
:root {
|
|
||||||
/*
|
|
||||||
--swiper-pagination-color: var(--swiper-theme-color);
|
|
||||||
--swiper-pagination-bullet-size: 8px;
|
|
||||||
--swiper-pagination-bullet-width: 8px;
|
|
||||||
--swiper-pagination-bullet-height: 8px;
|
|
||||||
--swiper-pagination-bullet-inactive-color: #000;
|
|
||||||
--swiper-pagination-bullet-inactive-opacity: 0.2;
|
|
||||||
--swiper-pagination-bullet-opacity: 1;
|
|
||||||
--swiper-pagination-bullet-horizontal-gap: 4px;
|
|
||||||
--swiper-pagination-bullet-vertical-gap: 6px;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
.swiper-pagination {
|
|
||||||
position: absolute;
|
|
||||||
text-align: center;
|
|
||||||
transition: 300ms opacity;
|
|
||||||
transform: translate3d(0, 0, 0);
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
.swiper-pagination.swiper-pagination-hidden {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
/* Common Styles */
|
|
||||||
.swiper-pagination-fraction,
|
|
||||||
.swiper-pagination-custom,
|
|
||||||
.swiper-horizontal > .swiper-pagination-bullets,
|
|
||||||
.swiper-pagination-bullets.swiper-pagination-horizontal {
|
|
||||||
bottom: 10px;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
/* Bullets */
|
|
||||||
.swiper-pagination-bullets-dynamic {
|
|
||||||
overflow: hidden;
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
|
|
||||||
transform: scale(0.33);
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active {
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main {
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev {
|
|
||||||
transform: scale(0.66);
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev {
|
|
||||||
transform: scale(0.33);
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next {
|
|
||||||
transform: scale(0.66);
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next {
|
|
||||||
transform: scale(0.33);
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
width: var(
|
|
||||||
--swiper-pagination-bullet-width,
|
|
||||||
var(--swiper-pagination-bullet-size, 8px)
|
|
||||||
);
|
|
||||||
height: var(
|
|
||||||
--swiper-pagination-bullet-height,
|
|
||||||
var(--swiper-pagination-bullet-size, 8px)
|
|
||||||
);
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: var(--swiper-pagination-bullet-inactive-color, #000);
|
|
||||||
opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.2);
|
|
||||||
}
|
|
||||||
button.swiper-pagination-bullet {
|
|
||||||
border: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
appearance: none;
|
|
||||||
}
|
|
||||||
.swiper-pagination-clickable .swiper-pagination-bullet {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullet:only-child {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.swiper-pagination-bullet-active {
|
|
||||||
opacity: var(--swiper-pagination-bullet-opacity, 1);
|
|
||||||
background: var(--swiper-pagination-color, var(--swiper-theme-color));
|
|
||||||
}
|
|
||||||
.swiper-vertical > .swiper-pagination-bullets,
|
|
||||||
.swiper-pagination-vertical.swiper-pagination-bullets {
|
|
||||||
right: 10px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translate3d(0px, -50%, 0);
|
|
||||||
}
|
|
||||||
.swiper-vertical > .swiper-pagination-bullets .swiper-pagination-bullet,
|
|
||||||
.swiper-pagination-vertical.swiper-pagination-bullets
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.swiper-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic,
|
|
||||||
.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
width: 8px;
|
|
||||||
}
|
|
||||||
.swiper-vertical
|
|
||||||
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic
|
|
||||||
.swiper-pagination-bullet,
|
|
||||||
.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
display: inline-block;
|
|
||||||
transition:
|
|
||||||
200ms transform,
|
|
||||||
200ms top;
|
|
||||||
}
|
|
||||||
.swiper-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet,
|
|
||||||
.swiper-pagination-horizontal.swiper-pagination-bullets
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px);
|
|
||||||
}
|
|
||||||
.swiper-horizontal
|
|
||||||
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic,
|
|
||||||
.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.swiper-horizontal
|
|
||||||
> .swiper-pagination-bullets.swiper-pagination-bullets-dynamic
|
|
||||||
.swiper-pagination-bullet,
|
|
||||||
.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
transition:
|
|
||||||
200ms transform,
|
|
||||||
200ms left;
|
|
||||||
}
|
|
||||||
.swiper-horizontal.swiper-rtl
|
|
||||||
> .swiper-pagination-bullets-dynamic
|
|
||||||
.swiper-pagination-bullet {
|
|
||||||
transition:
|
|
||||||
200ms transform,
|
|
||||||
200ms right;
|
|
||||||
}
|
|
||||||
/* Progress */
|
|
||||||
.swiper-pagination-progressbar {
|
|
||||||
background: rgba(0, 0, 0, 0.25);
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
.swiper-pagination-progressbar .swiper-pagination-progressbar-fill {
|
|
||||||
background: var(--swiper-pagination-color, var(--swiper-theme-color));
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
transform: scale(0);
|
|
||||||
transform-origin: left top;
|
|
||||||
}
|
|
||||||
.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill {
|
|
||||||
transform-origin: right top;
|
|
||||||
}
|
|
||||||
.swiper-horizontal > .swiper-pagination-progressbar,
|
|
||||||
.swiper-pagination-progressbar.swiper-pagination-horizontal,
|
|
||||||
.swiper-vertical
|
|
||||||
> .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,
|
|
||||||
.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite {
|
|
||||||
width: 100%;
|
|
||||||
height: 4px;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
.swiper-vertical > .swiper-pagination-progressbar,
|
|
||||||
.swiper-pagination-progressbar.swiper-pagination-vertical,
|
|
||||||
.swiper-horizontal
|
|
||||||
> .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,
|
|
||||||
.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite {
|
|
||||||
width: 4px;
|
|
||||||
height: 100%;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
.swiper-pagination-lock {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
/* Scrollbar */
|
|
||||||
.swiper-scrollbar {
|
|
||||||
border-radius: 10px;
|
|
||||||
position: relative;
|
|
||||||
-ms-touch-action: none;
|
|
||||||
background: rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
.swiper-horizontal > .swiper-scrollbar {
|
|
||||||
position: absolute;
|
|
||||||
left: 1%;
|
|
||||||
bottom: 3px;
|
|
||||||
z-index: 50;
|
|
||||||
height: 5px;
|
|
||||||
width: 98%;
|
|
||||||
}
|
|
||||||
.swiper-vertical > .swiper-scrollbar {
|
|
||||||
position: absolute;
|
|
||||||
right: 3px;
|
|
||||||
top: 1%;
|
|
||||||
z-index: 50;
|
|
||||||
width: 5px;
|
|
||||||
height: 98%;
|
|
||||||
}
|
|
||||||
.swiper-scrollbar-drag {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
position: relative;
|
|
||||||
background: rgba(0, 0, 0, 0.5);
|
|
||||||
border-radius: 10px;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
.swiper-scrollbar-cursor-drag {
|
|
||||||
cursor: move;
|
|
||||||
}
|
|
||||||
.swiper-scrollbar-lock {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.swiper-zoom-container {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.swiper-zoom-container > img,
|
|
||||||
.swiper-zoom-container > svg,
|
|
||||||
.swiper-zoom-container > canvas {
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
object-fit: contain;
|
|
||||||
}
|
|
||||||
.swiper-slide-zoomed {
|
|
||||||
cursor: move;
|
|
||||||
}
|
|
||||||
/* Preloader */
|
|
||||||
:root {
|
|
||||||
/*
|
|
||||||
--swiper-preloader-color: var(--swiper-theme-color);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
.swiper-lazy-preloader {
|
|
||||||
width: 42px;
|
|
||||||
height: 42px;
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
top: 50%;
|
|
||||||
margin-left: -21px;
|
|
||||||
margin-top: -21px;
|
|
||||||
z-index: 10;
|
|
||||||
transform-origin: 50%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color));
|
|
||||||
border-radius: 50%;
|
|
||||||
border-top-color: transparent;
|
|
||||||
}
|
|
||||||
.swiper-slide-visible .swiper-lazy-preloader {
|
|
||||||
animation: swiper-preloader-spin 1s infinite linear;
|
|
||||||
}
|
|
||||||
.swiper-lazy-preloader-white {
|
|
||||||
--swiper-preloader-color: #fff;
|
|
||||||
}
|
|
||||||
.swiper-lazy-preloader-black {
|
|
||||||
--swiper-preloader-color: #000;
|
|
||||||
}
|
|
||||||
@keyframes swiper-preloader-spin {
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* a11y */
|
|
||||||
.swiper .swiper-notification {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
pointer-events: none;
|
|
||||||
opacity: 0;
|
|
||||||
z-index: -1000;
|
|
||||||
}
|
|
||||||
.swiper-free-mode > .swiper-wrapper {
|
|
||||||
transition-timing-function: ease-out;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.swiper-grid > .swiper-wrapper {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
.swiper-grid-column > .swiper-wrapper {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.swiper-fade.swiper-free-mode .swiper-slide {
|
|
||||||
transition-timing-function: ease-out;
|
|
||||||
}
|
|
||||||
.swiper-fade .swiper-slide {
|
|
||||||
pointer-events: none;
|
|
||||||
transition-property: opacity;
|
|
||||||
}
|
|
||||||
.swiper-fade .swiper-slide .swiper-slide {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.swiper-fade .swiper-slide-active,
|
|
||||||
.swiper-fade .swiper-slide-active .swiper-slide-active {
|
|
||||||
pointer-events: auto;
|
|
||||||
}
|
|
||||||
.swiper-cube {
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-slide {
|
|
||||||
pointer-events: none;
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
z-index: 1;
|
|
||||||
visibility: hidden;
|
|
||||||
transform-origin: 0 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-slide .swiper-slide {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.swiper-cube.swiper-rtl .swiper-slide {
|
|
||||||
transform-origin: 100% 0;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-slide-active,
|
|
||||||
.swiper-cube .swiper-slide-active .swiper-slide-active {
|
|
||||||
pointer-events: auto;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-slide-active,
|
|
||||||
.swiper-cube .swiper-slide-next,
|
|
||||||
.swiper-cube .swiper-slide-prev,
|
|
||||||
.swiper-cube .swiper-slide-next + .swiper-slide {
|
|
||||||
pointer-events: auto;
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-slide-shadow-top,
|
|
||||||
.swiper-cube .swiper-slide-shadow-bottom,
|
|
||||||
.swiper-cube .swiper-slide-shadow-left,
|
|
||||||
.swiper-cube .swiper-slide-shadow-right {
|
|
||||||
z-index: 0;
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-cube-shadow {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0px;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
opacity: 0.6;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
.swiper-cube .swiper-cube-shadow:before {
|
|
||||||
content: "";
|
|
||||||
background: #000;
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
filter: blur(50px);
|
|
||||||
}
|
|
||||||
.swiper-flip {
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
.swiper-flip .swiper-slide {
|
|
||||||
pointer-events: none;
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
.swiper-flip .swiper-slide .swiper-slide {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.swiper-flip .swiper-slide-active,
|
|
||||||
.swiper-flip .swiper-slide-active .swiper-slide-active {
|
|
||||||
pointer-events: auto;
|
|
||||||
}
|
|
||||||
.swiper-flip .swiper-slide-shadow-top,
|
|
||||||
.swiper-flip .swiper-slide-shadow-bottom,
|
|
||||||
.swiper-flip .swiper-slide-shadow-left,
|
|
||||||
.swiper-flip .swiper-slide-shadow-right {
|
|
||||||
z-index: 0;
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
}
|
|
||||||
.swiper-creative .swiper-slide {
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
overflow: hidden;
|
|
||||||
transition-property: transform, opacity, height;
|
|
||||||
}
|
|
||||||
.swiper-cards {
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
.swiper-cards .swiper-slide {
|
|
||||||
transform-origin: center bottom;
|
|
||||||
-webkit-backface-visibility: hidden;
|
|
||||||
backface-visibility: hidden;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +0,0 @@
|
||||||
################ English language ##################
|
|
||||||
[en]
|
|
||||||
languageName = "En"
|
|
||||||
languageCode = "en-us"
|
|
||||||
contentDir = "content/english"
|
|
||||||
weight = 1
|
|
|
@ -1,81 +0,0 @@
|
||||||
############# English navigation ##############
|
|
||||||
|
|
||||||
# main menu
|
|
||||||
[[main]]
|
|
||||||
name = "For You"
|
|
||||||
weight = 1
|
|
||||||
hasChildren = true
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "For You"
|
|
||||||
name = "Individuals"
|
|
||||||
pageRef = "/Individuals"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "For You"
|
|
||||||
name = "Developers"
|
|
||||||
pageRef = "/Developers"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "For You"
|
|
||||||
name = "European Commission"
|
|
||||||
pageRef = "/EC"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
weight = 2
|
|
||||||
name = "Consortium"
|
|
||||||
hasChildren = true
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "Consortium"
|
|
||||||
name = "Open Internet Discourse"
|
|
||||||
pageRef = "/OID"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "Consortium"
|
|
||||||
name = "NLnet"
|
|
||||||
pageRef = "/NLnet"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "Consortium"
|
|
||||||
name = "Tweag"
|
|
||||||
pageRef = "/Tweag"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
parent = "Consortium"
|
|
||||||
name = "NORDUnet"
|
|
||||||
pageRef = "/NORDUnet"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
weight = 3
|
|
||||||
name = "Fediversity"
|
|
||||||
pageRef = "Fediversity"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
weight = 4
|
|
||||||
name = "Grants"
|
|
||||||
pageRef = "Grants"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
weight = 5
|
|
||||||
name = "Events"
|
|
||||||
pageRef = "Events"
|
|
||||||
|
|
||||||
[[main]]
|
|
||||||
weight = 6
|
|
||||||
name = "News"
|
|
||||||
pageRef = "Blog"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# footer menu
|
|
||||||
[[footer]]
|
|
||||||
name = "About"
|
|
||||||
pageRef = "fediversity"
|
|
||||||
weight = 1
|
|
||||||
|
|
||||||
[[footer]]
|
|
||||||
name = "Privacy Policy"
|
|
||||||
pageRef = "/privacy-policy"
|
|
||||||
weight = 3
|
|
|
@ -1,93 +0,0 @@
|
||||||
[hugoVersion]
|
|
||||||
extended = true
|
|
||||||
min = "0.115.2"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/zeon-studio/hugoplate"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/search"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/pwa"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/images"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/videos"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/icons/font-awesome"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/icons/themify-icons"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/gzip-caching"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/adsense"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/accordion"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/table-of-contents"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/tab"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/modal"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/gallery-slider"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/components/preloader"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/components/social-share"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/components/cookie-consent"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/components/custom-script"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/components/render-link"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/components/valine-comment"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/components/crisp-chat"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/shortcodes/button"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/shortcodes/notice"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/seo-tools/basic-seo"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/seo-tools/site-verifications"
|
|
||||||
|
|
||||||
[[imports]]
|
|
||||||
path = "github.com/gethugothemes/hugo-modules/seo-tools/google-tag-manager"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/seo-tools/baidu-analytics"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/seo-tools/matomo-analytics"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/seo-tools/plausible-analytics"
|
|
||||||
|
|
||||||
# [[imports]]
|
|
||||||
# path = "github.com/gethugothemes/hugo-modules/seo-tools/counter-analytics"
|
|
|
@ -1,101 +0,0 @@
|
||||||
#################### default parameters ################################
|
|
||||||
# favicon module: https://github.com/gethugothemes/hugo-modules/tree/master/images#favicon-implementation
|
|
||||||
favicon = "images/favicon.png"
|
|
||||||
# logo module: https://github.com/gethugothemes/hugo-modules/tree/master/images#logo-implementation
|
|
||||||
logo = "images/ngi_fedi_full.svg"
|
|
||||||
logo_darkmode = "images/logo-darkmode.png"
|
|
||||||
# use `px` or `x` with logo_width, example: "100px".
|
|
||||||
# Note: logo_width is not work with .svg file
|
|
||||||
logo_width = "160px"
|
|
||||||
logo_height = "32px"
|
|
||||||
# if logo_webp set false, will not generate WEBP version of logo | default is true
|
|
||||||
logo_webp = true
|
|
||||||
# logo text will only show when logo is missing.
|
|
||||||
logo_text = "Hugoplate"
|
|
||||||
# navbar fixed to top
|
|
||||||
navbar_fixed = true
|
|
||||||
# theme-mode
|
|
||||||
theme_switcher = false
|
|
||||||
theme_default = "system" # available options [light/dark/system]
|
|
||||||
# Main Sections
|
|
||||||
mainSections = ["blog"]
|
|
||||||
# contact form action
|
|
||||||
contact_form_action = "#" # contact form works with [https://airform.io/] or [https://formspree.io]
|
|
||||||
# google tag manager, see https://developers.google.com/tag-manager/
|
|
||||||
google_tag_manager = "" # example: G-XXXXXXXXXX
|
|
||||||
google_adsense = "" # example: ca-pub-xxxxxxxxxxxxxxxx
|
|
||||||
# custom script on header, example: custom_script= "<script>console.log(\"Hello World\")</script>"
|
|
||||||
custom_script = ""
|
|
||||||
# copyright
|
|
||||||
# copyright = "Designed & Developed by [Zeon Studio](https://zeon.studio)"
|
|
||||||
|
|
||||||
# Preloader
|
|
||||||
# preloader module: https://github.com/gethugothemes/hugo-modules/tree/master/components/preloader
|
|
||||||
[preloader]
|
|
||||||
enable = false
|
|
||||||
preloader = "" # use jpg, png, svg or gif format.
|
|
||||||
|
|
||||||
# Navigation button
|
|
||||||
[navigation_button]
|
|
||||||
enable = true
|
|
||||||
label = "Contact"
|
|
||||||
link = "contact"
|
|
||||||
|
|
||||||
# search
|
|
||||||
# search module: https://github.com/gethugothemes/hugo-modules/tree/master/search
|
|
||||||
[search]
|
|
||||||
enable = false
|
|
||||||
primary_color = "#121212"
|
|
||||||
include_sections = ["blog"]
|
|
||||||
show_image = true
|
|
||||||
show_description = true
|
|
||||||
show_tags = true
|
|
||||||
show_categories = true
|
|
||||||
|
|
||||||
|
|
||||||
# seo meta data for OpenGraph / Twitter Card
|
|
||||||
# seo module: https://github.com/gethugothemes/hugo-modules/tree/master/seo-tools/basic-seo
|
|
||||||
[metadata]
|
|
||||||
keywords = ["fediverse", "nixos", "open source"]
|
|
||||||
description = "Fediversity Project"
|
|
||||||
author = "NGI Fediversity"
|
|
||||||
image = "images/logo.png"
|
|
||||||
|
|
||||||
|
|
||||||
# site verifications
|
|
||||||
# verification module: https://github.com/gethugothemes/hugo-modules/tree/master/seo-tools/site-verifications
|
|
||||||
[site_verification]
|
|
||||||
google = "" # Your verification code
|
|
||||||
bing = "" # Your verification code
|
|
||||||
baidu = "" # Your verification code
|
|
||||||
facebook = "" # Your verification code
|
|
||||||
mastodon = "" # Your verification code
|
|
||||||
|
|
||||||
# cookies
|
|
||||||
# cookies module: https://github.com/gethugothemes/hugo-modules/tree/master/components/cookie-consent
|
|
||||||
[cookies]
|
|
||||||
enable = false
|
|
||||||
expire_days = 60
|
|
||||||
content = "This site uses cookies. By continuing to use this website, you agree to their use."
|
|
||||||
button = "I Accept"
|
|
||||||
|
|
||||||
######################## sidebar widgets #########################
|
|
||||||
[widgets]
|
|
||||||
sidebar = ["categories", "tags"]
|
|
||||||
|
|
||||||
|
|
||||||
# google map
|
|
||||||
[google_map]
|
|
||||||
enable = false
|
|
||||||
map_api_key = "AIzaSyCcABaamniA6OL5YvYSpB3pFMNrXwXnLwU"
|
|
||||||
map_latitude = "51.5223477"
|
|
||||||
map_longitude = "-0.1622023"
|
|
||||||
map_marker = "images/marker.png"
|
|
||||||
|
|
||||||
|
|
||||||
# Subscription
|
|
||||||
[subscription]
|
|
||||||
enable = false
|
|
||||||
# mailchimp subsciption
|
|
||||||
mailchimp_form_action = "https://gmail.us4.list-manage.com/subscribe/post?u=463ee871f45d2d93748e77cad&id=a0a2c6d074" # replace this url with yours
|
|
||||||
mailchimp_form_name = "b_463ee871f45d2d93748e77cad_a0a2c6d074"
|
|
149
website/content/default.nix
Normal file
149
website/content/default.nix
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
{ 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
|
||||||
|
prev-content = prev.html.body.content;
|
||||||
|
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-content) # header
|
||||||
|
{
|
||||||
|
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
website/content/developers.nix
Normal file
19
website/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!
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,15 +0,0 @@
|
||||||
---
|
|
||||||
title: "Fediversity new website launch"
|
|
||||||
description: "Announcing Our New Website for the Fediversity Project"
|
|
||||||
date: 2024-05-15T05:00:00Z
|
|
||||||
image: "/images/website-new.png"
|
|
||||||
categories: ["News"]
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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!
|
|
|
@ -1,5 +0,0 @@
|
||||||
---
|
|
||||||
title: "News"
|
|
||||||
meta_title: "News"
|
|
||||||
description: "News about Fediversity"
|
|
||||||
---
|
|
|
@ -1,17 +0,0 @@
|
||||||
---
|
|
||||||
title: "Fediversity Tech Session"
|
|
||||||
meta_title: ""
|
|
||||||
description: "Fediversity Tech Session - NixOS and Kubernetes"
|
|
||||||
date: 2024-08-05T05:00:00Z
|
|
||||||
image: "/images/checkbox-illustration-scaled.png"
|
|
||||||
categories: ["News"]
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
title: "Nordunet Conference 2024"
|
|
||||||
meta_title: ""
|
|
||||||
description: "Nordunet Conference 2024"
|
|
||||||
date: 2024-09-17T05:00:00Z
|
|
||||||
image: "/images/bergen-airport.jpeg"
|
|
||||||
categories: ["News"]
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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!
|
|
|
@ -1,16 +0,0 @@
|
||||||
---
|
|
||||||
title: "Fediversity Project publicly announced"
|
|
||||||
meta_title: ""
|
|
||||||
description: "The Fediversity Project has officially been announced"
|
|
||||||
date: 2024-01-01T05:00:00Z
|
|
||||||
image: "/images/checkbox-illustration-scaled.png"
|
|
||||||
categories: ["News"]
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,16 +0,0 @@
|
||||||
---
|
|
||||||
title: "PublicSpaces Conference 2024"
|
|
||||||
meta_title: ""
|
|
||||||
description: "PublicSpaces Conference 2024 - 'Take Back the Internet'"
|
|
||||||
date: 2024-07-30T05:00:00Z
|
|
||||||
image: "/images/avhuffelenmastodonpin.jpg"
|
|
||||||
categories: ["News"]
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,5 +0,0 @@
|
||||||
---
|
|
||||||
title: "Events"
|
|
||||||
meta_title: "Events"
|
|
||||||
description: "Events related to the fediverse and NixOS."
|
|
||||||
---
|
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
title: "OW2con 2024"
|
|
||||||
meta_title: ""
|
|
||||||
description: "OW2con is the annual European open source conference in Paris"
|
|
||||||
date: 2024-05-11T09:00:00Z
|
|
||||||
categories: ["Event", "Conference"]
|
|
||||||
image: "/images/image-placeholder.png"
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
date_start: 2024-06-11
|
|
||||||
date_end: 2024-06-12
|
|
||||||
datetime_start: 2024-06-11 09:00
|
|
||||||
datetime_end: 2024-06-12 18:00
|
|
||||||
location: Paris-Chatillon
|
|
||||||
---
|
|
||||||
|
|
||||||
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?
|
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
title: "PublicSpaces Conference 2024"
|
|
||||||
meta_title: ""
|
|
||||||
date: 2024-05-11T14:00:00+02:00
|
|
||||||
description: "A conference by PublicSpaces, Taking Back the Internet."
|
|
||||||
categories: ["Event", "Conference"]
|
|
||||||
image: "/images/image-placeholder.png"
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
date_start: 2024-06-06
|
|
||||||
date_end: 2024-06-07
|
|
||||||
datetime_start: 2024-06-06 09:00
|
|
||||||
datetime_end: 2024-06-07 18:00
|
|
||||||
location: Pakhuis de Zwijger - Amsterdam
|
|
||||||
---
|
|
||||||
w
|
|
||||||
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/)
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
---
|
|
||||||
title: "State of the Internet 2024"
|
|
||||||
meta_title: ""
|
|
||||||
description: "The State of the Internet 2024 by Waag"
|
|
||||||
date: 2024-04-10T16:00:00Z
|
|
||||||
image: "/images/image-placeholder.png"
|
|
||||||
categories: ["Event", "Webinar"]
|
|
||||||
author: "Laurens Hof"
|
|
||||||
draft: false
|
|
||||||
date_start: 2024-05-16
|
|
||||||
date_end: 2024-05-16
|
|
||||||
datetime_start: 2024-05-16 18:00
|
|
||||||
datetime_end: 2024-05-16 20:00
|
|
||||||
location: OBA Oosterdok - Amsterdam
|
|
||||||
---
|
|
||||||
|
|
||||||
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/)
|
|
|
@ -1,11 +0,0 @@
|
||||||
---
|
|
||||||
title: "Consortium"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Consortium"
|
|
||||||
# meta description
|
|
||||||
description: "The organisations behind the Fediversity Project"
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
Information about the project. TODO.
|
|
|
@ -1,17 +0,0 @@
|
||||||
---
|
|
||||||
title: "Developers"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Developers"
|
|
||||||
# meta description
|
|
||||||
description: "Information for developers about the Fediversity Project."
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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!
|
|
|
@ -1,13 +0,0 @@
|
||||||
---
|
|
||||||
title: "European Commission"
|
|
||||||
# meta title
|
|
||||||
meta_title: "European Commission"
|
|
||||||
# meta description
|
|
||||||
description: "Information about the Fediversity Project for the grant providers."
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,17 +0,0 @@
|
||||||
---
|
|
||||||
title: "Fediversity"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Fediversity"
|
|
||||||
# meta description
|
|
||||||
description: "More information about the Fediversity Project"
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,17 +0,0 @@
|
||||||
---
|
|
||||||
title: "Grants"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Grants"
|
|
||||||
# meta description
|
|
||||||
description: "How to apply for grants as part of the Fediversity Project."
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
title: "Individuals"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Individuals"
|
|
||||||
# meta description
|
|
||||||
description: "Information about the project for regular people."
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,13 +0,0 @@
|
||||||
---
|
|
||||||
title: "NLnet"
|
|
||||||
# meta title
|
|
||||||
meta_title: "NLnet"
|
|
||||||
# meta description
|
|
||||||
description: "The NLnet organisation"
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,13 +0,0 @@
|
||||||
---
|
|
||||||
title: "NORDUnet"
|
|
||||||
# meta title
|
|
||||||
meta_title: "NORDUnet"
|
|
||||||
# meta description
|
|
||||||
description: "The NORDUnet organisation."
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
NORDUnet is a collaboration of the National Research and Education Networks of the Nordic countries connecting 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.
|
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
title: "Open Internet Discourse Foundation"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Open Internet Discourse Foundation"
|
|
||||||
# meta description
|
|
||||||
description: "The Open Internet Discourse Foundation"
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,11 +0,0 @@
|
||||||
---
|
|
||||||
title: "Tweag"
|
|
||||||
# meta title
|
|
||||||
meta_title: "Tweag"
|
|
||||||
# meta description
|
|
||||||
description: "The Tweag organisation."
|
|
||||||
# save as draft
|
|
||||||
draft: false
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,14 +0,0 @@
|
||||||
---
|
|
||||||
enable: true
|
|
||||||
title: "Ready to build your next project with Hugo?"
|
|
||||||
image: "/images/call-to-action.png"
|
|
||||||
description: "Experience the future of web development with Hugoplate and Hugo. Build lightning-fast static sites with ease and flexibility."
|
|
||||||
button:
|
|
||||||
enable: true
|
|
||||||
label: "Get Started Now"
|
|
||||||
link: "https://github.com/zeon-studio/hugoplate"
|
|
||||||
|
|
||||||
# don't create a separate page
|
|
||||||
_build:
|
|
||||||
render: "never"
|
|
||||||
---
|
|
|
@ -1,31 +0,0 @@
|
||||||
---
|
|
||||||
enable: true
|
|
||||||
title: "What Users Are Saying About Hugoplate"
|
|
||||||
description: "Don't just take our word for it - hear from some of our satisfied users! Check out some of our testimonials below to see what others are saying about Hugoplate."
|
|
||||||
|
|
||||||
# Testimonials
|
|
||||||
testimonials:
|
|
||||||
- name: "Marvin McKinney"
|
|
||||||
designation: "Web Designer"
|
|
||||||
avatar: "/images/avatar-sm.png"
|
|
||||||
content: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui iusto illo molestias, assumenda expedita commodi inventore non itaque molestiae voluptatum dolore, facilis sapiente, repellat veniam."
|
|
||||||
|
|
||||||
- name: "Marvin McKinney"
|
|
||||||
designation: "Web Designer"
|
|
||||||
avatar: "/images/avatar-sm.png"
|
|
||||||
content: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui iusto illo molestias, assumenda expedita commodi inventore non itaque molestiae voluptatum dolore, facilis sapiente, repellat veniam."
|
|
||||||
|
|
||||||
- name: "Marvin McKinney"
|
|
||||||
designation: "Web Designer"
|
|
||||||
avatar: "/images/avatar-sm.png"
|
|
||||||
content: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui iusto illo molestias, assumenda expedita commodi inventore non itaque molestiae voluptatum dolore, facilis sapiente, repellat veniam."
|
|
||||||
|
|
||||||
- name: "Marvin McKinney"
|
|
||||||
designation: "Web Designer"
|
|
||||||
avatar: "/images/avatar-sm.png"
|
|
||||||
content: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui iusto illo molestias, assumenda expedita commodi inventore non itaque molestiae voluptatum dolore, facilis sapiente, repellat veniam."
|
|
||||||
|
|
||||||
# don't create a separate page
|
|
||||||
_build:
|
|
||||||
render: "never"
|
|
||||||
---
|
|
15
website/content/european-commission.nix
Normal file
15
website/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.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
22
website/content/events.nix
Normal file
22
website/content/events.nix
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{ 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}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
24
website/content/events/owc-annual-conference-2024.nix
Normal file
24
website/content/events/owc-annual-conference-2024.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
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?
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
18
website/content/events/publicspaces-conference-2024.nix
Normal file
18
website/content/events/publicspaces-conference-2024.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
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/)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
25
website/content/events/waag-state-internet-2024.nix
Normal file
25
website/content/events/waag-state-internet-2024.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
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
website/content/fediversity.nix
Normal file
19
website/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
website/content/grants.nix
Normal file
19
website/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
website/content/individuals.nix
Normal file
20
website/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.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
32
website/content/navigation.nix
Normal file
32
website/content/navigation.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
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:mail@fediversity.eu";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
24
website/content/news.nix
Normal file
24
website/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}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
23
website/content/news/nordunet-conference.nix
Normal file
23
website/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!
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
19
website/content/news/project-launch.nix
Normal file
19
website/content/news/project-launch.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
{
|
||||||
|
collections.news.entry = { link, ... }: {
|
||||||
|
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
website/content/news/publicspaces-conference-2024.nix
Normal file
19
website/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
website/content/news/tech-session.nix
Normal file
19
website/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
website/content/news/website-launch.nix
Normal file
19
website/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
website/content/partners/nlnet.nix
Normal file
16
website/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
website/content/partners/nordunet.nix
Normal file
15
website/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
website/content/partners/oid.nix
Normal file
21
website/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
website/content/partners/tweag.nix
Normal file
13
website/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.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
# Banner
|
# Banner
|
||||||
banner:
|
banner:
|
||||||
title: "Welcome to the Fediversity Project"
|
title: "Welcome to the Fediversity Project"
|
||||||
content: "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."
|
content: ""
|
||||||
# image: "/images/checkbox-illustration-scaled.png"
|
# image: "/images/checkbox-illustration-scaled.png"
|
||||||
image: "/images/home.svg"
|
image: "/images/home.svg"
|
||||||
button:
|
button:
|
||||||
|
@ -55,7 +55,7 @@ features3:
|
||||||
features:
|
features:
|
||||||
- title: "Fediversity Grants"
|
- title: "Fediversity Grants"
|
||||||
image: "/images/stepping-up.png"
|
image: "/images/stepping-up.png"
|
||||||
content: "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."
|
content: ""
|
||||||
button:
|
button:
|
||||||
enable: true
|
enable: true
|
||||||
label: "Learn more"
|
label: "Learn more"
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"main": [
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "mastodon",
|
|
||||||
"icon": "fab fa-mastodon",
|
|
||||||
"link": "https://mastodon.fediversity.eu/@fediversity"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "rss",
|
|
||||||
"icon": "fab fa-rss",
|
|
||||||
"link": "https://fediversity.eu/rss"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
{
|
|
||||||
"colors": {
|
|
||||||
"default": {
|
|
||||||
"theme_color": {
|
|
||||||
"primary": "#FF6E00",
|
|
||||||
"body": "#fff",
|
|
||||||
"border": "#eaeaea",
|
|
||||||
"theme_light": "#f6f6f6",
|
|
||||||
"theme_dark": ""
|
|
||||||
},
|
|
||||||
"text_color": {
|
|
||||||
"default": "#444444",
|
|
||||||
"dark": "#040404",
|
|
||||||
"light": "#FF6E00"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"darkmode": {
|
|
||||||
"theme_color": {
|
|
||||||
"primary": "#fff",
|
|
||||||
"body": "#1c1c1c",
|
|
||||||
"border": "#3E3E3E",
|
|
||||||
"theme_light": "#222222",
|
|
||||||
"theme_dark": ""
|
|
||||||
},
|
|
||||||
"text_color": {
|
|
||||||
"default": "#B4AFB6",
|
|
||||||
"dark": "#fff",
|
|
||||||
"light": "#B4AFB6"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fonts": {
|
|
||||||
"font_family": {
|
|
||||||
"primary": "Heebo:wght@400;600",
|
|
||||||
"primary_type": "sans-serif",
|
|
||||||
"secondary": "Signika:wght@500;700",
|
|
||||||
"secondary_type": "sans-serif"
|
|
||||||
},
|
|
||||||
"font_size": {
|
|
||||||
"base": "16",
|
|
||||||
"scale": "1.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
48
website/default.nix
Normal file
48
website/default.nix
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
{ 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';
|
||||||
|
# TODO: update when the PR to expose `pkgs.devmode` is merged
|
||||||
|
# https://github.com/NixOS/nixpkgs/pull/354556
|
||||||
|
devmode = pkgs.callPackage "${sources.devmode-reusable}/pkgs/by-name/de/devmode/package.nix" {
|
||||||
|
buildArgs = "${toString ./.} -A build --show-trace";
|
||||||
|
open = "/index.html";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
lib = import ./lib.nix { inherit lib; };
|
||||||
|
result = lib''.evalModules {
|
||||||
|
modules = [
|
||||||
|
./structure
|
||||||
|
./content
|
||||||
|
./presentation
|
||||||
|
{
|
||||||
|
_module.args = {
|
||||||
|
inherit pkgs;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
inherit (result.config) build;
|
||||||
|
|
||||||
|
shell = pkgs.mkShellNoCC {
|
||||||
|
packages = with pkgs; [
|
||||||
|
cmark
|
||||||
|
npins
|
||||||
|
devmode
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,29 +0,0 @@
|
||||||
module hugoplate.netlify.app
|
|
||||||
|
|
||||||
go 1.20
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/gethugothemes/hugo-modules/accordion v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/adsense v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/components/cookie-consent v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/components/custom-script v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/components/preloader v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/components/render-link v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/components/social-share v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/gallery-slider v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/gzip-caching v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/icons/font-awesome v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/images v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/modal v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/pwa v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/search v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/basic-seo v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/google-tag-manager v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/site-verifications v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/shortcodes/button v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/shortcodes/notice v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/tab v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/table-of-contents v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/gethugothemes/hugo-modules/videos v0.0.0-20240215103202-c030d4222242 // indirect
|
|
||||||
github.com/zeon-studio/hugoplate v0.0.0-20240215094431-cf2ee3b68eaf // indirect
|
|
||||||
)
|
|
|
@ -1,46 +0,0 @@
|
||||||
github.com/gethugothemes/hugo-modules/accordion v0.0.0-20240215103202-c030d4222242 h1:gFxGalBg26zJumCS5e//j95FgZlYRpNJ3jIXi4OIl1c=
|
|
||||||
github.com/gethugothemes/hugo-modules/accordion v0.0.0-20240215103202-c030d4222242/go.mod h1:D4DpauKPDcUHI9CVKYmJeO6bkSJIhUN864TyXZ2o0VI=
|
|
||||||
github.com/gethugothemes/hugo-modules/adsense v0.0.0-20240215103202-c030d4222242 h1:H4qw71Pv1RmCio3r/D4N8MXHVks1SBpMcVmZCnz3wlg=
|
|
||||||
github.com/gethugothemes/hugo-modules/adsense v0.0.0-20240215103202-c030d4222242/go.mod h1:8p/gG/cyyu20z4q5cFN/JGE5TOFA55Xsp+aIP9KCsqo=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/cookie-consent v0.0.0-20240215103202-c030d4222242 h1:d4SGLNv5mmwnMAG78t40ce0CSnhQwZJAi2FTmmx9kgg=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/cookie-consent v0.0.0-20240215103202-c030d4222242/go.mod h1:511ERLpGe3ZTfV2z/NAtUSR5NqKF26h9z5lU/zYV4YQ=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/custom-script v0.0.0-20240215103202-c030d4222242 h1:+ShMfcdSHAgg8eFF7ZVvEaWl+/JkLLfpaWgqJZnsm0I=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/custom-script v0.0.0-20240215103202-c030d4222242/go.mod h1:RuDHq4WnK8sNEzAIJr4BZQ7oXhzcct/EKaAxc2Xvi9E=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/preloader v0.0.0-20240215103202-c030d4222242 h1:Wnijrj8VjI2GclhDHsH0zRcYO1Wq/t9u5LtGpDFbc7w=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/preloader v0.0.0-20240215103202-c030d4222242/go.mod h1:FP0iQ3tMOesuWFZhLst2KEvUEYPb5Jk1GW+QBP9lrwg=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/render-link v0.0.0-20240215103202-c030d4222242 h1:1aTJ9rWGFka6yaEDrCR3uouz4BsA5H00S1iQzlTT7Cg=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/render-link v0.0.0-20240215103202-c030d4222242/go.mod h1:z3YcIeEBUonAoRDY1/Jv1ojNVkZ5ud35a0Nn8L4Inx0=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/social-share v0.0.0-20240215103202-c030d4222242 h1:phq6SxYmB8A22LlMUu2p75sI0qrWrizQVbptk0YznSU=
|
|
||||||
github.com/gethugothemes/hugo-modules/components/social-share v0.0.0-20240215103202-c030d4222242/go.mod h1:Gcj4RM/EBECsJMZnPeWjfy/1roRYGqzV9GYNmeHkvFA=
|
|
||||||
github.com/gethugothemes/hugo-modules/gallery-slider v0.0.0-20240215103202-c030d4222242 h1:imsu5wNduLXax4FjofQ7bOBpTtqgyyBcM15s0kNzHzM=
|
|
||||||
github.com/gethugothemes/hugo-modules/gallery-slider v0.0.0-20240215103202-c030d4222242/go.mod h1:MvQ2js/ofZ22CTX5wuvE+dC0rMe6C5HAWL2fEOu/yzE=
|
|
||||||
github.com/gethugothemes/hugo-modules/gzip-caching v0.0.0-20240215103202-c030d4222242 h1:qP8v2MMeqRQ658Vw/o4jsNKq/BUFVLfGkVz0dy8cDEo=
|
|
||||||
github.com/gethugothemes/hugo-modules/gzip-caching v0.0.0-20240215103202-c030d4222242/go.mod h1:0ZMjTZVG4XLZU2/icc8Saqo4mmgMpfRTrUZU2Aa2Pwg=
|
|
||||||
github.com/gethugothemes/hugo-modules/icons/font-awesome v0.0.0-20240215103202-c030d4222242 h1:xZm3fwubmIb3xpkmsrX9zDp7m0lfg5yptQKQT0dxxI0=
|
|
||||||
github.com/gethugothemes/hugo-modules/icons/font-awesome v0.0.0-20240215103202-c030d4222242/go.mod h1:d3gy1vQyfasPmGpau7HpQLrXbOv23PfXclSnjyOBxeU=
|
|
||||||
github.com/gethugothemes/hugo-modules/images v0.0.0-20240215103202-c030d4222242 h1:r1h0s39pTIW0PJVbDzKrePX3RNlHnHiTzldnXuDZeXU=
|
|
||||||
github.com/gethugothemes/hugo-modules/images v0.0.0-20240215103202-c030d4222242/go.mod h1:FKliP3qOW9diIcQeLtyZ0Hdhg3PL8bdAkC/6O+XtU90=
|
|
||||||
github.com/gethugothemes/hugo-modules/modal v0.0.0-20240215103202-c030d4222242 h1:8oP1m06Ko+q7dQichAmywtzMsGuckoG3rW6UVboa7d0=
|
|
||||||
github.com/gethugothemes/hugo-modules/modal v0.0.0-20240215103202-c030d4222242/go.mod h1:Eb9v7oV6biymfvjcBhQdvgn0gUGYhUtfCMeOBLFpFsk=
|
|
||||||
github.com/gethugothemes/hugo-modules/pwa v0.0.0-20240215103202-c030d4222242 h1:82WUFZMkOqSt5wWQ1uxkS7pP648+MfitjJbETOM8Hl0=
|
|
||||||
github.com/gethugothemes/hugo-modules/pwa v0.0.0-20240215103202-c030d4222242/go.mod h1:TRv7iszdfo37O1PbBEE+S8X/enAdpRIxK5DGrp13Qbo=
|
|
||||||
github.com/gethugothemes/hugo-modules/search v0.0.0-20240215103202-c030d4222242 h1:Uj5yTctxnxU3Rqc0hVT4KJ8bRY3rn6bwhSDhhsrWQLQ=
|
|
||||||
github.com/gethugothemes/hugo-modules/search v0.0.0-20240215103202-c030d4222242/go.mod h1:tmDvLaZCM+QDvS/WLZXNjY1QTdWh7/68D2wIToECbyA=
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/basic-seo v0.0.0-20240215103202-c030d4222242 h1:FCUJq2eYZmYVgTWnTno4lnez+0pCRHqBX0EREqiAzjA=
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/basic-seo v0.0.0-20240215103202-c030d4222242/go.mod h1:Q8dPgjamV7pxwKSQyWV21Xwh5CGi23/k+M8HPTphYbs=
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/google-tag-manager v0.0.0-20240215103202-c030d4222242 h1:XFI2k5XL/hIzr+MoRq2VAMQyHd4namMjqZLfOgeLiHI=
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/google-tag-manager v0.0.0-20240215103202-c030d4222242/go.mod h1:cCq50yd55eFTrpqOfeyOK5X0hU5E7qxsqOD7IzTsgLA=
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/site-verifications v0.0.0-20240215103202-c030d4222242 h1:zgttA3KBEABQGqVVMBuEcFO8OszjSwGGnCYFVxboiDo=
|
|
||||||
github.com/gethugothemes/hugo-modules/seo-tools/site-verifications v0.0.0-20240215103202-c030d4222242/go.mod h1:iXielaya126qJscz7Bc2G2WB91moloQOoWru6UoBUyE=
|
|
||||||
github.com/gethugothemes/hugo-modules/shortcodes/button v0.0.0-20240215103202-c030d4222242 h1:ZZPGIQ8uP/yBwelIGhLAx9fqOE18QyItitSTF0WD4B0=
|
|
||||||
github.com/gethugothemes/hugo-modules/shortcodes/button v0.0.0-20240215103202-c030d4222242/go.mod h1:MSvxGvjvcGUKTs6YMATU/9kYFrzW+VSVdy4CCOQLdsY=
|
|
||||||
github.com/gethugothemes/hugo-modules/shortcodes/notice v0.0.0-20240215103202-c030d4222242 h1:X10cLYuM8bT2EGul85TZZZ2/ih8jlax8/gLqynCDQIc=
|
|
||||||
github.com/gethugothemes/hugo-modules/shortcodes/notice v0.0.0-20240215103202-c030d4222242/go.mod h1:ljWyMJx82WA+6SlKjbGFhEdxcriyvUTCjXkJHDa4lho=
|
|
||||||
github.com/gethugothemes/hugo-modules/tab v0.0.0-20240215103202-c030d4222242 h1:gOucOrcZsEL++YUGnrTqFa91o9lRdNEepbnERNSmS3A=
|
|
||||||
github.com/gethugothemes/hugo-modules/tab v0.0.0-20240215103202-c030d4222242/go.mod h1:h3UxlxrFoU19JldxWLPBKaTZFe3AJtABrqo1wfxr+Ng=
|
|
||||||
github.com/gethugothemes/hugo-modules/table-of-contents v0.0.0-20240215103202-c030d4222242 h1:pgmjy/uwvUsAPTDl+gKz7GF3kTi6mcbFQBm4W8asDws=
|
|
||||||
github.com/gethugothemes/hugo-modules/table-of-contents v0.0.0-20240215103202-c030d4222242/go.mod h1:bEDw4veccQQQYEdVrfu13ATRUWfW8ptDIjJZuhYh4Tw=
|
|
||||||
github.com/gethugothemes/hugo-modules/videos v0.0.0-20240215103202-c030d4222242 h1:nLyYQIaJXGnMs8RlfRpmqRVR02T9OVzCEiekh5aU7Qw=
|
|
||||||
github.com/gethugothemes/hugo-modules/videos v0.0.0-20240215103202-c030d4222242/go.mod h1:P722lLWdnNhdZVq6gvMrOLqECUwrAYQWaOWlChta5H0=
|
|
||||||
github.com/zeon-studio/hugoplate v0.0.0-20240215094431-cf2ee3b68eaf h1:WOgVJoGR0gDPORswcdzZRN2zw2Ap4H58Zy5pYLwcmIQ=
|
|
||||||
github.com/zeon-studio/hugoplate v0.0.0-20240215094431-cf2ee3b68eaf/go.mod h1:YlRIwdTWidquf1dhtx+mDfu0I3KVrVQB4wi4UmHlK3E=
|
|
|
@ -1,172 +0,0 @@
|
||||||
######################## default configuration ####################
|
|
||||||
# The base URL of your site (required). This will be prepended to all relative URLs.
|
|
||||||
baseURL = "/"
|
|
||||||
# Title of your website (required).
|
|
||||||
title = "Fediversity"
|
|
||||||
# Your theme name
|
|
||||||
theme = "hugoplate"
|
|
||||||
# Default time zone for time stamps; use any valid tz database name: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
|
|
||||||
timeZone = "Europe/Amsterdam"
|
|
||||||
# post pagination
|
|
||||||
paginate = 5 # see https://gohugo.io/extras/pagination/
|
|
||||||
# post excerpt
|
|
||||||
summaryLength = 10 # see https://gohugo.io/content-management/excerpts/
|
|
||||||
# disable language
|
|
||||||
disableLanguages = [
|
|
||||||
] # example: ["fr"] for disable french language. see https://gohugo.io/content-management/multilingual/
|
|
||||||
hasCJKLanguage = false # If hasCJKLanguage true, auto-detect Chinese/Japanese/Korean Languages in the content. see: https://gohugo.io/getting-started/configuration/#hascjklanguage
|
|
||||||
# default language
|
|
||||||
defaultContentLanguage = 'en'
|
|
||||||
defaultContentLanguageInSubdir = false
|
|
||||||
|
|
||||||
########################### Services #############################
|
|
||||||
[services]
|
|
||||||
[services.googleAnalytics]
|
|
||||||
ID = 'G-MEASUREMENT_ID' # see https://gohugo.io/templates/internal/#configure-google-analytics
|
|
||||||
|
|
||||||
[services.disqus]
|
|
||||||
shortname = 'themefisher-template' # we use disqus to show comments in blog posts . To install disqus please follow this tutorial https://portfolio.peter-baumgartner.net/2017/09/10/how-to-install-disqus-on-hugo/
|
|
||||||
|
|
||||||
########################## Permalinks ############################
|
|
||||||
[permalinks.page]
|
|
||||||
"pages" = "/:slugorfilename/"
|
|
||||||
|
|
||||||
|
|
||||||
############################# Modules ############################
|
|
||||||
[module]
|
|
||||||
[[module.mounts]]
|
|
||||||
source = "assets"
|
|
||||||
target = "assets"
|
|
||||||
|
|
||||||
[[module.mounts]]
|
|
||||||
source = "hugo_stats.json"
|
|
||||||
target = "assets/watching/hugo_stats.json"
|
|
||||||
|
|
||||||
############################# Build ##############################
|
|
||||||
[build]
|
|
||||||
noJSConfigInAssets = false
|
|
||||||
useResourceCacheWhen = 'fallback'
|
|
||||||
[build.buildStats]
|
|
||||||
enable = true
|
|
||||||
[[build.cachebusters]]
|
|
||||||
source = 'assets/watching/hugo_stats\.json'
|
|
||||||
target = 'style\.css'
|
|
||||||
[[build.cachebusters]]
|
|
||||||
source = '(postcss|tailwind)\.config\.js'
|
|
||||||
target = 'css'
|
|
||||||
[[build.cachebusters]]
|
|
||||||
source = 'assets/.*\.(js|ts|jsx|tsx)'
|
|
||||||
target = 'js'
|
|
||||||
[[build.cachebusters]]
|
|
||||||
source = 'assets/.*\.(css|scss|sass)'
|
|
||||||
target = 'css'
|
|
||||||
[[build.cachebusters]]
|
|
||||||
source = 'data/.*\.(.*)$'
|
|
||||||
target = 'css'
|
|
||||||
[[build.cachebusters]]
|
|
||||||
source = 'assets/.*\.(.*)$'
|
|
||||||
target = '$1'
|
|
||||||
|
|
||||||
|
|
||||||
############################# Outputs ############################
|
|
||||||
[outputs]
|
|
||||||
home = ["HTML", "RSS", "WebAppManifest", "SearchIndex"]
|
|
||||||
|
|
||||||
############################# Imaging ############################
|
|
||||||
[imaging]
|
|
||||||
# See https://github.com/disintegration/imaging
|
|
||||||
# Default JPEG or WebP quality setting. Default is 75.
|
|
||||||
quality = 80
|
|
||||||
resampleFilter = "Lanczos"
|
|
||||||
|
|
||||||
############################ Caches ##############################
|
|
||||||
[caches]
|
|
||||||
[caches.images]
|
|
||||||
dir = ":resourceDir/_gen"
|
|
||||||
maxAge = "720h"
|
|
||||||
|
|
||||||
[caches.assets]
|
|
||||||
dir = ":resourceDir/_gen"
|
|
||||||
maxAge = "720h"
|
|
||||||
|
|
||||||
|
|
||||||
############################ Markup ##############################
|
|
||||||
[markup]
|
|
||||||
[markup.goldmark.renderer]
|
|
||||||
unsafe = true
|
|
||||||
|
|
||||||
[markup.highlight]
|
|
||||||
style = 'monokai' # see https://xyproto.github.io/splash/docs/all.html
|
|
||||||
|
|
||||||
[markup.tableOfContents]
|
|
||||||
startLevel = 2
|
|
||||||
endLevel = 5
|
|
||||||
ordered = true
|
|
||||||
|
|
||||||
|
|
||||||
########################### Media types ###########################
|
|
||||||
[mediaTypes]
|
|
||||||
[mediaTypes."application/manifest+json"]
|
|
||||||
suffixes = ["webmanifest"]
|
|
||||||
|
|
||||||
|
|
||||||
########################### Output Format ##########################
|
|
||||||
[outputFormats]
|
|
||||||
[outputFormats.WebAppManifest]
|
|
||||||
mediaType = "application/manifest+json"
|
|
||||||
rel = "manifest"
|
|
||||||
|
|
||||||
[outputFormats.SearchIndex]
|
|
||||||
mediaType = "application/json"
|
|
||||||
baseName = "searchindex"
|
|
||||||
isPlainText = true
|
|
||||||
notAlternative = true
|
|
||||||
|
|
||||||
|
|
||||||
############################# Plugins ##############################
|
|
||||||
|
|
||||||
# CSS Plugins
|
|
||||||
[[params.plugins.css]]
|
|
||||||
link = "plugins/swiper/swiper-bundle.css"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.css]]
|
|
||||||
link = "plugins/glightbox/glightbox.css"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.css]]
|
|
||||||
link = "plugins/font-awesome/v6/brands.css"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.css]]
|
|
||||||
link = "plugins/font-awesome/v6/solid.css"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.css]]
|
|
||||||
link = "plugins/font-awesome/v6/icons.css"
|
|
||||||
lazy = true
|
|
||||||
|
|
||||||
# JS Plugins
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "js/search.js"
|
|
||||||
lazy = false
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "plugins/swiper/swiper-bundle.js"
|
|
||||||
lazy = false
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "plugins/cookie.js"
|
|
||||||
lazy = false
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "plugins/glightbox/glightbox.js"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "js/gallery-slider.js"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "js/accordion.js"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "js/tab.js"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "js/modal.js"
|
|
||||||
lazy = true
|
|
||||||
[[params.plugins.js]]
|
|
||||||
link = "plugins/youtube-lite.js"
|
|
||||||
lazy = true
|
|
|
@ -1,257 +0,0 @@
|
||||||
{
|
|
||||||
"htmlElements": {
|
|
||||||
"tags": [
|
|
||||||
"a",
|
|
||||||
"article",
|
|
||||||
"base",
|
|
||||||
"body",
|
|
||||||
"br",
|
|
||||||
"button",
|
|
||||||
"center",
|
|
||||||
"div",
|
|
||||||
"footer",
|
|
||||||
"form",
|
|
||||||
"h1",
|
|
||||||
"h2",
|
|
||||||
"h4",
|
|
||||||
"h5",
|
|
||||||
"head",
|
|
||||||
"header",
|
|
||||||
"hr",
|
|
||||||
"html",
|
|
||||||
"i",
|
|
||||||
"img",
|
|
||||||
"input",
|
|
||||||
"label",
|
|
||||||
"li",
|
|
||||||
"link",
|
|
||||||
"main",
|
|
||||||
"meta",
|
|
||||||
"nav",
|
|
||||||
"p",
|
|
||||||
"path",
|
|
||||||
"picture",
|
|
||||||
"polygon",
|
|
||||||
"script",
|
|
||||||
"section",
|
|
||||||
"source",
|
|
||||||
"span",
|
|
||||||
"svg",
|
|
||||||
"textarea",
|
|
||||||
"time",
|
|
||||||
"title",
|
|
||||||
"ul"
|
|
||||||
],
|
|
||||||
"classes": [
|
|
||||||
"2xl:bg-pink-200",
|
|
||||||
"2xl:block",
|
|
||||||
"2xl:hidden",
|
|
||||||
"active",
|
|
||||||
"bg-body",
|
|
||||||
"bg-gradient",
|
|
||||||
"bg-gradient-to-b",
|
|
||||||
"bg-gray-200",
|
|
||||||
"bg-theme-light",
|
|
||||||
"block",
|
|
||||||
"border-b",
|
|
||||||
"border-border",
|
|
||||||
"border-t",
|
|
||||||
"btn",
|
|
||||||
"btn-outline-primary",
|
|
||||||
"btn-primary",
|
|
||||||
"btn-sm",
|
|
||||||
"capitalize",
|
|
||||||
"center-layout",
|
|
||||||
"center-wrapper",
|
|
||||||
"col-12",
|
|
||||||
"column",
|
|
||||||
"container",
|
|
||||||
"content",
|
|
||||||
"cursor-pointer",
|
|
||||||
"fa",
|
|
||||||
"fa-arrow-right",
|
|
||||||
"fa-brands",
|
|
||||||
"fa-circle-user",
|
|
||||||
"fa-clock",
|
|
||||||
"fa-folder",
|
|
||||||
"fa-github",
|
|
||||||
"fa-globe",
|
|
||||||
"fa-mastodon",
|
|
||||||
"fa-regular",
|
|
||||||
"fa-rss",
|
|
||||||
"fab",
|
|
||||||
"fill-current",
|
|
||||||
"fixed",
|
|
||||||
"flex",
|
|
||||||
"flex-wrap",
|
|
||||||
"font-bold",
|
|
||||||
"form-input",
|
|
||||||
"form-label",
|
|
||||||
"from-body",
|
|
||||||
"g",
|
|
||||||
"grid-container",
|
|
||||||
"grid-container-small",
|
|
||||||
"grid-item",
|
|
||||||
"group",
|
|
||||||
"gx-5",
|
|
||||||
"h-4",
|
|
||||||
"h-6",
|
|
||||||
"h2",
|
|
||||||
"h3",
|
|
||||||
"header",
|
|
||||||
"header-with-image",
|
|
||||||
"header-with-image2",
|
|
||||||
"hidden",
|
|
||||||
"hr-list",
|
|
||||||
"hr-list2",
|
|
||||||
"img",
|
|
||||||
"inlin-block",
|
|
||||||
"inline-block",
|
|
||||||
"inline-flex",
|
|
||||||
"items-center",
|
|
||||||
"items-start",
|
|
||||||
"justify-between",
|
|
||||||
"justify-center",
|
|
||||||
"left-0",
|
|
||||||
"lg:!max-w-[800px]",
|
|
||||||
"lg:bg-green-200",
|
|
||||||
"lg:block",
|
|
||||||
"lg:col-10",
|
|
||||||
"lg:col-3",
|
|
||||||
"lg:col-4",
|
|
||||||
"lg:col-6",
|
|
||||||
"lg:col-7",
|
|
||||||
"lg:col-8",
|
|
||||||
"lg:flex",
|
|
||||||
"lg:group-hover:opacity-100",
|
|
||||||
"lg:group-hover:visible",
|
|
||||||
"lg:hidden",
|
|
||||||
"lg:inline-block",
|
|
||||||
"lg:mb-0",
|
|
||||||
"lg:ml-0",
|
|
||||||
"lg:mt-0",
|
|
||||||
"lg:order-1",
|
|
||||||
"lg:pb-0",
|
|
||||||
"lg:space-x-2",
|
|
||||||
"lg:text-h1",
|
|
||||||
"lg:text-left",
|
|
||||||
"lg:text-right",
|
|
||||||
"lg:w-1/2",
|
|
||||||
"lg:w-auto",
|
|
||||||
"line",
|
|
||||||
"link",
|
|
||||||
"list",
|
|
||||||
"list-item",
|
|
||||||
"logo-dark",
|
|
||||||
"logo-light",
|
|
||||||
"m-3",
|
|
||||||
"mb-10",
|
|
||||||
"mb-12",
|
|
||||||
"mb-14",
|
|
||||||
"mb-3",
|
|
||||||
"mb-4",
|
|
||||||
"mb-6",
|
|
||||||
"mb-8",
|
|
||||||
"mb:md-0",
|
|
||||||
"md:bg-yellow-200",
|
|
||||||
"md:block",
|
|
||||||
"md:col-10",
|
|
||||||
"md:col-5",
|
|
||||||
"md:col-6",
|
|
||||||
"md:col-7",
|
|
||||||
"md:col-8",
|
|
||||||
"md:col-9",
|
|
||||||
"md:hidden",
|
|
||||||
"md:order-2",
|
|
||||||
"ml-2",
|
|
||||||
"ml-4",
|
|
||||||
"ml-auto",
|
|
||||||
"mr-1",
|
|
||||||
"mr-2",
|
|
||||||
"mr-4",
|
|
||||||
"ms-1",
|
|
||||||
"mt-10",
|
|
||||||
"mt-4",
|
|
||||||
"mt-6",
|
|
||||||
"mt-8",
|
|
||||||
"mx-auto",
|
|
||||||
"nav-dropdown",
|
|
||||||
"nav-dropdown-item",
|
|
||||||
"nav-dropdown-link",
|
|
||||||
"nav-dropdown-list",
|
|
||||||
"nav-item",
|
|
||||||
"nav-link",
|
|
||||||
"navbar",
|
|
||||||
"navbar-brand",
|
|
||||||
"navbar-nav",
|
|
||||||
"order-0",
|
|
||||||
"order-1",
|
|
||||||
"order-3",
|
|
||||||
"p-8",
|
|
||||||
"pb-0",
|
|
||||||
"pb-14",
|
|
||||||
"pb-16",
|
|
||||||
"pb-6",
|
|
||||||
"pl-2",
|
|
||||||
"pr-8",
|
|
||||||
"pt-14",
|
|
||||||
"pt-7",
|
|
||||||
"px-2",
|
|
||||||
"px-4",
|
|
||||||
"px-8",
|
|
||||||
"py-10",
|
|
||||||
"py-14",
|
|
||||||
"py-2",
|
|
||||||
"py-7",
|
|
||||||
"py-[2.5px]",
|
|
||||||
"relative",
|
|
||||||
"rounded",
|
|
||||||
"rounded-2xl",
|
|
||||||
"row",
|
|
||||||
"section",
|
|
||||||
"section-sm",
|
|
||||||
"sm:bg-red-200",
|
|
||||||
"sm:block",
|
|
||||||
"sm:col-10",
|
|
||||||
"sm:hidden",
|
|
||||||
"social-icons",
|
|
||||||
"space-x-1",
|
|
||||||
"sr-only",
|
|
||||||
"sticky",
|
|
||||||
"system",
|
|
||||||
"text-[12px]",
|
|
||||||
"text-[8rem]",
|
|
||||||
"text-black",
|
|
||||||
"text-center",
|
|
||||||
"text-dark",
|
|
||||||
"text-h3",
|
|
||||||
"text-lg",
|
|
||||||
"text-light",
|
|
||||||
"text-primary",
|
|
||||||
"text-red-500",
|
|
||||||
"text-xl",
|
|
||||||
"time",
|
|
||||||
"to-theme-light",
|
|
||||||
"top-0",
|
|
||||||
"uppercase",
|
|
||||||
"w-4",
|
|
||||||
"w-[30px]",
|
|
||||||
"w-full",
|
|
||||||
"xl:bg-blue-200",
|
|
||||||
"xl:block",
|
|
||||||
"xl:hidden",
|
|
||||||
"xl:space-x-8",
|
|
||||||
"z-30",
|
|
||||||
"z-50"
|
|
||||||
],
|
|
||||||
"ids": [
|
|
||||||
"email",
|
|
||||||
"hide-button",
|
|
||||||
"message",
|
|
||||||
"name",
|
|
||||||
"nav-menu",
|
|
||||||
"nav-toggle",
|
|
||||||
"show-button"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
- id: home
|
|
||||||
translation: Home
|
|
||||||
|
|
||||||
- id: read_more
|
|
||||||
translation: Read More
|
|
||||||
|
|
||||||
- id: send
|
|
||||||
translation: Send
|
|
||||||
|
|
||||||
- id: related_posts
|
|
||||||
translation: Related Posts
|
|
||||||
|
|
||||||
- id: categories
|
|
||||||
translation: Categories
|
|
||||||
|
|
||||||
- id: tags
|
|
||||||
translation: Tags
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: Table of Contents
|
|
||||||
|
|
||||||
- id: share
|
|
||||||
translation: Share
|
|
||||||
|
|
||||||
- id: search_input_placeholder
|
|
||||||
translation: Search Post ...
|
|
||||||
|
|
||||||
- id: no_results_for
|
|
||||||
translation: No results for
|
|
||||||
|
|
||||||
- id: empty_search_results_placeholder
|
|
||||||
translation: Type something to search..
|
|
203
website/lib.nix
Normal file
203
website/lib.nix
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
{ lib }:
|
||||||
|
rec {
|
||||||
|
template = g: f: x:
|
||||||
|
let
|
||||||
|
base = f x;
|
||||||
|
result = g base;
|
||||||
|
in
|
||||||
|
result // {
|
||||||
|
override = new:
|
||||||
|
let
|
||||||
|
base' =
|
||||||
|
if lib.isFunction new
|
||||||
|
then lib.recursiveUpdate base (new base' base)
|
||||||
|
else
|
||||||
|
lib.recursiveUpdate base new;
|
||||||
|
result' = g base';
|
||||||
|
in
|
||||||
|
result' // {
|
||||||
|
override = new: (template g (x': base') x).override new;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Recursively replace occurrences of `from` with `to` within `string`
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
replaceStringRec "--" "-" "hello-----world"
|
||||||
|
=> "hello-world"
|
||||||
|
*/
|
||||||
|
replaceStringsRec = from: to: string:
|
||||||
|
let
|
||||||
|
replaced = lib.replaceStrings [ from ] [ to ] string;
|
||||||
|
in
|
||||||
|
if replaced == string then string else replaceStringsRec from to replaced;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create a URL-safe slug from any string
|
||||||
|
*/
|
||||||
|
slug = str:
|
||||||
|
let
|
||||||
|
# Replace non-alphanumeric characters with hyphens
|
||||||
|
replaced = join ""
|
||||||
|
(
|
||||||
|
builtins.map
|
||||||
|
(c:
|
||||||
|
if (c >= "a" && c <= "z") || (c >= "0" && c <= "9")
|
||||||
|
then c
|
||||||
|
else "-"
|
||||||
|
)
|
||||||
|
(with lib; stringToCharacters (toLower str)));
|
||||||
|
|
||||||
|
# Remove leading and trailing hyphens
|
||||||
|
trimHyphens = s:
|
||||||
|
let
|
||||||
|
matched = builtins.match "(-*)([^-].*[^-]|[^-])(-*)" s;
|
||||||
|
in
|
||||||
|
with lib; optionalString (!isNull matched) (builtins.elemAt matched 1);
|
||||||
|
in
|
||||||
|
trimHyphens (replaceStringsRec "--" "-" replaced);
|
||||||
|
|
||||||
|
squash = replaceStringsRec "\n\n" "\n";
|
||||||
|
|
||||||
|
/**
|
||||||
|
Trim trailing spaces and squash non-leading spaces
|
||||||
|
*/
|
||||||
|
trim = string:
|
||||||
|
let
|
||||||
|
trimLine = line:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
# separate leading spaces from the rest
|
||||||
|
parts = split "(^ *)" line;
|
||||||
|
spaces = head (elemAt parts 1);
|
||||||
|
rest = elemAt parts 2;
|
||||||
|
# drop trailing spaces
|
||||||
|
body = head (split " *$" rest);
|
||||||
|
in
|
||||||
|
if body == "" then "" else
|
||||||
|
spaces + replaceStringsRec " " " " body;
|
||||||
|
in
|
||||||
|
join "\n" (map trimLine (splitLines string));
|
||||||
|
|
||||||
|
join = lib.concatStringsSep;
|
||||||
|
|
||||||
|
splitLines = s: with builtins; filter (x: !isList x) (split "\n" s);
|
||||||
|
|
||||||
|
indent = prefix: s:
|
||||||
|
with lib.lists;
|
||||||
|
let
|
||||||
|
lines = splitLines s;
|
||||||
|
in
|
||||||
|
join "\n" (
|
||||||
|
[ (head lines) ]
|
||||||
|
++
|
||||||
|
(map (x: if x == "" then x else "${prefix}${x}") (tail lines))
|
||||||
|
);
|
||||||
|
|
||||||
|
relativePath = path1': path2':
|
||||||
|
let
|
||||||
|
inherit (lib.path) subpath;
|
||||||
|
inherit (lib) lists;
|
||||||
|
|
||||||
|
path1 = subpath.components path1';
|
||||||
|
prefix1 = with lib; take (length path1 - 1) path1;
|
||||||
|
path2 = subpath.components path2';
|
||||||
|
prefix2 = with lib; take (length path1 - 1) path2;
|
||||||
|
|
||||||
|
commonPrefixLength = with lists;
|
||||||
|
findFirstIndex (i: i.fst != i.snd)
|
||||||
|
(length prefix1)
|
||||||
|
(zipLists prefix1 prefix2);
|
||||||
|
|
||||||
|
relativeComponents = with lists;
|
||||||
|
[ "." ] ++ (replicate (length prefix1 - commonPrefixLength) "..") ++ (drop commonPrefixLength path2);
|
||||||
|
in
|
||||||
|
join "/" relativeComponents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Recursively list all Nix files from a directory, except the top-level `default.nix`
|
||||||
|
|
||||||
|
Useful for module system `imports` from a top-level module.
|
||||||
|
**/
|
||||||
|
nixFiles = dir: with lib.fileset;
|
||||||
|
toList (difference
|
||||||
|
(fileFilter ({ hasExt, ... }: hasExt "nix") dir)
|
||||||
|
(dir + "/default.nix")
|
||||||
|
);
|
||||||
|
|
||||||
|
types = rec {
|
||||||
|
# arbitrarily nested attribute set where the leaves are of type `type`
|
||||||
|
# NOTE: this works for anything but attribute sets!
|
||||||
|
recursiveAttrs = type: with lib.types;
|
||||||
|
# NOTE: due to how `either` works, the first match is significant,
|
||||||
|
# so if `type` happens to be an attrset, the typecheck will consider
|
||||||
|
# `type`, not `attrsOf`
|
||||||
|
attrsOf (either type (recursiveAttrs type));
|
||||||
|
|
||||||
|
# collection of unnamed items that can be added to item-wise, i.e. without wrapping the item in a list
|
||||||
|
collection = elemType:
|
||||||
|
let
|
||||||
|
unparenthesize = class: class == "noun";
|
||||||
|
desc = type:
|
||||||
|
types.optionDescriptionPhrase unparenthesize type;
|
||||||
|
desc' = type:
|
||||||
|
let
|
||||||
|
typeDesc = lib.types.optionDescriptionPhrase unparenthesize type;
|
||||||
|
in
|
||||||
|
if type.descriptionClass == "noun"
|
||||||
|
then
|
||||||
|
typeDesc + "s"
|
||||||
|
else
|
||||||
|
"many instances of ${typeDesc}";
|
||||||
|
in
|
||||||
|
lib.types.mkOptionType {
|
||||||
|
name = "collection";
|
||||||
|
description = "separately specified ${desc elemType} for a collection of ${desc' elemType}";
|
||||||
|
merge = loc: defs:
|
||||||
|
map
|
||||||
|
(def:
|
||||||
|
elemType.merge (loc ++ [ "[definition ${toString def.file}]" ]) [{ inherit (def) file; value = def.value; }]
|
||||||
|
)
|
||||||
|
defs;
|
||||||
|
check = elemType.check;
|
||||||
|
getSubOptions = elemType.getSubOptions;
|
||||||
|
getSubModules = elemType.getSubModules;
|
||||||
|
substSubModules = m: collection (elemType.substSubModules m);
|
||||||
|
functor = (lib.defaultFunctor "collection") // {
|
||||||
|
type = collection;
|
||||||
|
wrapped = elemType;
|
||||||
|
payload = { };
|
||||||
|
};
|
||||||
|
nestedTypes.elemType = elemType;
|
||||||
|
};
|
||||||
|
|
||||||
|
listOfUnique = elemType:
|
||||||
|
let
|
||||||
|
baseType = lib.types.listOf elemType;
|
||||||
|
in
|
||||||
|
baseType // {
|
||||||
|
merge = loc: defs:
|
||||||
|
let
|
||||||
|
# Keep track of which definition each value came from
|
||||||
|
defsWithValues = map
|
||||||
|
(def:
|
||||||
|
map (v: { inherit (def) file; value = v; }) def.value
|
||||||
|
)
|
||||||
|
defs;
|
||||||
|
flatDefs = lib.flatten defsWithValues;
|
||||||
|
|
||||||
|
# Check for duplicates while preserving source info
|
||||||
|
seen = builtins.foldl'
|
||||||
|
(acc: def:
|
||||||
|
if lib.lists.any (v: v.value == def.value) acc
|
||||||
|
then throw "The option `${lib.options.showOption loc}` has duplicate values (${toString def.value}) defined in ${def.file}"
|
||||||
|
else acc ++ [ def ]
|
||||||
|
) [ ]
|
||||||
|
flatDefs;
|
||||||
|
in
|
||||||
|
map (def: def.value) seen;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,7 +0,0 @@
|
||||||
[build]
|
|
||||||
publish = "public"
|
|
||||||
command = "yarn project-setup; yarn build"
|
|
||||||
|
|
||||||
[build.environment]
|
|
||||||
HUGO_VERSION = "0.121.2"
|
|
||||||
GO_VERSION = "1.20.5"
|
|
80
website/npins/default.nix
Normal file
80
website/npins/default.nix
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
# Generated by npins. Do not modify; will be overwritten regularly
|
||||||
|
let
|
||||||
|
data = builtins.fromJSON (builtins.readFile ./sources.json);
|
||||||
|
version = data.version;
|
||||||
|
|
||||||
|
mkSource =
|
||||||
|
spec:
|
||||||
|
assert spec ? type;
|
||||||
|
let
|
||||||
|
path =
|
||||||
|
if spec.type == "Git" then
|
||||||
|
mkGitSource spec
|
||||||
|
else if spec.type == "GitRelease" then
|
||||||
|
mkGitSource spec
|
||||||
|
else if spec.type == "PyPi" then
|
||||||
|
mkPyPiSource spec
|
||||||
|
else if spec.type == "Channel" then
|
||||||
|
mkChannelSource spec
|
||||||
|
else
|
||||||
|
builtins.throw "Unknown source type ${spec.type}";
|
||||||
|
in
|
||||||
|
spec // { outPath = path; };
|
||||||
|
|
||||||
|
mkGitSource =
|
||||||
|
{
|
||||||
|
repository,
|
||||||
|
revision,
|
||||||
|
url ? null,
|
||||||
|
hash,
|
||||||
|
branch ? null,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
assert repository ? type;
|
||||||
|
# At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository
|
||||||
|
# In the latter case, there we will always be an url to the tarball
|
||||||
|
if url != null then
|
||||||
|
(builtins.fetchTarball {
|
||||||
|
inherit url;
|
||||||
|
sha256 = hash; # FIXME: check nix version & use SRI hashes
|
||||||
|
})
|
||||||
|
else
|
||||||
|
assert repository.type == "Git";
|
||||||
|
let
|
||||||
|
urlToName =
|
||||||
|
url: rev:
|
||||||
|
let
|
||||||
|
matched = builtins.match "^.*/([^/]*)(\\.git)?$" repository.url;
|
||||||
|
|
||||||
|
short = builtins.substring 0 7 rev;
|
||||||
|
|
||||||
|
appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else "";
|
||||||
|
in
|
||||||
|
"${if matched == null then "source" else builtins.head matched}${appendShort}";
|
||||||
|
name = urlToName repository.url revision;
|
||||||
|
in
|
||||||
|
builtins.fetchGit {
|
||||||
|
url = repository.url;
|
||||||
|
rev = revision;
|
||||||
|
inherit name;
|
||||||
|
# hash = hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkPyPiSource =
|
||||||
|
{ url, hash, ... }:
|
||||||
|
builtins.fetchurl {
|
||||||
|
inherit url;
|
||||||
|
sha256 = hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkChannelSource =
|
||||||
|
{ url, hash, ... }:
|
||||||
|
builtins.fetchTarball {
|
||||||
|
inherit url;
|
||||||
|
sha256 = hash;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
if version == 3 then
|
||||||
|
builtins.mapAttrs (_: mkSource) data.pins
|
||||||
|
else
|
||||||
|
throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
|
23
website/npins/sources.json
Normal file
23
website/npins/sources.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"pins": {
|
||||||
|
"devmode-reusable": {
|
||||||
|
"type": "Git",
|
||||||
|
"repository": {
|
||||||
|
"type": "GitHub",
|
||||||
|
"owner": "fricklerhandwerk",
|
||||||
|
"repo": "nixpkgs"
|
||||||
|
},
|
||||||
|
"branch": "refactor-devmode",
|
||||||
|
"revision": "f0746a6690939987734d6519a2e3daf28ed36d87",
|
||||||
|
"url": "https://github.com/fricklerhandwerk/nixpkgs/archive/f0746a6690939987734d6519a2e3daf28ed36d87.tar.gz",
|
||||||
|
"hash": "011kg3c2mfy7y808llpmq3hf6vv6rlazx8m11w41pnym4kwr3ivz"
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"type": "Channel",
|
||||||
|
"name": "nixpkgs-unstable",
|
||||||
|
"url": "https://releases.nixos.org/nixpkgs/nixpkgs-24.11pre691017.b69de56fac8c/nixexprs.tar.xz",
|
||||||
|
"hash": "0z32pj0lh5ng2a6cn0qfmka8cynnygckn5615mkaxq2aplkvgzx3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": 3
|
||||||
|
}
|
2209
website/package-lock.json
generated
2209
website/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,34 +0,0 @@
|
||||||
{
|
|
||||||
"name": "hugoplate",
|
|
||||||
"description": "hugo tailwindcss boilerplate",
|
|
||||||
"version": "1.13.1",
|
|
||||||
"license": "MIT",
|
|
||||||
"author": "zeon.studio",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "hugo server",
|
|
||||||
"build": "hugo --gc --minify --templateMetrics --templateMetricsHints --forceSyncStatic",
|
|
||||||
"preview": "hugo server --disableFastRender --navigateToChanged --templateMetrics --templateMetricsHints --watch --forceSyncStatic -e production --minify",
|
|
||||||
"dev:example": "cd exampleSite; hugo server",
|
|
||||||
"build:example": "cd exampleSite; hugo --gc --minify --templateMetrics --templateMetricsHints --forceSyncStatic",
|
|
||||||
"preview:example": "cd exampleSite; hugo server --disableFastRender --navigateToChanged --templateMetrics --templateMetricsHints --watch --forceSyncStatic -e production --minify",
|
|
||||||
"update-modules": "node ./scripts/clearModules.js && hugo mod clean --all && hugo mod get -u ./... && hugo mod tidy",
|
|
||||||
"remove-darkmode": "node ./scripts/removeDarkmode.js && yarn format",
|
|
||||||
"project-setup": "node ./scripts/projectSetup.js",
|
|
||||||
"theme-setup": "node ./scripts/themeSetup.js",
|
|
||||||
"update-theme": "node ./scripts/themeUpdate.js",
|
|
||||||
"format": "prettier -w ."
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@fullhuman/postcss-purgecss": "^5.0.0",
|
|
||||||
"@tailwindcss/forms": "^0.5.7",
|
|
||||||
"@tailwindcss/typography": "^0.5.10",
|
|
||||||
"autoprefixer": "^10.4.18",
|
|
||||||
"postcss": "^8.4.36",
|
|
||||||
"postcss-cli": "^11.0.0",
|
|
||||||
"prettier": "^3.2.5",
|
|
||||||
"prettier-plugin-go-template": "0.0.15",
|
|
||||||
"prettier-plugin-tailwindcss": "^0.5.12",
|
|
||||||
"tailwind-bootstrap-grid": "^5.1.0",
|
|
||||||
"tailwindcss": "^3.4.1"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
const purgecss = {
|
|
||||||
content: ["./hugo_stats.json"],
|
|
||||||
defaultExtractor: (content) => {
|
|
||||||
const elements = JSON.parse(content).htmlElements;
|
|
||||||
return [
|
|
||||||
...(elements.tags || []),
|
|
||||||
...(elements.classes || []),
|
|
||||||
...(elements.ids || []),
|
|
||||||
];
|
|
||||||
},
|
|
||||||
safelist: [
|
|
||||||
/^swiper-/,
|
|
||||||
/^lb-/,
|
|
||||||
/^gl/,
|
|
||||||
/^go/,
|
|
||||||
/^gc/,
|
|
||||||
/^gs/,
|
|
||||||
/^gi/,
|
|
||||||
/^gz/,
|
|
||||||
/^gprev/,
|
|
||||||
/^gnext/,
|
|
||||||
/^desc/,
|
|
||||||
/^zoom/,
|
|
||||||
/^search/,
|
|
||||||
/^:is/,
|
|
||||||
/dark/,
|
|
||||||
/show/,
|
|
||||||
/dragging/,
|
|
||||||
/fullscreen/,
|
|
||||||
/loaded/,
|
|
||||||
/visible/,
|
|
||||||
/current/,
|
|
||||||
/active/,
|
|
||||||
/mark/,
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
plugins: {
|
|
||||||
tailwindcss: {},
|
|
||||||
"@fullhuman/postcss-purgecss":
|
|
||||||
process.env.HUGO_ENVIRONMENT === "production" ? purgecss : false,
|
|
||||||
autoprefixer: process.env.HUGO_ENVIRONMENT === "production" ? {} : false,
|
|
||||||
},
|
|
||||||
};
|
|
90
website/presentation/default.nix
Normal file
90
website/presentation/default.nix
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
{ config, options, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
mkOption
|
||||||
|
types
|
||||||
|
;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = lib.nixFiles ./.;
|
||||||
|
|
||||||
|
options.templates =
|
||||||
|
mkOption {
|
||||||
|
description = ''
|
||||||
|
Collection of named helper functions for conversion different structured representations which can be rendered to a string
|
||||||
|
'';
|
||||||
|
type = with types; recursiveAttrs (functionTo (either str attrs));
|
||||||
|
};
|
||||||
|
|
||||||
|
options.files = mkOption {
|
||||||
|
description = ''
|
||||||
|
Files that make up the site, mapping from output path to contents
|
||||||
|
|
||||||
|
Add more files to the output by assigning to this attribute set.
|
||||||
|
'';
|
||||||
|
type = with types; attrsOf path;
|
||||||
|
};
|
||||||
|
|
||||||
|
options.build = mkOption {
|
||||||
|
description = ''
|
||||||
|
The final output of the web site
|
||||||
|
'';
|
||||||
|
type = types.package;
|
||||||
|
default =
|
||||||
|
let
|
||||||
|
script = ''
|
||||||
|
mkdir $out
|
||||||
|
'' + lib.join "\n" copy;
|
||||||
|
copy = lib.mapAttrsToList
|
||||||
|
(
|
||||||
|
path: file: ''
|
||||||
|
mkdir -p $out/$(dirname ${path})
|
||||||
|
cp -r ${file} $out/${path}
|
||||||
|
''
|
||||||
|
)
|
||||||
|
config.files;
|
||||||
|
in
|
||||||
|
pkgs.runCommand "source" { } script;
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: this is an artefact of exploration; needs to be adapted to actual use
|
||||||
|
config.templates.table-of-contents = { config, ... }:
|
||||||
|
let
|
||||||
|
outline = { ... }: {
|
||||||
|
options = {
|
||||||
|
value = mkOption {
|
||||||
|
# null denotes root
|
||||||
|
type = with types; nullOr (either str (listOf (attrTag categories.phrasing)));
|
||||||
|
subsections = mkOption {
|
||||||
|
type = with types; listOf (submodule outline);
|
||||||
|
default = with lib; map
|
||||||
|
# TODO: go into depth manually here,
|
||||||
|
# we don't want to pollute the DOM implementation
|
||||||
|
(c: (lib.head (attrValues c)).outline)
|
||||||
|
(filter (c: isAttrs c && (lib.head (attrValues c)) ? outline) config.content);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
__toString = mkOption {
|
||||||
|
type = with types; functionTo str;
|
||||||
|
# TODO: convert to HTML
|
||||||
|
default = self: lib.squash ''
|
||||||
|
${if isNull self.value then "root" else self.value}
|
||||||
|
${if self.subsections != [] then
|
||||||
|
" " + lib.indent " " (lib.join "\n" self.subsections) else ""}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.outline = mkOption {
|
||||||
|
type = types.submodule outline;
|
||||||
|
default = {
|
||||||
|
value = null;
|
||||||
|
subsections = with lib;
|
||||||
|
map (c: (lib.head (attrValues c)).outline)
|
||||||
|
(filter (c: isAttrs c && (lib.head (attrValues c)) ? outline) config.content);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
719
website/presentation/dom.nix
Normal file
719
website/presentation/dom.nix
Normal file
|
@ -0,0 +1,719 @@
|
||||||
|
/**
|
||||||
|
A strongly typed module system implementation of the Document Object Model (DOM)
|
||||||
|
|
||||||
|
Based on the WHATWG's HTML Living Standard https://html.spec.whatwg.org (CC-BY 4.0)
|
||||||
|
Inspired by https://github.com/knupfer/type-of-html by @knupfer (BSD-3-Clause)
|
||||||
|
Similar work from the OCaml ecosystem: https://github.com/ocsigen/tyxml
|
||||||
|
*/
|
||||||
|
{ config, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config;
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
inherit (types) submodule;
|
||||||
|
|
||||||
|
# https://html.spec.whatwg.org/multipage/dom.html#content-models
|
||||||
|
# https://html.spec.whatwg.org/multipage/dom.html#kinds-of-content
|
||||||
|
content-categories = [
|
||||||
|
"none" # https://html.spec.whatwg.org/multipage/dom.html#the-nothing-content-model
|
||||||
|
"text" # https://html.spec.whatwg.org/multipage/dom.html#text-content
|
||||||
|
"metadata" # https://html.spec.whatwg.org/multipage/dom.html#metadata-content
|
||||||
|
"flow" # https://html.spec.whatwg.org/multipage/dom.html#flow-content
|
||||||
|
"sectioning" # https://html.spec.whatwg.org/multipage/dom.html#sectioning-content
|
||||||
|
"heading" # https://html.spec.whatwg.org/multipage/dom.html#heading-content
|
||||||
|
"phrasing" # https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
|
||||||
|
"embedded" # https://html.spec.whatwg.org/multipage/dom.html#embedded-content-2
|
||||||
|
"interactive" # https://html.spec.whatwg.org/multipage/dom.html#interactive-content
|
||||||
|
"palpable" # https://html.spec.whatwg.org/multipage/dom.html#palpable-content
|
||||||
|
"scripting" # https://html.spec.whatwg.org/multipage/dom.html#script-supporting-elements
|
||||||
|
];
|
||||||
|
|
||||||
|
# base type for all DOM elements
|
||||||
|
element = { ... }: {
|
||||||
|
# TODO: add fields for upstream documentation references
|
||||||
|
# TODO: programmatically generate documentation
|
||||||
|
options = with lib; {
|
||||||
|
categories = mkOption {
|
||||||
|
type = types.listOfUnique (types.enum content-categories);
|
||||||
|
};
|
||||||
|
__toString = mkOption {
|
||||||
|
internal = true;
|
||||||
|
type = with types; functionTo str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# options with types for all the defined DOM elements
|
||||||
|
element-types = lib.mapAttrs
|
||||||
|
(name: value: mkOption { type = submodule value; })
|
||||||
|
elements;
|
||||||
|
|
||||||
|
# attrset of categories, where values are module options with the type of the
|
||||||
|
# elements that belong to these categories
|
||||||
|
categories = with lib;
|
||||||
|
genAttrs
|
||||||
|
content-categories
|
||||||
|
(category:
|
||||||
|
(mapAttrs (_: e: mkOption { type = submodule e; })
|
||||||
|
# HACK: don't evaluate the submodule types, just grab the config directly
|
||||||
|
# TODO: we may want to do this properly and loop `categories` through the top-level `config`
|
||||||
|
(filterAttrs (_: e: elem category (e { name = "dummy"; config = { }; }).config.categories) elements))
|
||||||
|
);
|
||||||
|
|
||||||
|
global-attrs = lib.mapAttrs (name: value: mkOption value) {
|
||||||
|
class = {
|
||||||
|
type = with types; listOf nonEmptyStr;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
hidden = {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
id = {
|
||||||
|
# TODO: would be cool if we could enforce unique IDs per document
|
||||||
|
type = with types; nullOr nonEmptyStr;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
lang = {
|
||||||
|
# TODO: https://www.rfc-editor.org/rfc/rfc5646.html
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
style = {
|
||||||
|
# TODO: CSS type ;..)
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
title = {
|
||||||
|
type = with types; nullOr lines;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
# TODO: more global attributes
|
||||||
|
# https://html.spec.whatwg.org/#global-attributes
|
||||||
|
# https://html.spec.whatwg.org/#attr-aria-*
|
||||||
|
# https://html.spec.whatwg.org/multipage/microdata.html#encoding-microdata
|
||||||
|
};
|
||||||
|
|
||||||
|
# all possible attributes to `<link>` elements.
|
||||||
|
# since not all of them apply to each `rel=` type, the separate implementations can pick from this collection
|
||||||
|
link-attrs = lib.mapAttrs (name: value: mkOption value) {
|
||||||
|
href = {
|
||||||
|
# TODO: implement https://html.spec.whatwg.org/multipage/semantics.html#the-link-element:attr-link-href-3
|
||||||
|
# TODO: https://url.spec.whatwg.org/#valid-url-string
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
};
|
||||||
|
media = {
|
||||||
|
# TODO: https://drafts.csswg.org/mediaqueries/#media
|
||||||
|
# it's awsome we have that standard, but ugh so much work
|
||||||
|
# ;..S
|
||||||
|
# Clay seems to do it right: https://github.com/sebastiaanvisser/clay
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
integrity = {
|
||||||
|
# TODO: implement https://w3c.github.io/webappsec-subresource-integrity/
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
# TODO: more attributes
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#the-link-element:concept-element-attributes
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: not sure where to put these, since so far they apply to multiple elements,
|
||||||
|
# but have the same properties for all of them
|
||||||
|
attrs = lib.mapAttrs (name: value: mkOption value) {
|
||||||
|
# TODO: investigate: `href` may be coupled with other attributes such as `target` or `hreflang`, this could simplify things
|
||||||
|
href = {
|
||||||
|
# TODO: https://url.spec.whatwg.org/#valid-url-string
|
||||||
|
# ;..O
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
target = {
|
||||||
|
# https://html.spec.whatwg.org/multipage/document-sequences.html#valid-navigable-target-name-or-keyword
|
||||||
|
type =
|
||||||
|
let
|
||||||
|
is-valid-target = s:
|
||||||
|
let
|
||||||
|
inherit (lib) match;
|
||||||
|
has-lt = s: match ".*<.*" s != null;
|
||||||
|
has-tab-or-newline = s: match ".*[\t\n].*" s != null;
|
||||||
|
has-valid-start = s: match "^[^_].*$" s != null;
|
||||||
|
in
|
||||||
|
has-valid-start s && !(has-lt s && has-tab-or-newline s);
|
||||||
|
in
|
||||||
|
with types; either
|
||||||
|
(enum [ "_blank" "_self" "_parent" "_top" ])
|
||||||
|
(types.addCheck str is-valid-target)
|
||||||
|
;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mkAttrs = attrs: with lib;
|
||||||
|
mkOption {
|
||||||
|
type = submodule {
|
||||||
|
options = global-attrs // attrs;
|
||||||
|
};
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
print-attrs = with lib; attrs:
|
||||||
|
# TODO: figure out how let attributes know how to print themselves without polluting the interface
|
||||||
|
let
|
||||||
|
result = trim (join " "
|
||||||
|
(mapAttrsToList
|
||||||
|
# TODO: this needs to be smarter for boolean attributes
|
||||||
|
# where the value must be written out explicitly.
|
||||||
|
# probably the attribute itself should have its own `__toString`.
|
||||||
|
(name: value:
|
||||||
|
if isBool value then
|
||||||
|
if value then name else ""
|
||||||
|
# TODO: some attributes must be explicitly empty
|
||||||
|
else optionalString (toString value != "") ''${name}="${toString value}"''
|
||||||
|
)
|
||||||
|
attrs)
|
||||||
|
);
|
||||||
|
in
|
||||||
|
if attrs == null then throw "wat" else
|
||||||
|
optionalString (stringLength result > 0) " " + result
|
||||||
|
;
|
||||||
|
|
||||||
|
print-element = name: attrs: content:
|
||||||
|
with lib;
|
||||||
|
# TODO: be smarter about content to save some space and repetition at the call sites
|
||||||
|
squash (trim ''
|
||||||
|
<${name}${print-attrs attrs}>
|
||||||
|
${lib.indent " " content}
|
||||||
|
</${name}>
|
||||||
|
'');
|
||||||
|
|
||||||
|
print-element' = name: attrs: "<${name}${print-attrs attrs}>";
|
||||||
|
|
||||||
|
toString-unwrap = e:
|
||||||
|
with lib;
|
||||||
|
if isAttrs e
|
||||||
|
then toString (head (attrValues e))
|
||||||
|
else if isList e
|
||||||
|
then toString (map toString-unwrap e)
|
||||||
|
else e;
|
||||||
|
|
||||||
|
elements = rec {
|
||||||
|
document = { ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
inherit (element-types) html;
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
};
|
||||||
|
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self: ''
|
||||||
|
<!DOCTYPE HTML >
|
||||||
|
${self.html}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
html = { name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
inherit (element-types) head body;
|
||||||
|
};
|
||||||
|
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self: print-element name self.attrs ''
|
||||||
|
${self.head}
|
||||||
|
${self.body}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
head = { name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = with lib; {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#the-head-element:concept-element-content-model
|
||||||
|
# XXX: this doesn't implement the iframe srcdoc semantics
|
||||||
|
# as those have questionable value and would complicate things a bit.
|
||||||
|
# it should be possible though, by passing a flag via module arguments.
|
||||||
|
inherit (element-types) title;
|
||||||
|
base = mkOption {
|
||||||
|
type = with types; nullOr (submodule base);
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-charset
|
||||||
|
meta.charset = mkOption {
|
||||||
|
# TODO: create programmatically from https://encoding.spec.whatwg.org/encodings.json
|
||||||
|
type = types.enum [
|
||||||
|
"utf-8"
|
||||||
|
];
|
||||||
|
default = "utf-8";
|
||||||
|
};
|
||||||
|
# https://developer.mozilla.org/en-US/docs/Web/HTML/Viewport_meta_tag#viewport_width_and_screen_width
|
||||||
|
# this should not exist and no one should ever have to think about it
|
||||||
|
meta.viewport = mkOption {
|
||||||
|
type = submodule ({ ... }: {
|
||||||
|
# TODO: figure out how to render only non-default values
|
||||||
|
options = {
|
||||||
|
width = mkOption {
|
||||||
|
type = with types; either
|
||||||
|
(ints.between 1 10000)
|
||||||
|
(enum [ "device-width" ]);
|
||||||
|
default = "device-width"; # not default by standard
|
||||||
|
};
|
||||||
|
height = mkOption {
|
||||||
|
type = with types; either
|
||||||
|
(ints.between 1 10000)
|
||||||
|
(enum [ "device-height" ]);
|
||||||
|
default = "device-height"; # not default by standard (but seems to work if you don't set it)
|
||||||
|
};
|
||||||
|
initial-scale = mkOption {
|
||||||
|
type = types.numbers.between 0.1 10;
|
||||||
|
default = 1;
|
||||||
|
};
|
||||||
|
minimum-scale = mkOption {
|
||||||
|
type = types.numbers.between 0.1 10;
|
||||||
|
# TODO: render only as many digits as needed
|
||||||
|
default = 0.1;
|
||||||
|
};
|
||||||
|
maximum-scale = mkOption {
|
||||||
|
type = types.numbers.between 0.1 10;
|
||||||
|
default = 10;
|
||||||
|
};
|
||||||
|
user-scalable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
interactive-widget = mkOption {
|
||||||
|
type = types.enum [
|
||||||
|
"resizes-visual"
|
||||||
|
"resizes-content"
|
||||||
|
"overlays-content"
|
||||||
|
];
|
||||||
|
default = "resizes-visual";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.authors = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
meta.description = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
# TODO: this one has more internal structure, e.g with hreflang
|
||||||
|
# TODO: print in output
|
||||||
|
link.canonical = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
link.stylesheets = mkOption {
|
||||||
|
type = types.listOf (submodule stylesheet);
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: figure out `meta` elements
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#the-meta-element:concept-element-attributes
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#other-metadata-names
|
||||||
|
};
|
||||||
|
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self:
|
||||||
|
with lib;
|
||||||
|
print-element name self.attrs ''
|
||||||
|
${self.title}
|
||||||
|
${with lib; optionalString (!isNull self.base) self.base}
|
||||||
|
<meta charset="${self.meta.charset}" />
|
||||||
|
|
||||||
|
${/* https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-x-ua-compatible */
|
||||||
|
""}<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<!--
|
||||||
|
TODO: make proper icon and preload types
|
||||||
|
-->
|
||||||
|
<link rel="icon" type="image/png" href="/favicon.png">
|
||||||
|
<link rel="preload" as="image" type="image/svg" href="/ngi-fediversity.svg">
|
||||||
|
<link rel="preload" as="style" type="text/css" href="/style.css">
|
||||||
|
|
||||||
|
${print-element' "meta" {
|
||||||
|
name = "viewport";
|
||||||
|
content = "${join ", " (mapAttrsToList (name: value: "${name}=${toString value}") self.meta.viewport) }";
|
||||||
|
}}
|
||||||
|
|
||||||
|
${join "\n" (map
|
||||||
|
(author: print-element' "meta" {
|
||||||
|
name = "author";
|
||||||
|
content = "${author}";
|
||||||
|
})
|
||||||
|
self.meta.authors)
|
||||||
|
}
|
||||||
|
|
||||||
|
${join "\n" (map
|
||||||
|
(stylesheet: print-element' "link" ({ rel = "stylesheet"; } // (removeAttrs stylesheet [ "categories" "__toString" ])))
|
||||||
|
self.link.stylesheets)
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
title = { name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options.attrs = mkAttrs { };
|
||||||
|
options.text = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
config.categories = [ "metadata" ];
|
||||||
|
config.__toString = self: "<${name}${print-attrs self.attrs}>${self.text}</${name}>";
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
base = { name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
# TODO: "A base element must have either an href attribute, a target attribute, or both."
|
||||||
|
options = global-attrs // { inherit (attrs) href target; };
|
||||||
|
config.categories = [ "metadata" ];
|
||||||
|
config.__toString = self: "<base${print-attrs self}>";
|
||||||
|
};
|
||||||
|
|
||||||
|
link = { name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = global-attrs // {
|
||||||
|
# TODO: more attributes
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#the-link-element:concept-element-attributes
|
||||||
|
inherit (attrs) href;
|
||||||
|
# XXX: there are variants of `rel` for `link`, `a`/`area`, and `form`
|
||||||
|
rel = mkOption {
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#attr-link-rel
|
||||||
|
type = with types; listOfUnique str (enum
|
||||||
|
# TODO: work out link types in detail, there are lots of additional constraints
|
||||||
|
# https://html.spec.whatwg.org/multipage/links.html#linkTypes
|
||||||
|
[
|
||||||
|
"alternate"
|
||||||
|
"dns-prefetch"
|
||||||
|
"expect"
|
||||||
|
"help"
|
||||||
|
"icon"
|
||||||
|
"license"
|
||||||
|
"manifest"
|
||||||
|
"modulepreload"
|
||||||
|
"next"
|
||||||
|
"pingback"
|
||||||
|
"preconnect"
|
||||||
|
"prefetch"
|
||||||
|
"preload"
|
||||||
|
"prev"
|
||||||
|
"privacy-policy"
|
||||||
|
"search"
|
||||||
|
"terms-of-service"
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# TODO: figure out how to make body-ok `link` elements
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#allowed-in-the-body
|
||||||
|
config.categories = [ "metadata" ];
|
||||||
|
config.__toString = self: "<link${print-attrs self}>";
|
||||||
|
};
|
||||||
|
|
||||||
|
# <link rel="stylesheet"> is implemented separately because it can be used both in `<head>` and `<body>`
|
||||||
|
# semantically it's a standalone thing but syntactically happens to be subsumed under `<link>`
|
||||||
|
stylesheet = { config, name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = global-attrs // {
|
||||||
|
type = mkOption {
|
||||||
|
# TODO: this must be a valid MIME type string, which is a bit involved.
|
||||||
|
# the syntax is explicated here: https://mimesniff.spec.whatwg.org/#mime-type-writing
|
||||||
|
# but the spec refers to RFC9110: https://www.rfc-editor.org/rfc/rfc9110#name-media-type
|
||||||
|
# all registered MIME types: https://www.iana.org/assignments/top-level-media-types/top-level-media-types.xhtml
|
||||||
|
# XXX: if nothing is specified, "text/css" is assumed.
|
||||||
|
# https://html.spec.whatwg.org/multipage/links.html#link-type-stylesheet:link-type-stylesheet-2
|
||||||
|
# there's no specification on what else could be there, and it's questionable whether setting anything else even makes sense.
|
||||||
|
# in practice, browsers seem to ignore anything but "text/css", so we may as well not care at all.
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
# https://html.spec.whatwg.org/multipage/semantics.html#attr-link-disabled
|
||||||
|
disabled = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
# TODO: implement the rest of the stylesheet attributes
|
||||||
|
# https://html.spec.whatwg.org/#link-type-stylesheet
|
||||||
|
inherit (link-attrs) href media integrity;
|
||||||
|
};
|
||||||
|
# https://html.spec.whatwg.org/multipage/links.html#link-type-stylesheet:body-ok
|
||||||
|
config.categories = [ "metadata" "phrasing" ];
|
||||||
|
config.__toString = self: print-attrs (removeAttrs self [ "categories" "__toString" ]);
|
||||||
|
};
|
||||||
|
|
||||||
|
body = { config, name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
content = mkOption {
|
||||||
|
type = with types;
|
||||||
|
let
|
||||||
|
# Type check that ensures spec-compliant section hierarchy
|
||||||
|
# https://html.spec.whatwg.org/multipage/sections.html#headings-and-outlines-2:concept-heading-7
|
||||||
|
with-section-constraints = baseType: baseType // {
|
||||||
|
merge = loc: defs:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
find-and-attach = def:
|
||||||
|
let
|
||||||
|
process-with-depth = depth: content:
|
||||||
|
map
|
||||||
|
(x:
|
||||||
|
if isAttrs x && x ? section
|
||||||
|
then x // {
|
||||||
|
section = x.section // {
|
||||||
|
heading-level = depth;
|
||||||
|
content = process-with-depth (depth + 1) (x.section.content or [ ]);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else x
|
||||||
|
)
|
||||||
|
content;
|
||||||
|
|
||||||
|
find-with-depth = depth: content:
|
||||||
|
let
|
||||||
|
sections = map (v: { inherit (def) file; value = v; depth = depth; })
|
||||||
|
(filter (x: isAttrs x && x ? section) content);
|
||||||
|
subsections = concatMap
|
||||||
|
(x:
|
||||||
|
if isAttrs x && x ? section && x.section ? content
|
||||||
|
then find-with-depth (depth + 1) x.section.content
|
||||||
|
else [ ])
|
||||||
|
content;
|
||||||
|
in
|
||||||
|
sections ++ subsections;
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit def;
|
||||||
|
processed = process-with-depth 1 def.value;
|
||||||
|
validation = find-with-depth 1 def.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
processed = map find-and-attach defs;
|
||||||
|
all-sections = flatten (map (p: p.validation) processed);
|
||||||
|
too-deep = filter (sec: sec.depth > 6) all-sections;
|
||||||
|
in
|
||||||
|
if too-deep != [ ] then
|
||||||
|
throw ''
|
||||||
|
The option `${lib.options.showOption loc}` has sections nested too deeply:
|
||||||
|
${concatMapStrings (sec: " - depth ${toString sec.depth} section in ${toString sec.file}\n") too-deep}
|
||||||
|
Section hierarchy must not be deeper than 6 levels.''
|
||||||
|
else baseType.merge loc (map (p: p.def // { value = p.processed; }) processed);
|
||||||
|
};
|
||||||
|
in
|
||||||
|
# HACK: bail out for now
|
||||||
|
with-section-constraints
|
||||||
|
# TODO: find a reasonable cut-off for where to place raw content
|
||||||
|
(listOf (either str (attrTag categories.flow)));
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self: with lib;
|
||||||
|
print-element name self.attrs (join "\n" (map toString-unwrap self.content));
|
||||||
|
};
|
||||||
|
|
||||||
|
section = { config, name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
# setting to an attribute set will wrap the section in `<section>`
|
||||||
|
attrs = mkOption {
|
||||||
|
type = with types; nullOr (submodule { options = global-attrs; });
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
heading = mkOption {
|
||||||
|
# XXX: while there are no explicit rules on whether sections should contain headers,
|
||||||
|
# sections should have content that would be listed in an outline.
|
||||||
|
#
|
||||||
|
# https://html.spec.whatwg.org/multipage/sections.html#use-div-for-wrappers
|
||||||
|
#
|
||||||
|
# such an outline is rather meaningless without headings for navigation,
|
||||||
|
# which is why we enforce headings in sections.
|
||||||
|
# arguably, and this is encoded here, a section *is defined* by its heading.
|
||||||
|
type = with types; submodule ({ config, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
# setting to an attribute set will wrap the section in `<hgroup>`
|
||||||
|
hgroup.attrs = mkOption {
|
||||||
|
type = with types; nullOr (submodule { options = global-attrs; });
|
||||||
|
default = with lib; if (config.before == [ ] && config.after == [ ]) then null else { };
|
||||||
|
};
|
||||||
|
# https://html.spec.whatwg.org/multipage/sections.html#the-hgroup-element
|
||||||
|
before = mkOption {
|
||||||
|
type = with types; listOf (attrTag ({ inherit (element-types) p; } // categories.scripting));
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
content = mkOption {
|
||||||
|
# https://html.spec.whatwg.org/multipage/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements
|
||||||
|
type = with types; either str (listOf (attrTag categories.phrasing));
|
||||||
|
};
|
||||||
|
after = mkOption {
|
||||||
|
type = with types;
|
||||||
|
listOf (attrTag ({ inherit (element-types) p; } // categories.scripting));
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
# https://html.spec.whatwg.org/multipage/sections.html#headings-and-outlines
|
||||||
|
content = mkOption {
|
||||||
|
type = with types; listOf (either str (attrTag categories.flow));
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
options.heading-level = mkOption {
|
||||||
|
# XXX: this will proudly fail if the invariant is violated,
|
||||||
|
# but the error message will be inscrutable
|
||||||
|
type = with types; ints.between 1 6;
|
||||||
|
internal = true;
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
categories = [ "flow" "sectioning" "palpable" ];
|
||||||
|
__toString = self: with lib;
|
||||||
|
let
|
||||||
|
n = toString config.heading-level;
|
||||||
|
heading = ''<h${n}${print-attrs self.heading.attrs}>${self.heading.content}</h${n}>'';
|
||||||
|
hgroup = with lib; print-element "hgroup" self.heading.hgroup.attrs (squash ''
|
||||||
|
${optionalString (!isNull self.heading.before) (toString-unwrap self.heading.before)}
|
||||||
|
${heading}
|
||||||
|
${optionalString (!isNull self.heading.after) (toString-unwrap self.heading.after)}
|
||||||
|
'');
|
||||||
|
content =
|
||||||
|
(if isNull self.heading.hgroup.attrs then heading else hgroup)
|
||||||
|
+
|
||||||
|
join "\n" (map toString-unwrap self.content);
|
||||||
|
in
|
||||||
|
if !isNull self.attrs
|
||||||
|
then print-element name self.attrs content
|
||||||
|
else content;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
p = { name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
content = mkOption {
|
||||||
|
type = with types; either str (listOf (attrTag categories.phrasing));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.categories = [ "flow" "palpable" ];
|
||||||
|
config.__toString = self: print-element name self.attrs (toString self.content);
|
||||||
|
};
|
||||||
|
|
||||||
|
dl = { config, name, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
content = mkOption {
|
||||||
|
type = with types; listOf (submodule ({ ... }: {
|
||||||
|
options = {
|
||||||
|
# TODO: wrap in `<div>` if set
|
||||||
|
div.attrs = mkOption {
|
||||||
|
type = with types; nullOr (submodule { options = global-attrs; });
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
before = mkOption {
|
||||||
|
type = with types; listOf (attrTag categories.scripting);
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
terms = mkOption {
|
||||||
|
type = with types; nonEmptyListOf (submodule dt);
|
||||||
|
};
|
||||||
|
between = mkOption {
|
||||||
|
type = with types; listOf (attrTag categories.scripting);
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
descriptions = mkOption {
|
||||||
|
type = with types; nonEmptyListOf (submodule dd);
|
||||||
|
};
|
||||||
|
after = mkOption {
|
||||||
|
type = with types; listOf (attrTag categories.scripting);
|
||||||
|
default = [ ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# XXX: here we can't express the spec requirement that `dl` is palpable if the list of term-description-pairs is nonempty.
|
||||||
|
# the reason is that we have to specify a child's *type* in the parent, but being palpable is a property of the value in this case.
|
||||||
|
# and while the module system does have some dependent typing capabilities, we can't say "the type is X but only if its value has property Y".
|
||||||
|
# but since the "palpable" category isn't used in any structural requirement in the spec, this is not a loss of fidelity on our side.
|
||||||
|
# TODO: the whole notion of content categories may be a red herring for this implementation after all, reconsider it.
|
||||||
|
# it does help to concisely express type constraints on an element's children, but it seems that most of the categories in the spec can be ignored entirely in this implementation.
|
||||||
|
# the cleanup task would be to identify which categories are really helpful, and document the rationale for using that mechanism as well as the specific choice of categories to keep.
|
||||||
|
config.categories = [ "flow" ];
|
||||||
|
config.__toString = self:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
content = map
|
||||||
|
(entry:
|
||||||
|
let
|
||||||
|
list = squash ''
|
||||||
|
${join "\n" entry.before}
|
||||||
|
${join "\n" entry.terms}
|
||||||
|
${join "\n" entry.between}
|
||||||
|
${join "\n" entry.descriptions}
|
||||||
|
${join "\n" entry.after}
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
if !isNull entry.div.attrs
|
||||||
|
then print-element "div" entry.div.attrs list
|
||||||
|
else list
|
||||||
|
)
|
||||||
|
self.content;
|
||||||
|
in
|
||||||
|
print-element name self.attrs (join "\n" content);
|
||||||
|
};
|
||||||
|
|
||||||
|
dt = { config, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
dt = mkOption {
|
||||||
|
type = with types; either str (submodule (attrTag (
|
||||||
|
# TODO: test
|
||||||
|
with lib; removeAttrs
|
||||||
|
(filterAttrs
|
||||||
|
(name: value: ! any (c: elem c [ "sectioning" "heading" ]) value.categories)
|
||||||
|
categories.flow
|
||||||
|
)
|
||||||
|
[ "header" "footer" ]
|
||||||
|
)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self: print-element "dt" self.attrs self.dt;
|
||||||
|
};
|
||||||
|
|
||||||
|
dd = { config, ... }: {
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
attrs = mkAttrs { };
|
||||||
|
dd = mkOption {
|
||||||
|
type = with types; either str (submodule (attrTag categories.flow));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self: print-element "dd" self.attrs self.dd;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ element ];
|
||||||
|
options = {
|
||||||
|
inherit (element-types) html;
|
||||||
|
};
|
||||||
|
|
||||||
|
config.categories = [ ];
|
||||||
|
config.__toString = self: ''
|
||||||
|
<!DOCTYPE HTML >
|
||||||
|
${self.html}
|
||||||
|
'';
|
||||||
|
}
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
223
website/presentation/style.css
Normal file
223
website/presentation/style.css
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
:root {
|
||||||
|
/* XXX: maybe use light-dark() once it's more widely supported */
|
||||||
|
color-scheme: light dark;
|
||||||
|
--highlight: rgb(255, 110, 0);
|
||||||
|
--background: white;
|
||||||
|
--text-color: black;
|
||||||
|
--shadow: rgba(0,0,0,0.1);
|
||||||
|
scrollbar-gutter: stable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--background: black;
|
||||||
|
--text-color: #f0f0f0;
|
||||||
|
--shadow: rgba(255,255,255,0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Heebo, sans-serif;
|
||||||
|
color: var(--text-color);
|
||||||
|
background-color: var(--background);
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
max-width: 50em;
|
||||||
|
margin: auto;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-family: Signika, sans-serif;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav {
|
||||||
|
font-family: Signika, sans-serif;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited,
|
||||||
|
a
|
||||||
|
{
|
||||||
|
color: var(--highlight);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
header a:visited,
|
||||||
|
header a
|
||||||
|
{
|
||||||
|
color: var(--text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
header a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
header a:hover,
|
||||||
|
header li:hover
|
||||||
|
{
|
||||||
|
color: var(--highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
header nav ul {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav ul li {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
max-width: 60em;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:first-child a {
|
||||||
|
content: url('ngi-fediversity.svg');
|
||||||
|
display: inline-block;
|
||||||
|
height: 2em;
|
||||||
|
margin-right: 5vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:last-child > a {
|
||||||
|
border: 1pt solid var(--text-color);
|
||||||
|
padding: 0.5em 1em 0.5em 1em;
|
||||||
|
border-radius: 3pt;
|
||||||
|
margin-left: 5vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:last-child:hover > a {
|
||||||
|
color: var(--background);
|
||||||
|
background-color: var(--highlight);
|
||||||
|
border-color: var(--background);
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details > nav {
|
||||||
|
position: absolute;
|
||||||
|
/*top: 2em;*/
|
||||||
|
background: var(--background);
|
||||||
|
min-width: max-content;
|
||||||
|
margin-top: 1em;
|
||||||
|
padding: 1em;
|
||||||
|
box-shadow: 0 0 1em var(--shadow);
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details {
|
||||||
|
display: block;
|
||||||
|
/*padding: 1em 0;*/
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details[open] > summary {
|
||||||
|
color: var(--highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details > nav ul li {
|
||||||
|
padding: 0.25em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-toggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 50em) {
|
||||||
|
#menu-toggle:checked ~ nav > ul > li {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-toggle::before {
|
||||||
|
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 20 20'%3E%3Cpath d='M0 3h20v2H0V3z m0 6h20v2H0V9z m0 6h20v2H0V0z'/%3E%3C/svg%3E");
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-toggle:checked::before {
|
||||||
|
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 20 20'%3E%3Cpolygon points='11 9 22 9 22 11 11 11 11 22 9 22 9 11 -2 11 -2 9 9 9 9 -2 11 -2' transform='rotate(45 10 10)'/%3E%3C/svg%3E");
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
};
|
||||||
|
|
||||||
|
header > nav > ul > li:not(:first-child) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details{
|
||||||
|
/* compensate for collapse triangle */
|
||||||
|
margin-left: -1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details > nav {
|
||||||
|
position: relative;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 0 0.5em 0;
|
||||||
|
box-shadow: none;
|
||||||
|
/* compensate back for container's collapse triangle compensation */
|
||||||
|
margin-left: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > details > nav ul li {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 1.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul::before {
|
||||||
|
content: "";
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:first-child {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:first-child a {
|
||||||
|
margin: 0 0 0.5em 0;
|
||||||
|
height: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:last-child {
|
||||||
|
margin: 1em 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li:last-child a {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for some reason this must be at the end to work */
|
||||||
|
#menu-toggle {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
right: 1em;
|
||||||
|
top: 0.5em;
|
||||||
|
appearance: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
56
website/presentation/style.nix
Normal file
56
website/presentation/style.nix
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{ config, lib, pkgs, ... }: {
|
||||||
|
config.assets."style.css".path = ./style.css;
|
||||||
|
config.assets."ngi-fediversity.svg".path = ./ngi-fediversity.svg;
|
||||||
|
# TODO: auto-generate a bunch from SVG
|
||||||
|
config.assets."favicon.png".path = ./favicon.png;
|
||||||
|
config.assets."fonts.css".path = with lib; builtins.toFile "fonts.css" (join "\n" (map
|
||||||
|
(font: ''
|
||||||
|
@font-face {
|
||||||
|
font-family: '${font.name}';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: ${toString font.weight};
|
||||||
|
src: url(/${head config.assets.${font.file}.locations}) format('woff2');
|
||||||
|
}
|
||||||
|
'')
|
||||||
|
(
|
||||||
|
(crossLists (name: file: weight: { inherit name file weight; })
|
||||||
|
[ [ "Signika " ] [ "signika-extended.woff2" "signika.woff2" ] [ 500 700 ] ]
|
||||||
|
)
|
||||||
|
++
|
||||||
|
(crossLists (name: file: weight: { inherit name file weight; })
|
||||||
|
[ [ "Heebo " ] [ "heebo-extended.woff2" "heebo.woff2" ] [ 400 600 ] ]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
||||||
|
# TODO: get directly from https://github.com/google/fonts
|
||||||
|
# and compress with https://github.com/fonttools/fonttools
|
||||||
|
config.assets."signika-extended.woff2" = {
|
||||||
|
path = pkgs.fetchurl {
|
||||||
|
url = "https://fonts.gstatic.com/s/signika/v25/vEFO2_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX6bOjM7sfA.woff2";
|
||||||
|
hash = "sha256-6xM7cHYlTKNf1b0gpqhPJjwOoZfxx9+u1e4JPYG2lKk=";
|
||||||
|
name = "signika-extended.woff2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.assets."signika.woff2" = {
|
||||||
|
path = pkgs.fetchurl {
|
||||||
|
url = "https://fonts.gstatic.com/s/signika/v25/vEFO2_JTCgwQ5ejvMV0Ox_Kg1UwJ0tKfX6bBjM4.woff2";
|
||||||
|
hash = "sha256-Yu0kGT3seb8Qtulu84wvY6nLyPXsRBO/JvTD2BQBtHg=";
|
||||||
|
name = "signika.woff2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.assets."heebo-extended.woff2" = {
|
||||||
|
path = pkgs.fetchurl {
|
||||||
|
url = "https://fonts.gstatic.com/s/heebo/v26/NGS6v5_NC0k9P9H2TbE.woff2";
|
||||||
|
hash = "sha256-lk3+fFEqYWbHHGyXkdhKnOOMGS9m5ZbbxQcRQCSlxDE=";
|
||||||
|
name = "heebo-extended.woff2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.assets."heebo.woff2" = {
|
||||||
|
path = pkgs.fetchurl {
|
||||||
|
url = "https://fonts.gstatic.com/s/heebo/v26/NGS6v5_NC0k9P9H4TbFzsQ.woff2";
|
||||||
|
hash = "sha256-JWnjYlbcNsg6KCJnRRjECL2HnZGJOBTMtdutWBNza4Q=";
|
||||||
|
name = "heebo.woff2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
66
website/presentation/templates.nix
Normal file
66
website/presentation/templates.nix
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
{ config, options, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
mkOption
|
||||||
|
types
|
||||||
|
;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config.templates.html = {
|
||||||
|
dom = document:
|
||||||
|
let
|
||||||
|
eval = lib.evalModules {
|
||||||
|
class = "DOM";
|
||||||
|
modules = [ document (import ./dom.nix) ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
__toString = _: toString eval.config;
|
||||||
|
value = eval.config;
|
||||||
|
};
|
||||||
|
|
||||||
|
markdown = { name, body }:
|
||||||
|
let
|
||||||
|
commonmark = pkgs.runCommand "${name}.html"
|
||||||
|
{
|
||||||
|
buildInputs = [ pkgs.cmark ];
|
||||||
|
} ''
|
||||||
|
cmark ${builtins.toFile "${name}.md" body} > $out
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
builtins.readFile commonmark;
|
||||||
|
nav = { menu, page }:
|
||||||
|
let
|
||||||
|
render-item = item:
|
||||||
|
if item ? menu then ''
|
||||||
|
<li><details><summary>${item.menu.label}</summary>
|
||||||
|
${lib.indent " " (item.menu.outputs.html page)}
|
||||||
|
</li>
|
||||||
|
''
|
||||||
|
else if item ? page then ''<li><a href="${page.link item.page}">${item.page.title}</a></li>''
|
||||||
|
else ''<li><a href="${item.link.url}">${item.link.label}</a></li>''
|
||||||
|
;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
${with lib; indent " " (join "\n" (map render-item menu.items))}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config.templates.files = fs: with lib;
|
||||||
|
foldl'
|
||||||
|
# TODO: create static redirects from `tail <collection>.locations`
|
||||||
|
(acc: elem: acc // (mapAttrs' (type: value: {
|
||||||
|
name = head elem.locations + optionalString (type != "") ".${type}";
|
||||||
|
value = if isStorePath value then value else
|
||||||
|
builtins.toFile
|
||||||
|
(elem.name + optionalString (type != "") ".${type}")
|
||||||
|
(toString value);
|
||||||
|
}))
|
||||||
|
elem.outputs)
|
||||||
|
{ }
|
||||||
|
fs;
|
||||||
|
}
|
|
@ -1,88 +0,0 @@
|
||||||
##### Optimize default expiration time - BEGIN
|
|
||||||
<IfModule mod_expires.c>
|
|
||||||
|
|
||||||
## Enable expiration control
|
|
||||||
ExpiresActive On
|
|
||||||
|
|
||||||
## CSS and JS expiration: 1 week after request
|
|
||||||
ExpiresByType text/css "now plus 1 week"
|
|
||||||
ExpiresByType application/javascript "now plus 1 week"
|
|
||||||
ExpiresByType application/x-javascript "now plus 1 week"
|
|
||||||
|
|
||||||
## Image files expiration: 1 month after request
|
|
||||||
ExpiresByType image/bmp "now plus 1 month"
|
|
||||||
ExpiresByType image/gif "now plus 1 month"
|
|
||||||
ExpiresByType image/jpeg "now plus 1 month"
|
|
||||||
ExpiresByType image/webp "now plus 1 month"
|
|
||||||
ExpiresByType image/jp2 "now plus 1 month"
|
|
||||||
ExpiresByType image/pipeg "now plus 1 month"
|
|
||||||
ExpiresByType image/png "now plus 1 month"
|
|
||||||
ExpiresByType image/svg+xml "now plus 1 month"
|
|
||||||
ExpiresByType image/tiff "now plus 1 month"
|
|
||||||
ExpiresByType image/x-icon "now plus 1 month"
|
|
||||||
ExpiresByType image/ico "now plus 1 month"
|
|
||||||
ExpiresByType image/icon "now plus 1 month"
|
|
||||||
ExpiresByType text/ico "now plus 1 month"
|
|
||||||
ExpiresByType application/ico "now plus 1 month"
|
|
||||||
ExpiresByType image/vnd.wap.wbmp "now plus 1 month"
|
|
||||||
|
|
||||||
## Font files expiration: 1 month after request
|
|
||||||
ExpiresByType application/x-font-ttf "now plus 1 month"
|
|
||||||
ExpiresByType application/x-font-opentype "now plus 1 month"
|
|
||||||
ExpiresByType application/x-font-woff "now plus 1 month"
|
|
||||||
ExpiresByType font/woff2 "now plus 1 month"
|
|
||||||
ExpiresByType image/svg+xml "now plus 1 month"
|
|
||||||
|
|
||||||
## Audio files expiration: 1 month after request
|
|
||||||
ExpiresByType audio/ogg "now plus 1 month"
|
|
||||||
ExpiresByType application/ogg "now plus 1 month"
|
|
||||||
ExpiresByType audio/basic "now plus 1 month"
|
|
||||||
ExpiresByType audio/mid "now plus 1 month"
|
|
||||||
ExpiresByType audio/midi "now plus 1 month"
|
|
||||||
ExpiresByType audio/mpeg "now plus 1 month"
|
|
||||||
ExpiresByType audio/mp3 "now plus 1 month"
|
|
||||||
ExpiresByType audio/x-aiff "now plus 1 month"
|
|
||||||
ExpiresByType audio/x-mpegurl "now plus 1 month"
|
|
||||||
ExpiresByType audio/x-pn-realaudio "now plus 1 month"
|
|
||||||
ExpiresByType audio/x-wav "now plus 1 month"
|
|
||||||
|
|
||||||
## Movie files expiration: 1 month after request
|
|
||||||
ExpiresByType application/x-shockwave-flash "now plus 1 month"
|
|
||||||
ExpiresByType x-world/x-vrml "now plus 1 month"
|
|
||||||
ExpiresByType video/x-msvideo "now plus 1 month"
|
|
||||||
ExpiresByType video/mpeg "now plus 1 month"
|
|
||||||
ExpiresByType video/mp4 "now plus 1 month"
|
|
||||||
ExpiresByType video/quicktime "now plus 1 month"
|
|
||||||
ExpiresByType video/x-la-asf "now plus 1 month"
|
|
||||||
ExpiresByType video/x-ms-asf "now plus 1 month"
|
|
||||||
</IfModule>
|
|
||||||
##### Optimize default expiration time - END
|
|
||||||
|
|
||||||
##### 1 Month for most static resources
|
|
||||||
<filesMatch ".(css|jpg|jpeg|png|webp|gif|js|ico|woff|woff2|eot|ttf)$">
|
|
||||||
Header set Cache-Control "public, max-age=31536000, immutable"
|
|
||||||
</filesMatch>
|
|
||||||
|
|
||||||
##### Enable gzip compression for resources
|
|
||||||
<ifModule mod_gzip.c>
|
|
||||||
mod_gzip_on Yes
|
|
||||||
mod_gzip_dechunk Yes
|
|
||||||
mod_gzip_item_include file .(html?|txt|css|js|php)$
|
|
||||||
mod_gzip_item_include handler ^cgi-script$
|
|
||||||
mod_gzip_item_include mime ^text/.*
|
|
||||||
mod_gzip_item_include mime ^application/x-javascript.*
|
|
||||||
mod_gzip_item_exclude mime ^image/.*
|
|
||||||
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
|
|
||||||
</ifModule>
|
|
||||||
|
|
||||||
##### Or, compress certain file types by extension:
|
|
||||||
<FilesMatch ".(html|css|jpg|jpeg|webp|png|gif|js|ico)">
|
|
||||||
SetOutputFilter DEFLATE
|
|
||||||
</FilesMatch>
|
|
||||||
|
|
||||||
##### Set Header Vary: Accept-Encoding
|
|
||||||
<IfModule mod_headers.c>
|
|
||||||
<FilesMatch ".(js|css|xml|gz|html)$">
|
|
||||||
Header append Vary: Accept-Encoding
|
|
||||||
</FilesMatch>
|
|
||||||
</IfModule>
|
|
|
@ -1,872 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html
|
|
||||||
itemscope
|
|
||||||
class="system"
|
|
||||||
lang="en-us"
|
|
||||||
itemtype="http://schema.org/WebPage"
|
|
||||||
>
|
|
||||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
|
||||||
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
|
|
||||||
|
|
||||||
<meta
|
|
||||||
name="viewport"
|
|
||||||
content="width=device-width, initial-scale=1, maximum-scale=5"
|
|
||||||
/>
|
|
||||||
|
|
||||||
|
|
||||||
<meta name="theme-name" content="hugoplate" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<link rel="shortcut icon" href="/images/favicon_hudf4905de8b22f1b316f0f9113e9f1079_22623_96x0_resize_lanczos_3.png" type="image/x-icon">
|
|
||||||
<link rel="icon" href="/images/favicon_hudf4905de8b22f1b316f0f9113e9f1079_22623_96x0_resize_lanczos_3.png" type="image/x-icon">
|
|
||||||
<link rel="icon" type="image/png" sizes="48x48" href="/images/favicon_hudf4905de8b22f1b316f0f9113e9f1079_22623_48x0_resize_lanczos_3.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="96x96" href="/images/favicon_hudf4905de8b22f1b316f0f9113e9f1079_22623_96x0_resize_lanczos_3.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="144x144" href="/images/favicon_hudf4905de8b22f1b316f0f9113e9f1079_22623_144x0_resize_lanczos_3.png">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<link rel="manifest" href="/manifest.webmanifest" />
|
|
||||||
<meta
|
|
||||||
name="msapplication-TileColor"
|
|
||||||
content="#ddd" />
|
|
||||||
<meta
|
|
||||||
name="theme-color"
|
|
||||||
content="#ffffff" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<base href="//localhost:1313/404.html" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<title>Fediversity</title>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta
|
|
||||||
name="keywords"
|
|
||||||
content="fediverse, nixos, open source" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta
|
|
||||||
name="description"
|
|
||||||
content="Fediversity Project" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta name="author" content="NGI Fediversity" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta property="og:image" content="//localhost:1313/images/logo.png" />
|
|
||||||
<meta name="twitter:image" content="//localhost:1313/images/logo.png" />
|
|
||||||
<meta
|
|
||||||
name="twitter:card"
|
|
||||||
content="summary
|
|
||||||
_large_image
|
|
||||||
" />
|
|
||||||
|
|
||||||
|
|
||||||
<meta property="og:image:width" content="600" />
|
|
||||||
<meta property="og:image:height" content="200" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta
|
|
||||||
property="og:image:type"
|
|
||||||
content="image/
|
|
||||||
.png
|
|
||||||
" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta property="og:title" content="Fediversity" />
|
|
||||||
<meta property="og:description" content="Fediversity Project" />
|
|
||||||
<meta property="og:type" content="website" />
|
|
||||||
<meta property="og:url" content="//localhost:1313/404.html" />
|
|
||||||
|
|
||||||
|
|
||||||
<meta name="twitter:title" content="Fediversity" />
|
|
||||||
<meta name="twitter:description" content="Fediversity Project" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
let indexURL = "//localhost:1313/searchindex.json";
|
|
||||||
let includeSectionsInSearch = ["blog"];
|
|
||||||
let no_results_for = "No results for";
|
|
||||||
let empty_search_results_placeholder = "Type something to search..";
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<meta http-equiv="x-dns-prefetch-control" content="on" />
|
|
||||||
<link rel="preconnect" href="https://use.fontawesome.com" crossorigin />
|
|
||||||
<link rel="preconnect" href="//cdnjs.cloudflare.com" />
|
|
||||||
<link rel="preconnect" href="//www.googletagmanager.com" />
|
|
||||||
<link rel="preconnect" href="//www.google-analytics.com" />
|
|
||||||
<link rel="dns-prefetch" href="https://use.fontawesome.com" />
|
|
||||||
<link rel="dns-prefetch" href="//ajax.googleapis.com" />
|
|
||||||
<link rel="dns-prefetch" href="//cdnjs.cloudflare.com" />
|
|
||||||
<link rel="dns-prefetch" href="//www.googletagmanager.com" />
|
|
||||||
<link rel="dns-prefetch" href="//www.google-analytics.com" />
|
|
||||||
<link rel="dns-prefetch" href="//fonts.googleapis.com" />
|
|
||||||
<link rel="dns-prefetch" href="//connect.facebook.net" />
|
|
||||||
<link rel="dns-prefetch" href="//platform.linkedin.com" />
|
|
||||||
<link rel="dns-prefetch" href="//platform.twitter.com" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<script>
|
|
||||||
(function () {
|
|
||||||
const googleFont = document.createElement("link");
|
|
||||||
googleFont.href =
|
|
||||||
"https://fonts.googleapis.com/css2?family=Heebo:wght@400;600&family=Signika:wght@500;700&display=swap";
|
|
||||||
googleFont.type = "text/css";
|
|
||||||
googleFont.rel = "stylesheet";
|
|
||||||
document.head.appendChild(googleFont);
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<link
|
|
||||||
href="/css/style.css"
|
|
||||||
integrity=""
|
|
||||||
rel="stylesheet"
|
|
||||||
/>
|
|
||||||
|
|
||||||
|
|
||||||
<link
|
|
||||||
defer
|
|
||||||
async
|
|
||||||
rel="stylesheet"
|
|
||||||
href="/css/style-lazy.css"
|
|
||||||
integrity=""
|
|
||||||
media="print"
|
|
||||||
onload="this.media='all'; this.onload=null;"
|
|
||||||
/>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="fixed left-0 top-0 z-50 flex w-[30px] items-center justify-center bg-gray-200 py-[2.5px] text-[12px] uppercase text-black sm:bg-red-200 md:bg-yellow-200 lg:bg-green-200 xl:bg-blue-200 2xl:bg-pink-200"
|
|
||||||
>
|
|
||||||
<span class="block sm:hidden">all</span>
|
|
||||||
<span class="hidden sm:block md:hidden">sm</span>
|
|
||||||
<span class="hidden md:block lg:hidden">md</span>
|
|
||||||
<span class="hidden lg:block xl:hidden">lg</span>
|
|
||||||
<span class="hidden xl:block 2xl:hidden">xl</span>
|
|
||||||
<span class="hidden 2xl:block">2xl</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<header
|
|
||||||
class="header sticky top-0 z-30"
|
|
||||||
>
|
|
||||||
<nav class="navbar container">
|
|
||||||
|
|
||||||
<div class="order-0">
|
|
||||||
|
|
||||||
<a class="navbar-brand block" href="/">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<img
|
|
||||||
fetchpriority="high"
|
|
||||||
decoding="async"
|
|
||||||
class="img logo-light"
|
|
||||||
width="160"
|
|
||||||
height="32"
|
|
||||||
src="/images/ngi_fedi_full.svg"
|
|
||||||
alt="Hugoplate"
|
|
||||||
onerror="this.onerror=null;this.src='';" />
|
|
||||||
|
|
||||||
<img
|
|
||||||
fetchpriority="high"
|
|
||||||
decoding="async"
|
|
||||||
class="img logo-dark"
|
|
||||||
width="160"
|
|
||||||
height="32"
|
|
||||||
src="/images/logo-darkmode_hu3e1f0f6bc04cc0e54cd69f08cd041995_19726_320x0_resize_q80_h2_lanczos_3.webp"
|
|
||||||
alt="Hugoplate"
|
|
||||||
onerror="this.onerror=null;this.src='\/images\/logo-darkmode_hu3e1f0f6bc04cc0e54cd69f08cd041995_19726_320x0_resize_lanczos_3.png';" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<input id="nav-toggle" type="checkbox" class="hidden" />
|
|
||||||
<label
|
|
||||||
for="nav-toggle"
|
|
||||||
class="order-3 cursor-pointer flex items-center lg:hidden text-dark lg:order-1"
|
|
||||||
>
|
|
||||||
<svg id="show-button" class="h-6 fill-current block" viewBox="0 0 20 20">
|
|
||||||
<title>Menu Open</title>
|
|
||||||
<path d="M0 3h20v2H0V3z m0 6h20v2H0V9z m0 6h20v2H0V0z"></path>
|
|
||||||
</svg>
|
|
||||||
<svg id="hide-button" class="h-6 fill-current hidden" viewBox="0 0 20 20">
|
|
||||||
<title>Menu Close</title>
|
|
||||||
<polygon
|
|
||||||
points="11 9 22 9 22 11 11 11 11 22 9 22 9 11 -2 11 -2 9 9 9 9 -2 11 -2"
|
|
||||||
transform="rotate(45 10 10)"
|
|
||||||
></polygon>
|
|
||||||
</svg>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ul
|
|
||||||
id="nav-menu"
|
|
||||||
class="navbar-nav order-3 hidden lg:flex w-full pb-6 lg:order-1 lg:w-auto lg:space-x-2 lg:pb-0 xl:space-x-8"
|
|
||||||
>
|
|
||||||
|
|
||||||
<li class="nav-item nav-dropdown group relative">
|
|
||||||
<span
|
|
||||||
class="nav-link
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline-flex items-center"
|
|
||||||
>
|
|
||||||
For You
|
|
||||||
<svg class="h-4 w-4 fill-current" viewBox="0 0 20 20">
|
|
||||||
<path
|
|
||||||
d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<ul
|
|
||||||
class="nav-dropdown-list lg:group-hover:visible lg:group-hover:opacity-100"
|
|
||||||
>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/developers/"
|
|
||||||
>
|
|
||||||
Developers
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/ec/"
|
|
||||||
>
|
|
||||||
European Commission
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/individuals/"
|
|
||||||
>
|
|
||||||
Individuals
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item nav-dropdown group relative">
|
|
||||||
<span
|
|
||||||
class="nav-link
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline-flex items-center"
|
|
||||||
>
|
|
||||||
Consortium
|
|
||||||
<svg class="h-4 w-4 fill-current" viewBox="0 0 20 20">
|
|
||||||
<path
|
|
||||||
d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<ul
|
|
||||||
class="nav-dropdown-list lg:group-hover:visible lg:group-hover:opacity-100"
|
|
||||||
>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/nlnet/"
|
|
||||||
>
|
|
||||||
NLnet
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/nordunet/"
|
|
||||||
>
|
|
||||||
NORDUnet
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/oid/"
|
|
||||||
>
|
|
||||||
Open Internet Discourse
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-dropdown-item">
|
|
||||||
<a
|
|
||||||
class="nav-dropdown-link "
|
|
||||||
|
|
||||||
href="/tweag/"
|
|
||||||
>
|
|
||||||
Tweag
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item">
|
|
||||||
<a
|
|
||||||
class="nav-link "
|
|
||||||
|
|
||||||
href="/fediversity/"
|
|
||||||
>Fediversity</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item">
|
|
||||||
<a
|
|
||||||
class="nav-link "
|
|
||||||
|
|
||||||
href="/grants/"
|
|
||||||
>Grants</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item">
|
|
||||||
<a
|
|
||||||
class="nav-link "
|
|
||||||
|
|
||||||
href="/events/"
|
|
||||||
>Events</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item">
|
|
||||||
<a
|
|
||||||
class="nav-link "
|
|
||||||
|
|
||||||
href="/blog/"
|
|
||||||
>News</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="mt-4 inline-block lg:hidden">
|
|
||||||
<a
|
|
||||||
class="btn btn-outline-primary btn-sm"
|
|
||||||
href="/contact"
|
|
||||||
>
|
|
||||||
Contact
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div class="order-1 ml-auto flex items-center md:order-2 lg:ml-0">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a
|
|
||||||
href="/contact"
|
|
||||||
class="btn btn-outline-primary btn-sm hidden lg:inline-block"
|
|
||||||
>
|
|
||||||
Contact
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<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="//localhost:1313/" class="btn btn-primary mt-8">
|
|
||||||
Back to home
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
|
|
||||||
<footer class="bg-theme-light">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row items-center py-10">
|
|
||||||
<div class="lg:col-3 mb-8 text-center lg:mb-0 lg:text-left">
|
|
||||||
|
|
||||||
<a
|
|
||||||
class="navbar-brand inline-block"
|
|
||||||
href="/"
|
|
||||||
>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<img
|
|
||||||
fetchpriority="high"
|
|
||||||
decoding="async"
|
|
||||||
class="img logo-light"
|
|
||||||
width="160"
|
|
||||||
height="32"
|
|
||||||
src="/images/ngi_fedi_full.svg"
|
|
||||||
alt="Hugoplate"
|
|
||||||
onerror="this.onerror=null;this.src='';" />
|
|
||||||
|
|
||||||
<img
|
|
||||||
fetchpriority="high"
|
|
||||||
decoding="async"
|
|
||||||
class="img logo-dark"
|
|
||||||
width="160"
|
|
||||||
height="32"
|
|
||||||
src="/images/logo-darkmode_hu3e1f0f6bc04cc0e54cd69f08cd041995_19726_320x0_resize_q80_h2_lanczos_3.webp"
|
|
||||||
alt="Hugoplate"
|
|
||||||
onerror="this.onerror=null;this.src='\/images\/logo-darkmode_hu3e1f0f6bc04cc0e54cd69f08cd041995_19726_320x0_resize_lanczos_3.png';" />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="lg:col-6 mb-8 text-center lg:mb-0">
|
|
||||||
<ul>
|
|
||||||
|
|
||||||
<li class="m-3 inline-block">
|
|
||||||
<a
|
|
||||||
|
|
||||||
href="
|
|
||||||
/fediversity/
|
|
||||||
"
|
|
||||||
>About</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="m-3 inline-block">
|
|
||||||
<a
|
|
||||||
|
|
||||||
href="
|
|
||||||
/privacy-policy/
|
|
||||||
"
|
|
||||||
>Privacy Policy</a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="lg:col-3 mb-8 text-center lg:mb-0 lg:mt-0 lg:text-right">
|
|
||||||
<ul class="social-icons">
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
aria-label="mastodon"
|
|
||||||
rel="nofollow noopener"
|
|
||||||
href="https://mastodon.fediversity.eu/@fediversity"
|
|
||||||
>
|
|
||||||
<i class="fab fa-mastodon"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
aria-label="rss"
|
|
||||||
rel="nofollow noopener"
|
|
||||||
href="https://fediversity.eu/rss"
|
|
||||||
>
|
|
||||||
<i class="fab fa-rss"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="border-border border-t py-7">
|
|
||||||
<div class="text-light container text-center">
|
|
||||||
<p></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity=""
|
|
||||||
src="/js/script.js"
|
|
||||||
></script>
|
|
||||||
|
|
||||||
|
|
||||||
<script
|
|
||||||
defer
|
|
||||||
async
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity=""
|
|
||||||
src="/js/script-lazy.js"
|
|
||||||
></script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
if ('serviceWorker' in navigator){navigator.serviceWorker.register("/service-worker.js");}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,18 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
|
||||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
|
||||||
<channel>
|
|
||||||
<title>Authors on Fediversity</title>
|
|
||||||
<link>//localhost:1313/authors/</link>
|
|
||||||
<description>Recent content in Authors on Fediversity</description>
|
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
|
||||||
<language>en-us</language>
|
|
||||||
<atom:link href="//localhost:1313/authors/index.xml" rel="self" type="application/rss+xml" />
|
|
||||||
<item>
|
|
||||||
<title>Laurens Hof</title>
|
|
||||||
<link>//localhost:1313/authors/laurens-hof/</link>
|
|
||||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
|
||||||
<guid>//localhost:1313/authors/laurens-hof/</guid>
|
|
||||||
<description>Story teller for the Fediversity Project.</description>
|
|
||||||
</item>
|
|
||||||
</channel>
|
|
||||||
</rss>
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,47 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
|
||||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
|
||||||
<channel>
|
|
||||||
<title>News on Fediversity</title>
|
|
||||||
<link>//localhost:1313/blog/</link>
|
|
||||||
<description>Recent content in News on Fediversity</description>
|
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
|
||||||
<language>en-us</language>
|
|
||||||
<lastBuildDate>Tue, 17 Sep 2024 05:00:00 +0000</lastBuildDate>
|
|
||||||
<atom:link href="//localhost:1313/blog/index.xml" rel="self" type="application/rss+xml" />
|
|
||||||
<item>
|
|
||||||
<title>Nordunet Conference 2024</title>
|
|
||||||
<link>//localhost:1313/blog/nordunet-conference-2024/</link>
|
|
||||||
<pubDate>Tue, 17 Sep 2024 05:00:00 +0000</pubDate>
|
|
||||||
<guid>//localhost:1313/blog/nordunet-conference-2024/</guid>
|
|
||||||
<description>Fediversity was represented in Bergen at the Nordunet Conference for 2024, with both the Internet Discourse Foundation and Nordunet themselves being present.</description>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<title>Fediversity Tech Session</title>
|
|
||||||
<link>//localhost:1313/blog/fediversity-tech-session/</link>
|
|
||||||
<pubDate>Mon, 05 Aug 2024 05:00:00 +0000</pubDate>
|
|
||||||
<guid>//localhost:1313/blog/fediversity-tech-session/</guid>
|
|
||||||
<description>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.</description>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<title>PublicSpaces Conference 2024</title>
|
|
||||||
<link>//localhost:1313/blog/publicspaces-conference/</link>
|
|
||||||
<pubDate>Tue, 30 Jul 2024 05:00:00 +0000</pubDate>
|
|
||||||
<guid>//localhost:1313/blog/publicspaces-conference/</guid>
|
|
||||||
<description>PublicSpaces and Waag Futurelabs recently held their yearly conference in Amsterdam, titled &lsquo;Taking Back the Internet&rsquo;.</description>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<title>Fediversity new website launch</title>
|
|
||||||
<link>//localhost:1313/blog/new-website-launch/</link>
|
|
||||||
<pubDate>Wed, 15 May 2024 05:00:00 +0000</pubDate>
|
|
||||||
<guid>//localhost:1313/blog/new-website-launch/</guid>
|
|
||||||
<description>We are pleased to introduce the launch of our new website dedicated to the Fediversity project.</description>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<title>Fediversity Project publicly announced</title>
|
|
||||||
<link>//localhost:1313/blog/project-launch/</link>
|
|
||||||
<pubDate>Mon, 01 Jan 2024 05:00:00 +0000</pubDate>
|
|
||||||
<guid>//localhost:1313/blog/project-launch/</guid>
|
|
||||||
<description>The Consortium behind the Fediversity project announces that the project has officially been started.</description>
|
|
||||||
</item>
|
|
||||||
</channel>
|
|
||||||
</rss>
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,10 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-us">
|
|
||||||
<head>
|
|
||||||
<title>//localhost:1313/blog/</title>
|
|
||||||
<link rel="canonical" href="//localhost:1313/blog/">
|
|
||||||
<meta name="robots" content="noindex">
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="refresh" content="0; url=//localhost:1313/blog/">
|
|
||||||
</head>
|
|
||||||
</html>
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue