Compare commits

...

7 Commits

Author SHA1 Message Date
7de5d8fdea Merge pull request 'Migrate to Zola' (#1) from zola into master
All checks were successful
ci/woodpecker/manual/woodpecker Pipeline was successful
Reviewed-on: #1
2024-01-13 13:44:53 +01:00
b8e01ef426 fix: Add aliases 2024-01-13 13:44:09 +01:00
5d62bd065c feat: Add CI/CD 2024-01-13 13:39:16 +01:00
1f2b49ba3f docs: Update README 2024-01-13 13:38:07 +01:00
4294ca098c fix: Fix the Atom feed 2024-01-13 13:33:30 +01:00
14f18c03c8 feat: Fix the developers site 2024-01-13 13:26:40 +01:00
719501edaf feat: Somewhat convert to Zola 2024-01-13 13:25:00 +01:00
35 changed files with 2164 additions and 290 deletions

16
.woodpecker.yml Normal file
View File

@ -0,0 +1,16 @@
steps:
build:
image: alpine:3.19
commands:
- apk add --no-cache zola npm
- npm install -D tailwindcss @tailwindcss/typography
- npx tailwindcss -i input.css -o static/css/index.css --minify
- zola build
deploy:
image: git.polynom.me/papatutuwawa/woodpecker-ssg-deploy@sha256:9cfec13eb8ab1b8920c2f1f00f0258a7bfd159fe4e14e0985328086392c0da34
secrets: [ ssh_key ]
settings:
email: "ci@polynom.me"
name: "polynom.me CI system"
token_env: "SSH_KEY"
output: "public"

View File

@ -4,15 +4,7 @@ See the live website at [moxxy.org](https://moxxy.org).
## Development ## Development
Developing the site requires [jekyll](https://jekyllrb.com/) and [tailwindcss](https://tailwindcss.com/). Developing the site requires [zola](https://www.getzola.org/) and [tailwindcss](https://tailwindcss.com/).
### Jekyll
This website is statically generated using jekyll. Besides jekyll, the two
jekyll plugins [jekyll-seo-tag](https://github.com/jekyll/jekyll-seo-tag) and [jekyll-feed](https://github.com/jekyll/jekyll-feed) must be installed.
See [here](https://jekyllrb.com/docs/plugins/installation/) for instructions
on installing plugins.
### Tailwind ### Tailwind
@ -25,20 +17,25 @@ required for building the website.
In order to test changes, assuming jekyll and tailwindcss are set up, ... In order to test changes, assuming jekyll and tailwindcss are set up, ...
1. Run `tailwindcss -c tailwind.config.js -i input.css --watch --output ./_site/assets/css/index.css` from the root of the repository. 1. Run `tailwindcss -c tailwind.config.js -i input.css --watch --output ./static/css/index.css` from the root of the repository.
2. Run `jekyll serve` from the root of the repository. 2. Run `zola serve` from the root of the repository.
This gives you an environment where tailwindcss and jekyll regenerate their This gives you an environment where tailwindcss and zola regenerate their
previews when modifying their files. previews when modifying their files.
### Building ### Building
In order to build the website, you can either use the NixOS flake at the root 1. `tailwindcss --input ./input.css --output ./static/css/index.css`
of the repository (`nix build .#website`) or build the website and CSS separately: 2. `zola build`
1. `jekyll build --future` ### Adding a Blog Post
2. `cp -r ./assets _site/assets`
3. `tailwindcss --input ./input.css --output ./_site/assets/css/index.css` If you want to add a blog post, considert the following:
- If the post should contain media, create a directory in `./content/blog/` with the following naming scheme `YYYY-MM-DD-<Title>`. Inside that directory, create an `index.md` file where you can write the post in Markdown. The media files can then be placed inside that directory and included using `![](file-name.ext)`.
- If the post does not contain media, create a file in `./content/blog/` with the following naming scheme `YYYY-MM-DD-<Title>`. Inside that file you can write the post in Markdown.
Note that the existing posts specify an alias as this site has been migrated from jekyll to zola. It is not required for new posts.
## License ## License

View File

@ -1,19 +0,0 @@
<div class="relative h-16 inset-x-0 inset-y-0 px-4 shadow-md grid place-items-center">
<div class="flex flex-row items-center w-full">
<!-- The Moxxy logo -->
<a href="/index.html">
<img src="/assets/img/logo.png" class="w-12 h-12 p-2" />
</a>
<a href="/index.html">
<span class="font-bold">Moxxy</span>
</a>
<!-- Spacer -->
<div class="grow"></div>
<a href="/posts.html" class="px-2 text-sky-400">Blog</a>
<a href="/developers.html" class="px-2 text-sky-400">Developers</a>
<a href="{{ site.sourceUrl }}" class="px-2 text-sky-400">Source</a>
</div>
</div>

82
config.toml Normal file
View File

@ -0,0 +1,82 @@
base_url = "https://moxxy.org"
title = "Moxxy | A modern XMPP client"
description = "A modern XMPP client"
compile_sass = false
build_search_index = false
generate_feed = true
feed_filename = "feed.xml"
[extra]
heroText = "An experimental and modern XMPP client"
mainScreenshot = "img/screenshots/1.png"
features = [
"End-to-End encryption using OMEMO (0.8.3)",
"Stickers",
"Reactions",
"Retract messages",
"Voice messages",
"Swipe-to-quote",
"Chat background images",
"Optional privacy-preserving integration with phone contacts",
"Open-Source"
]
screenshots = [
"img/screenshots/1.png",
"img/screenshots/2.png",
]
sourceUrl = "https://codeberg.org/moxxy/moxxy"
githubMirrorUrl = "https://github.com/PapaTutuWawa/moxxy"
generalMuc = "xmpp:moxxy@muc.moxxy.org?join"
developmentMuc = "xmpp:dev@muc.moxxy.org?join"
[[extra.libraries]]
url = "https://codeberg.org/moxxy/moxxmpp"
name = "moxxmpp"
desc = "XMPP library written in Dart"
specific = false
[[extra.libraries]]
url = "https://codeberg.org/moxxy/moxdns"
name = "moxdns"
desc = "DNS SRV resolver for Flutter"
specific = true
[[extra.libraries]]
url = "https://codeberg.org/moxxy/moxlib"
name = "moxlib"
desc = "Shared functions for Moxxy-specific projects"
specific = true
[[extra.libraries]]
url = "https://codeberg.org/moxxy/moxxy_native"
name = "moxxy_native"
desc = "Platform-specific code"
specific = true
[[extra.libraries]]
url = "https://codeberg.org/PapaTutuWawa/omemo_dart"
name = "omemo_dart"
desc = "Implementation of the cryptography for OMEMO 0.8.3 with a high-level interface"
specific = false
[[extra.customXeps]]
name = "Extensible File Thumbnails"
desc = "Provide an extensible way of specifying thumbnails that are neccessarily binary data"
url = "https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md"
[[extra.customXeps]]
name = "File Upload Notification"
desc = "Allow communicating that an OOB file upload is currently running to improve the consistency of the conversation"
url = "https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md"
[[extra.badges]]
url = "https://apt.izzysoft.de/fdroid/index/apk/org.moxxy.moxxyv2"
image = "img/badges/IzzyOnDroid.png"
[[extra.badges]]
url = "https://codeberg.org/moxxy/moxxy/releases/latest"
image = "img/badges/codeberg.png"

3
content/_index.md Normal file
View File

@ -0,0 +1,3 @@
+++
template = "index.html"
+++

View File

@ -1,11 +1,18 @@
--- +++
layout: post title = "Moxxy's New Website"
title: Moxxy's New Website date = "2023-01-24"
author: PapaTutuWawa template = "post.html"
---
aliases = [ "posts/2023-01-24-Moxxys-New-Website.html" ]
[extra]
author = "PapaTutuWawa"
+++
Hello everyone! Welcome on Moxxy's new website. It currently does not contain Hello everyone! Welcome on Moxxy's new website. It currently does not contain
much but that may change in the future. much but that may change in the future.
<!-- more -->
The page is built using [Jekyll](https://jekyllrb.com/) and [TailwindCSS](https://tailwindcss.com/). You can find the page's The page is built using [Jekyll](https://jekyllrb.com/) and [TailwindCSS](https://tailwindcss.com/). You can find the page's
source [here](https://codeberg.org/moxxy/website). source [here](https://codeberg.org/moxxy/website).

View File

@ -1,13 +1,20 @@
--- +++
layout: post title = "Moxxy's First GSoC Project!"
title: Moxxy's First GSoC Project! date = "2023-05-06"
author: Ikjot Singh Dhody template = "post.html"
---
aliases = [ "posts/2023-05-06-Groupchat-GSoC-Project.html" ]
[extra]
author = "Ikjot Singh Dhody"
+++
Hello readers! Hello readers!
As we know, Moxxy is an experimental IM for XMPP built using Flutter. While it does have a great set of features as described [here](https://moxxy.org/), it currently lacks support for group chats (or Multi-User-Chats). A great piece of news is that Google has accepted my proposal to add support for multi user chats in Moxxy. As we know, Moxxy is an experimental IM for XMPP built using Flutter. While it does have a great set of features as described [here](https://moxxy.org/), it currently lacks support for group chats (or Multi-User-Chats). A great piece of news is that Google has accepted my proposal to add support for multi user chats in Moxxy.
<!-- more -->
To implement multi user chats in Moxxy, the [XEP-0045](https://xmpp.org/extensions/xep-0045.html) standard will be followed and implemented. The project will run in two phases, since the major changes required will be in the [moxxmpp](https://codeberg.org/moxxy/moxxmpp) and [Moxxy](https://codeberg.org/moxxy/moxxy) codebases. First, XEP-0045 support will be added to moxxmpp with all the handlers, events and routines required to cleanly integrate the same with Moxxy. The second phase will be the UI changes in the Moxxy Flutter application, that builds upon the existing, reusable infrastructure. To implement multi user chats in Moxxy, the [XEP-0045](https://xmpp.org/extensions/xep-0045.html) standard will be followed and implemented. The project will run in two phases, since the major changes required will be in the [moxxmpp](https://codeberg.org/moxxy/moxxmpp) and [Moxxy](https://codeberg.org/moxxy/moxxy) codebases. First, XEP-0045 support will be added to moxxmpp with all the handlers, events and routines required to cleanly integrate the same with Moxxy. The second phase will be the UI changes in the Moxxy Flutter application, that builds upon the existing, reusable infrastructure.
The usecases planned to be implemented are listed below (subject to changes before the coding period begins): The usecases planned to be implemented are listed below (subject to changes before the coding period begins):

View File

@ -1,13 +1,20 @@
--- +++
layout: post title = "XEP-0045 implementation in Moxxmpp"
title: XEP-0045 implementation in Moxxmpp date = "2023-06-17"
author: Ikjot Singh Dhody template = "post.html"
---
aliases = [ "posts/2023-06-17-XEP-0045-In-Moxxmpp.html" ]
[extra]
author = "Ikjot Singh Dhody"
+++
Hello readers! Hello readers!
Welcome back to the GSoC series of blogs. This one is about my implementation of the MUC XEP (XEP-0045) in Moxxmpp. Welcome back to the GSoC series of blogs. This one is about my implementation of the MUC XEP (XEP-0045) in Moxxmpp.
<!-- more -->
## Introduction ## Introduction
Well, as you probably know, Moxxy is the frontend app that is being developed as a modern new XMPP client. Well, as you probably know, Moxxy is the frontend app that is being developed as a modern new XMPP client.

View File

@ -1,13 +1,20 @@
--- +++
layout: post title = "Joining an MUC with Moxxy!"
title: Joining an MUC with Moxxy! date = "2023-07-24"
author: Ikjot Singh Dhody template = "post.html"
---
aliases = [ "posts/2023-07-24-Join-MUC-With-Moxxy.html" ]
[extra]
author = "Ikjot Singh Dhody"
+++
Greetings, readers! Greetings, readers!
Welcome back to our series of blogs on the Google Summer of Code (GSoC) project. In this blog post, I'll be sharing the progress made in implementing Multi-User Chat (MUC) support in Moxxy, the frontend counterpart to my GSoC project. Welcome back to our series of blogs on the Google Summer of Code (GSoC) project. In this blog post, I'll be sharing the progress made in implementing Multi-User Chat (MUC) support in Moxxy, the frontend counterpart to my GSoC project.
<!-- more -->
## Introduction ## Introduction
As you may recall, Moxxy is a frontend application developed as an innovative XMPP client. To enhance its functionality, my GSoC project focuses on adding MUC support. Before diving into the Moxxy implementation, it was crucial to establish the necessary MUC support in Moxxmpp, which is highlighted in [this](https://moxxy.org/posts/2023-06-17-XEP-0045-In-Moxxmpp.html) blog. As you may recall, Moxxy is a frontend application developed as an innovative XMPP client. To enhance its functionality, my GSoC project focuses on adding MUC support. Before diving into the Moxxy implementation, it was crucial to establish the necessary MUC support in Moxxmpp, which is highlighted in [this](https://moxxy.org/posts/2023-06-17-XEP-0045-In-Moxxmpp.html) blog.

View File

@ -1,8 +1,13 @@
--- +++
layout: post title = "GSoC report - Moxxy MUC implementation"
title: GSoC report - Moxxy MUC implementation date = "2023-08-20"
author: Ikjot Singh Dhody template = "post.html"
---
aliases = [ "posts/2023-08-20-Moxxy-MUC-GSoC-Final-Report.html" ]
[extra]
author = "Ikjot Singh Dhody"
+++
# GSoC Final Report: XMPP Standards Foundation - Moxxy: Implement Group Chats # GSoC Final Report: XMPP Standards Foundation - Moxxy: Implement Group Chats
@ -36,7 +41,7 @@ This report presents the culmination of my work on the GSoC project "Moxxy: Impl
## The Project ## The Project
Before getting into the details of the actual project - here is a demo screencast for the implementation: Before getting into the details of the actual project - here is a demo screencast for the implementation:
![](../assets/img/moxxy-muc-demo.gif) ![](moxxy-muc-demo.gif)
I have outlined the features I implemented through the GSoC period below. I have outlined the features I implemented through the GSoC period below.
### PRs merged ### PRs merged

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

8
content/blog/_index.md Normal file
View File

@ -0,0 +1,8 @@
+++
title = "Blog Posts"
template = "blog.html"
sort_by = "date"
aliases = [ "posts.html" ]
+++

6
content/developers.md Normal file
View File

@ -0,0 +1,6 @@
+++
title = "Developer Information"
template = "developers.html"
aliases = [ "developers.html" ]
+++

View File

@ -1,75 +0,0 @@
---
layout: default
title: Developer Information
---
<div class="w-full flex flex-row justify-center">
<div class="w-full lg:w-1/2">
<div class="w-full p-8 flex flex-col">
<div class="w-full pt-4">
<p>
Moxxy is fully open source. You can find the source code <a class="text-sky-400" href="{{ site.sourceUrl }}">on Codeberg</a>. Additionally, the code is
mirrored <a class="text-sky-400" href="{{ site.githubMirrorUrl }}">on GitHub</a>.
</p>
<p class="pt-1 pb-4">
Feel free to join the <a class="text-sky-400" href="{{ site.generalMuc }}">general chat</a> or the <a class="text-sky-400" href="{{ site.developmentMuc }}">developer chat</a> with your favourite XMPP client.
</p>
</div>
<h1 class="text-3xl font-bold">Libraries</h1>
<p class="pb-4">
Moxxy is built from various smaller libraries that are custom-made for this purpose. Some of them are for general usage, some are specific to the use case of building Moxxy.
</p>
<table class="table-fixed">
<thead class="bg-gray-100">
<tr>
<th class="text-left px-1">Library</th>
<th class="text-left px-1">Description</th>
<th class="text-left px-1">Moxxy specific</th>
</tr>
</thead>
<tbody class="divide-y divide-blue-200">
{% for library in site.developers.libraries %}
<tr>
<td class="pr-4">
<a class="text-sky-400" href="{{ library.url}}">{{ library.name }}</a>
</td>
<td class="pr-4">{{ library.desc }}</td>
<td class="pr-4">{% if library.specific %}Yes{% else %}No{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="w-full p-8 flex flex-col">
<h1 class="text-3xl font-bold">Custom XEPs</h1>
<p class="pb-4">
Moxxy currently implements some custom XMPP protocols to provide additional functionality. These are experimental and are intended to be upstreamed at some point.
</p>
<table class="table-fixed">
<thead class="bg-gray-100">
<tr>
<th class="text-left px-1">Name</th>
<th class="text-left px-1">Description</th>
</tr>
</thead>
<tbody class="divide-y divide-blue-200">
{% for xep in site.developers.customXeps %}
<tr>
<td class="pr-4">
<a class="text-sky-400" href="{{ xep.url }}">{{ xep.name }}</a>
</td>
<td class="pr-4">{{ xep.desc }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>

View File

@ -17,11 +17,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1674236650, "lastModified": 1704842529,
"narHash": "sha256-B4GKL1YdJnII6DQNNJ4wDW1ySJVx2suB1h/v4Ql8J0Q=", "narHash": "sha256-OTeQA+F8d/Evad33JMfuXC89VMetQbsU4qcaePchGr4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "cfb43ad7b941d9c3606fb35d91228da7ebddbfc5", "rev": "eabe8d3eface69f5bb16c18f8662a702f50c20d5",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -10,9 +10,6 @@
inherit system; inherit system;
}; };
jekyllPackages = with pkgs; [
rubyPackages.jekyll-feed rubyPackages.jekyll-seo-tag
];
tailwindWithTypography = (pkgs.nodePackages.tailwindcss.overrideAttrs (old: { tailwindWithTypography = (pkgs.nodePackages.tailwindcss.overrideAttrs (old: {
plugins = [ plugins = [
pkgs.nodePackages."@tailwindcss/typography" pkgs.nodePackages."@tailwindcss/typography"
@ -23,15 +20,9 @@
devShell = pkgs.mkShell { devShell = pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
tailwindWithTypography tailwindWithTypography
jekyll zola
imagemagick imagemagick
] ++ jekyllPackages; ];
};
packages = {
website = pkgs.callPackage ./pkgs/website.nix {
inherit tailwindWithTypography jekyllPackages;
};
}; };
}); });
} }

View File

@ -1,57 +0,0 @@
---
layout: default
title: A modern XMPP client
---
<div class="w-full bg-moxxy-purple p-8 flex flex-row justify-center h-fit">
<div class="lg:w-1/2 grid grid-cols-2 gap-4">
<div class="grid grid-cols-1 place-items-center">
<span class="text-neutral-100 text-2xl text-center">{{ site.index.heroText }}</span>
</div>
<div class="grid grid-rows-1 place-items-center">
<img class="rounded-md h-64 lg:h-96" src="{{ site.index.mainScreenshotUrl }}" />
</div>
</div>
</div>
<div class="w-full p-8">
<div class="flex flex-col items-center">
<div class="flex flex-wrap gap-4">
<a href="{{ site.index.badges.izzy.url }}">
<img class="h-24 md:h-16" src="/assets/img/badges/IzzyOnDroid.png" />
</a>
<a href="{{ site.index.badges.codeberg.url }}">
<img class="h-24 md:h-16" src="/assets/img/badges/codeberg.png" />
</a>
</div>
</div>
</div>
<div class="w-full p-8">
<div class="flex flex-col items-center">
<div>
<h1 class="text-3xl font-bold pb-4 place-self-start">Features</h1>
<ul class="list-disc px-4">
{% for feature in site.index.features %}
<li>{{ feature }}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
<div class="w-full p-8">
<div class="flex flex-col items-center">
<div>
<h1 class="text-3xl font-bold pb-4 place-self-start">Screenshots</h1>
<div class="flex flex-nowrap gap-8 overflow-scroll">
{% for screenshot in site.index.screenshots %}
<img class="h-96 rounded-md" src="{{ screenshot }}" />
{% endfor %}
</div>
</div>
</div>
</div>

View File

@ -1,25 +0,0 @@
{
jekyll, jekyllPackages, tailwindWithTypography
, stdenv
}:
stdenv.mkDerivation {
pname = "moxxyv2-website";
version = "20230827";
src = ./../.;
buildInputs = [
jekyll jekyllPackages tailwindWithTypography
];
buildPhase = ''
${jekyll}/bin/jekyll build --future
cp -r ./assets _site/assets
${tailwindWithTypography}/bin/tailwindcss --input ./input.css --output ./_site/assets/css/index.css
'';
installPhase = ''
mkdir -p $out/srv/www/
mv _site/ $out/srv/www/website
'';
}

View File

@ -1,34 +0,0 @@
---
layout: default
title: Blog Posts
---
<div class="w-full flex flex-row justify-center mt-2">
<div class="w-full lg:w-1/2 px-8 flex flex-col items-start">
<div class="flex flex-row items-center gap-x-3">
<h1 class="text-3xl">Blog posts</h1>
<a href="/feed.xml">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M12.75 19.5v-.75a7.5 7.5 0 00-7.5-7.5H4.5m0-6.75h.75c7.87 0 14.25 6.38 14.25 14.25v.75M6 18.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" />
</svg>
</a>
</div>
<div class="divide-y divide-blue-200">
{% for post in site.posts %}
<div class="mb-2">
<a href="{{ post.url }}" class="text-2xl text-sky-400">{{ post.title }}</a>
<div class="flex flex-row pl-2">
<span>By <span>{{ post.author }}</span></span>
</div>
<p class="mt-2 pl-2 text-slate-600">
{{ post.excerpt | markdownify | strip_html | truncatewords: 100 }}
</p>
</div>
{% endfor %}
</div>
</div>
</div>

1725
static/css/index.css Normal file

File diff suppressed because it is too large Load Diff

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

View File

Before

Width:  |  Height:  |  Size: 528 KiB

After

Width:  |  Height:  |  Size: 528 KiB

View File

@ -1,17 +1,13 @@
module.exports = { module.exports = {
content: [ content: [
"./_layouts/*.html", "./templates/*.html"
"./_includes/*.html",
"./index.html",
"./developers.html",
"./posts.html",
], ],
theme: { theme: {
extend: { extend: {
colors: { colors: {
'moxxy-purple': '#cf4aff', 'moxxy-purple': '#cf4aff',
}, },
}, },
}, },
plugins: [ plugins: [
require('@tailwindcss/typography'), require('@tailwindcss/typography'),

View File

@ -3,17 +3,25 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="/assets/css/index.css" rel="stylesheet" /> <link href="{{ get_url(path="css/index.css") }}" rel="stylesheet" />
<link rel="shortcut icon" href="/assets/img/favicon.ico" sizes="32x32" /> <link rel="shortcut icon" href="{{ get_url(path="img/favicon.ico") }}" sizes="32x32" />
<link href="/feed.xml" type="application/atom+xml" rel="alternate" title="Moxxy Blog" /> <link href="{{ get_url(path="feed.xml", trailing_slash=false) }}" type="application/atom+xml" rel="alternate" title="Moxxy Blog" />
{% seo %} {% if page %}
<meta property="og:description" content="{{ page.description }}" />
<meta property="og:title" content="{{ page.title }}" />
<title>{{ page.title }}</title>
{% else %}
<meta property="og:description" content="{{ config.description }}" />
<meta property="og:title" content="{{ config.title }}" />
<title>{{ config.title }}</title>
{% endif %}
</head> </head>
<body> <body>
<div class="flex flex-col"> <div class="flex flex-col">
{% include header.html %} {% include "header.html" %}
{{ content }} {% block content %}{% endblock %}
</div> </div>
<footer class="h-8 w-full flex flex-row justify-center"> <footer class="h-8 w-full flex flex-row justify-center">

34
templates/blog.html Normal file
View File

@ -0,0 +1,34 @@
{% extends "base.html" %}
{% block content %}
<div class="w-full flex flex-row justify-center mt-2">
<div class="w-full lg:w-1/2 px-8 flex flex-col items-start">
<div class="flex flex-row items-center gap-x-3">
<h1 class="text-3xl">Blog posts</h1>
<a href="{{ get_url(path="feed.xml", trailing_slash=false) }}">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M12.75 19.5v-.75a7.5 7.5 0 00-7.5-7.5H4.5m0-6.75h.75c7.87 0 14.25 6.38 14.25 14.25v.75M6 18.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" />
</svg>
</a>
</div>
<div class="divide-y divide-blue-200">
{% for post in section.pages %}
<!-- Post item -->
<div class="flex flex-col pt-4">
<a href="{{ post.permalink | safe }}">
<h1 class="text-indigo-400 prose prose-lg text-xl">{{ post.title }}</h1>
</a>
<span class="text-md mt-2">Posted by <i>{{ post.extra.author }}</i> on {{ post.date }}</span>
<!-- Blurp -->
<span class="prose mt-4">
{{ post.summary | safe }}
</span>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock %}

74
templates/developers.html Normal file
View File

@ -0,0 +1,74 @@
{% extends "base.html" %}
{% block content %}
<div class="w-full flex flex-row justify-center">
<div class="w-full lg:w-1/2">
<div class="w-full p-8 flex flex-col">
<div class="w-full pt-4">
<p>
Moxxy is fully open source. You can find the source code <a class="text-sky-400" href="{{ config.extra.sourceUrl }}">on Codeberg</a>. Additionally, the code is
mirrored <a class="text-sky-400" href="{{ config.extra.githubMirrorUrl }}">on GitHub</a>.
</p>
<p class="pt-1 pb-4">
Feel free to join the <a class="text-sky-400" href="{{ config.extra.generalMuc }}">general chat</a> or the <a class="text-sky-400" href="{{ config.extra.developmentMuc }}">developer chat</a> with your favourite XMPP client.
</p>
</div>
<h1 class="text-3xl font-bold">Libraries</h1>
<p class="pb-4">
Moxxy is built from various smaller libraries that are custom-made for this purpose. Some of them are for general usage, some are specific to the use case of building Moxxy.
</p>
<table class="table-fixed">
<thead class="bg-gray-100">
<tr>
<th class="text-left px-1">Library</th>
<th class="text-left px-1">Description</th>
<th class="text-left px-1">Moxxy specific</th>
</tr>
</thead>
<tbody class="divide-y divide-blue-200">
{% for library in config.extra.libraries %}
<tr>
<td class="pr-4">
<a class="text-sky-400" href="{{ library.url}}">{{ library.name }}</a>
</td>
<td class="pr-4">{{ library.desc }}</td>
<td class="pr-4">{% if library.specific %}Yes{% else %}No{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="w-full p-8 flex flex-col">
<h1 class="text-3xl font-bold">Custom XEPs</h1>
<p class="pb-4">
Moxxy currently implements some custom XMPP protocols to provide additional functionality. These are experimental and are intended to be upstreamed at some point.
</p>
<table class="table-fixed">
<thead class="bg-gray-100">
<tr>
<th class="text-left px-1">Name</th>
<th class="text-left px-1">Description</th>
</tr>
</thead>
<tbody class="divide-y divide-blue-200">
{% for xep in config.extra.customXeps %}
<tr>
<td class="pr-4">
<a class="text-sky-400" href="{{ xep.url }}">{{ xep.name }}</a>
</td>
<td class="pr-4">{{ xep.desc }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}

40
templates/feed.xml Normal file
View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>{{ config.title }}
{%- if term %} - {{ term.name }}
{%- elif section.title %} - {{ section.title }}
{%- endif -%}
</title>
<link>
{%- if section -%}
{{ section.permalink | escape_xml | safe }}
{%- else -%}
{{ config.base_url | escape_xml | safe }}
{%- endif -%}
</link>
<description>{{ config.description }}</description>
<generator>Zola</generator>
<language>{{ lang }}</language>
<atom:link href="{{ feed_url | safe }}" rel="self" type="application/rss+xml"/>
<lastBuildDate>{{ last_updated | date(format="%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate>
{%- for page in pages %}
<item>
<title>{{ page.title }}</title>
<pubDate>{{ page.date | date(format="%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
<author>
{%- if page.authors -%}
{{ page.authors[0] }}
{%- elif config.author -%}
{{ config.author }}
{%- else -%}
Unknown
{%- endif -%}
</author>
<link>{{ page.permalink | escape_xml | safe }}</link>
<guid>{{ page.permalink | escape_xml | safe }}</guid>
<description xml:base="{{ page.permalink | escape_xml | safe }}">{{ page.content }}</description>
</item>
{%- endfor %}
</channel>
</rss>

19
templates/header.html Normal file
View File

@ -0,0 +1,19 @@
<div class="relative h-16 inset-x-0 inset-y-0 px-4 shadow-md grid place-items-center">
<div class="flex flex-row items-center w-full">
<!-- The Moxxy logo -->
<a href="{{ get_url(path="@/_index.md") }}">
<img src="{{ get_url(path="img/logo.png") }}" class="w-12 h-12 p-2" />
</a>
<a href="{{ get_url(path="@/_index.md") }}">
<span class="font-bold">Moxxy</span>
</a>
<!-- Spacer -->
<div class="grow"></div>
<a href="/blog/" class="px-2 text-sky-400">Blog</a>
<a href="{{ get_url(path="@/developers.md") }}" class="px-2 text-sky-400">Developers</a>
<a href="{{ config.extra.sourceUrl }}" class="px-2 text-sky-400">Source</a>
</div>
</div>

54
templates/index.html Normal file
View File

@ -0,0 +1,54 @@
{% extends "base.html" %}
{% block content %}
<div class="w-full bg-moxxy-purple p-8 flex flex-row justify-center h-fit">
<div class="lg:w-1/2 grid grid-cols-2 gap-4">
<div class="grid grid-cols-1 place-items-center">
<span class="text-neutral-100 text-2xl text-center">{{ config.extra.heroText }}</span>
</div>
<div class="grid grid-rows-1 place-items-center">
<img class="rounded-md h-64 lg:h-96" src="{{ get_url(path=config.extra.mainScreenshot) }}" />
</div>
</div>
</div>
<div class="w-full p-8">
<div class="flex flex-col items-center">
<div class="flex flex-wrap gap-4">
{% for badge in config.extra.badges %}
<a href="{{ badge.url }}">
<img class="h-24 md:h-16" src="{{ get_url(path=badge.image)}}" />
</a>
{% endfor %}
</div>
</div>
</div>
<div class="w-full p-8">
<div class="flex flex-col items-center">
<div>
<h1 class="text-3xl font-bold pb-4 place-self-start">Features</h1>
<ul class="list-disc px-4">
{% for feature in config.extra.features %}
<li>{{ feature }}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
<div class="w-full p-8">
<div class="flex flex-col items-center">
<div>
<h1 class="text-3xl font-bold pb-4 place-self-start">Screenshots</h1>
<div class="flex flex-nowrap gap-8 overflow-scroll">
{% for screenshot in config.extra.screenshots %}
<img class="h-96 rounded-md" src="{{ get_url(path=screenshot) }}" />
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,15 +1,13 @@
--- {% extends "base.html" %}
layout: default
---
{% block content %}
<div class="w-full md:max-w-prose mt-2 mx-auto"> <div class="w-full md:max-w-prose mt-2 mx-auto">
<div class="px-8"> <div class="px-8">
<h1 class="text-3xl">{{ page.title }}</h1> <h1 class="text-3xl">{{ page.title }}</h1>
<span>Posted by <span class="italic">{{ page.extra.author }}</span> on {{ page.date }}</span>
<span>Posted by <span class="italic">{{ page.author }}</span> on {{ page.date | date: "%d.%m.%Y" }}</span>
<article class="mt-5 prose lg:prose-lg"> <article class="mt-5 prose lg:prose-lg">
{{ page.content }} {{ page.content | safe }}
</article> </article>
</div> </div>
</div> </div>
{% endblock %}