Merge branch 'main' into feat/external-link-indicator

This commit is contained in:
Óscar 2025-02-15 09:30:25 +01:00 committed by GitHub
commit c82e471dde
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
77 changed files with 953 additions and 141 deletions

View file

@ -8,6 +8,10 @@ on:
- synchronize
- ready_for_review
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
pull-requests: read

View file

@ -1,5 +1,4 @@
name: Dependency upgrade
on:
workflow_dispatch:
inputs:
@ -48,6 +47,22 @@ jobs:
git config --global user.name "welpo"
git config --global user.email "welpo@users.noreply.github.com"
- name: Check for existing branch
id: check_branch
run: |
if git ls-remote --heads origin deps/upgrade-${{ matrix.dependency }} | grep -q deps/upgrade-${{ matrix.dependency }}; then
echo "branch_exists=true" >> $GITHUB_OUTPUT
else
echo "branch_exists=false" >> $GITHUB_OUTPUT
fi
- name: Handle existing branch
if: steps.check_branch.outputs.branch_exists == 'true'
run: |
echo "Branch deps/upgrade-${{ matrix.dependency }} already exists."
echo "Skipping upgrade as there's already an open PR"
exit 0
- name: Create and switch to new branch
run: |
git checkout -b deps/upgrade-${{ matrix.dependency }}
@ -69,6 +84,6 @@ jobs:
exit 0
fi
git push -u origin deps/upgrade-${{ matrix.dependency }}
gh pr create --fill --base main --head deps/upgrade-${{ matrix.dependency }}
gh pr create --fill --base main --head deps/upgrade-${{ matrix.dependency }} --label "dependencies"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -11,11 +11,15 @@
<a href="https://github.com/welpo/tabi/releases">
<img src="https://img.shields.io/github/v/release/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="Latest release"></a>
<a href="https://welpo.github.io/tabi/blog/mastering-tabi-settings/">
<img src="https://img.shields.io/website?url=https%3A%2F%2Fwelpo.github.io%2Ftabi&style=flat-square&label=docs&labelColor=202b2d&color=087e96" alt="Documentation"></a>
<img src="https://img.shields.io/website?url=https%3A%2F%2Fwelpo.github.io%2Ftabi&style=flat-square&label=docs&labelColor=202b2d" alt="Documentation"></a>
<a href="https://github.com/welpo/tabi/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/welpo/tabi?style=flat-square&labelColor=202b2d&color=087e96" alt="License"></a>
<a href="https://github.com/welpo/git-sumi">
<img src="https://img.shields.io/badge/clean_commits-git--sumi-0?style=flat-square&labelColor=202b2d&color=087e96" alt="Clean commits"></a>
<a href="https://isitmaintained.com/project/welpo/tabi">
<img src="https://isitmaintained.com/badge/resolution/welpo/tabi.svg" alt="Average time to resolve an issue"></a>
<a href="https://isitmaintained.com/project/welpo/tabi">
<img src="https://isitmaintained.com/badge/open/welpo/tabi.svg" alt="Percentage of issues still open"></a>
</p>
# 🌱 tabi
@ -156,7 +160,7 @@ highlight_theme = "css"
>
> These settings are mutually exclusive and using both may result in no posts being displayed.
1. If you want an introduction section (see screenshot above), add these lines to `content/_index.md`:
6. If you want an introduction section (see screenshot above), add these lines to `content/_index.md`:
```
[extra]
@ -208,13 +212,17 @@ git pull
| [www.richtman.au](https://www.richtman.au) | [Ariel Richtman](https://github.com/arichtman) | Personal tech blog | [Source](https://github.com/arichtman/www.richtman.au) |
| [Ponderosa Games](https://ponderosagames.com/) | John Burak ([JVimes](https://github.com/jvimes)) | A friendly indie game company | &mdash; |
| [jmbhughes.com](https://jmbhughes.com/) | Marcus Hughes ([jmbhughes](https://github.com/jmbhughes)) | Personal blog | [Source](https://github.com/jmbhughes/jmbhughes.github.io) |
| [szabolcs.me](https://szabolcs.me) | Szabolcs Fazekas ([szabolcsf](https://github.com/szabolcsf)) | Personal blog | [Source](https://github.com/szabolcsf/szabolcs.me) |
| [Nizzlay](https://nizzlay.com) | Niels Gouman ([Nizzlay](https://github.com/Nizzlay)) | Personal blog | [Source](https://github.com/Nizzlay/nizzlay.com) |
| [ZzMzaw's blog](https://zzmzaw.github.io/) | ZzMzaw ([ZzMzaw](https://github.com/ZzMzaw)) | Personal blog | [Source](https://github.com/ZzMzaw/zzmzaw.github.io) |
| [idle-ti.me](https://idle-ti.me/) | Jérôme Ramette ([be-next](https://github.com/be-next)) | Personal blog | [Source](https://github.com/be-next/idle-ti.me) |
Using tabi? Feel free to create a PR and add your site to this list.
## Inspiration
This theme was inspired by:
- [shadharon](https://github.com/syedzayyan/shadharon) — tabi started as a fork of [syedzayyan](https://github.com/syedzayyan)'s theme
- [tailwind-nextjs-starter-blog](https://github.com/timlrx/tailwind-nextjs-starter-blog)
- [abridge](https://github.com/Jieiku/abridge)

View file

@ -336,10 +336,14 @@ allowed_domains = [
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
enable_csp = true
# Custom subset of characters for the header.
# If set to true, the `static/custom_subset.css` file will be loaded first.
# This avoids a flashing text issue in Firefox.
# Please see https://welpo.github.io/tabi/blog/custom-font-subset/ to learn how to create this file.
# Font subsetting configuration.
# This feature helps prevent text flashing in Firefox when using custom fonts.
# See: https://welpo.github.io/tabi/blog/custom-font-subset/
# Enable or disable font subsetting completely, both built-in and custom subsets.
enable_subset = true
# Use a custom subset of characters for the header.
# If true, tabi will load the `static/custom_subset.css` file.
# If false, tabi will use the default language-specific subset (English or Spanish).
custom_subset = true
[extra.analytics]

View file

@ -12,4 +12,4 @@ show_projects_first = false
social_media_card = "ca.jpg"
+++
tabi és un tema accessible per a Zola amb [cerca](https://welpo.github.io/tabi/ca/blog/mastering-tabi-settings/#cerca), [suport multilingüe](https://welpo.github.io/tabi/ca/blog/faq-languages/), [JavaScript opcional](https://welpo.github.io/tabi/ca/blog/javascript/), una puntuació perfecta a Lighthouse i [documentació exhaustiva](https://welpo.github.io/tabi/ca). Dissenyat per a llocs web i blogs personals.
tabi és un tema accessible per a Zola amb [cerca](@/blog/mastering-tabi-settings/index.ca.md#cerca), [suport multilingüe](@/blog/faq-languages/index.ca.md), [JavaScript opcional](@/blog/javascript/index.ca.md), una puntuació perfecta a Lighthouse i documentació exhaustiva. Dissenyat per a llocs web i blogs personals.

View file

@ -12,4 +12,4 @@ show_projects_first = false
social_media_card = "es.jpg"
+++
tabi es un tema accesible para [Zola](https://www.getzola.org) con [búsqueda](https://welpo.github.io/tabi/es/blog/mastering-tabi-settings/#busqueda), [soporte multilingüe](https://welpo.github.io/tabi/es/blog/faq-languages/), [JavaScript opcional](https://welpo.github.io/tabi/es/blog/javascript/), una puntuación perfecta en Lighthouse y [documentación exhaustiva](https://welpo.github.io/tabi/es). Diseñado para sitios web y blogs personales.
tabi es un tema accesible para [Zola](https://www.getzola.org) con [búsqueda](@/blog/mastering-tabi-settings/index.es.md#busqueda), [soporte multilingüe](@/blog/faq-languages/index.es.md), [JavaScript opcional](@/blog/javascript/index.es.md), una puntuación perfecta en Lighthouse y documentación exhaustiva. Diseñado para sitios web y blogs personales.

View file

@ -12,4 +12,4 @@ show_projects_first = false
social_media_card = "index.jpg"
+++
tabi is an accessible [Zola](https://www.getzola.org) theme with [search](https://welpo.github.io/tabi/blog/mastering-tabi-settings/#search), [multi-language support](https://welpo.github.io/tabi/blog/faq-languages/), [optional JavaScript](https://welpo.github.io/tabi/blog/javascript/), a perfect Lighthouse score, and [comprehensive documentation](https://welpo.github.io/tabi). Crafted for personal websites and blogs.
tabi is an accessible [Zola](https://www.getzola.org) theme with [search](@/blog/mastering-tabi-settings/index.md#search), [multi-language support](@/blog/faq-languages/index.md), [optional JavaScript](@/blog/javascript/index.md), a perfect Lighthouse score, and comprehensive documentation. Crafted for personal websites and blogs.

View file

@ -1,7 +1,7 @@
+++
title = "Optimitza la càrrega amb un subconjunt de font personalitzat"
date = 2023-04-29
updated = 2023-07-08
updated = 2025-01-12
description = "Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris."
[taxonomies]
@ -21,7 +21,11 @@ Per solucionar això, tabi carrega un subconjunt de glifs per a l'encapçalament
Per defecte, tabi inclou fitxers de subconjunts per a caràcters en anglès i espanyol (amb alguns símbols). Aquests fitxers es carreguen quan la pàgina o el lloc web de Zola està en aquest idioma.
Per a una optimització addicional, pots crear un subconjunt de fonts personalitzat que només inclogui els caràcters utilitzats en el teu encapçalament.
{% admonition(type="tip") %}
Si estàs fent servir una font personalitzada, pots crear el teu propi subconjunt (segueix llegint) o desactivar completament els subconjunts predeterminats amb `enable_subset = false` a `config.toml`.
{% end %}
Per a una optimització addicional, a continuació t'expliquem com crear un subconjunt de fonts personalitzat que només inclogui els caràcters utilitzats en el teu encapçalament.
## Requisits

View file

@ -1,7 +1,7 @@
+++
title = "Optimiza la carga con un subconjunto de fuente personalizado"
date = 2023-04-29
updated = 2023-07-08
updated = 2025-01-12
description = "Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios."
[taxonomies]
@ -21,7 +21,11 @@ Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Da
Por defecto, tabi incluye archivos de subconjuntos para caracteres en inglés y español (con algunos símbolos). Estos archivos se cargan cuando la página o el sitio de Zola está en ese idioma.
Para una optimización adicional, puedes crear un subconjunto de fuentes personalizado que solo incluya los caracteres utilizados en tu encabezado.
{% admonition(type="tip") %}
Si estás usando una fuente personalizada, puedes crear tu propio subconjunto (ver más abajo) o desactivar completamente los subconjuntos predeterminados con `enable_subset = false` en tu `config.toml`.
{% end %}
Para una optimización adicional, a continuación verás cómo crear un subconjunto de fuentes personalizado que solo incluya los caracteres utilizados en tu encabezado.
## Requisitos

View file

@ -1,7 +1,7 @@
+++
title = "Optimise loading times with a custom font subset"
date = 2023-04-29
updated = 2023-07-08
updated = 2025-01-12
description = "Learn how to create a custom subset that only includes the necessary glyphs."
[taxonomies]
@ -21,7 +21,11 @@ To fix this, tabi loads a subset of glyphs for the header. Since this (slightly)
By default, there are subset files for English and Spanish characters (with a few symbols). These files are loaded when the Zola page/site is set to that language.
For further optimisation, you can create a custom font subset that only includes the characters used in your header.
{% admonition(type="tip") %}
If you're using a custom font, either create your custom subset (see below) or disable the built-in subsets completely with `enable_subset = false` in your `config.toml`.
{% end %}
Here's how you can create a custom font subset that only includes the characters used in your header, for maximum efficiency.
## Requirements

View file

@ -1,7 +1,7 @@
+++
title = "Sense JavaScript obligatori"
date = 2023-01-06
updated = 2024-11-16
updated = 2024-12-15
description = "JavaScript només s'utilitza quan HTML i CSS no són suficients."
[taxonomies]
@ -25,7 +25,7 @@ Aquest tema no requereix JavaScript obligatori. Opcionalment, pot carregar una q
Les següents opcions es poden especificar per a publicacions, seccions i globalment, seguint la jerarquia de `pàgina > secció > config.toml`:
- [**Suport de KaTeX**](@/blog/markdown/index.ca.md#katex). Habilitat configurant `katex = true` (274 KB).
- [**Suport de KaTeX**](@/blog/markdown/index.ca.md#katex). Habilitat configurant `katex = true` (274 KB). Per renderitzar fórmules sense JS, prova [MathML](https://developer.mozilla.org/docs/Web/MathML/).
- [**Diagrames de Mermaid**](@/blog/shortcodes/index.ca.md#diagrames-de-mermaid). Habilitat configurant `mermaid = true` (~2.5 MB).
- [**Còpia de blocs de codi amb un sol clic**](@/blog/markdown/index.ca.md#bloc-de-codi). Habilitada configurant `copy_button = true`. (~700 bytes)
- [**Mostrar ruta/URL a blocs de codi**](@/blog/shortcodes/index.ca.md#mostrar-ruta-o-url). S'activa configurant `add_src_to_code_block = true`. (~400 bytes)

View file

@ -1,7 +1,7 @@
+++
title = "Sin JavaScript obligatorio"
date = 2023-01-06
updated = 2024-11-16
updated = 2024-12-15
description = "JavaScript solo se utiliza cuando HTML y CSS no son suficientes."
[taxonomies]
@ -25,7 +25,7 @@ Este tema no requiere JavaScript de manera obligatoria. Opcionalmente, puede car
Las siguientes opciones pueden especificarse para publicaciones, secciones y a nivel global, siguiendo la jerarquía de `página > sección > config.toml`:
- [**Soporte de KaTeX**](@/blog/markdown/index.es.md#katex). Habilitado al configurar `katex = true` (274 KB).
- [**Soporte de KaTeX**](@/blog/markdown/index.es.md#katex). Habilitado al configurar `katex = true` (274 KB). Para renderizar fórmulas sin JS, prueba [MathML](https://developer.mozilla.org/docs/Web/MathML/).
- [**Diagramas de Mermaid**](@/blog/shortcodes/index.es.md#diagramas-de-mermaid). Habilitado al configurar `mermaid = true` (~2.5 MB).
- [**Copia de bloques de código con un solo clic**](@/blog/markdown/index.es.md#bloque-de-codigo). Habilitado al configurar `copy_button = true` (~700 bytes).
- [**Mostrar ruta/URL en bloques de código**](@/blog/shortcodes/index.es.md#mostrar-ruta-o-url). Se activa configurando `add_src_to_code_block = true`. (~400 bytes)

View file

@ -1,7 +1,7 @@
+++
title = "No mandatory JavaScript"
date = 2023-01-06
updated = 2024-11-16
updated = 2024-12-15
description = "JavaScript is only used when HTML and CSS aren't enough."
[taxonomies]
@ -25,7 +25,7 @@ This theme has no mandatory JavaScript. Optionally, it can load a minimal amount
The following settings can be specified for posts, sections and globally, following the hierarchy of `page > section > config.toml`:
- [**KaTeX support**](@/blog/markdown/index.md#katex). Enabled by setting `katex = true` (274 KB).
- [**KaTeX support**](@/blog/markdown/index.md#katex). Enabled by setting `katex = true` (274 KB). To render math without JS, check out [MathML](https://developer.mozilla.org/docs/Web/MathML/).
- [**Mermaid diagrams**](@/blog/shortcodes/index.md#mermaid-diagrams). Enabled by setting `mermaid = true` (~2.5 MB).
- [**One-click copy of code blocks**](@/blog/markdown/index.md#code-block). Enabled by setting `copy_button = true`. (~700 bytes)
- [**Showing source (path or URL) in code blocks**](@/blog/shortcodes/index.md#show-source-or-path). Enabled by setting `add_src_to_code_block = true`. (~300 bytes)

View file

@ -172,13 +172,16 @@ pinned = true
{{ admonition(type="warning", text='Quan s'utilitza la paginació (`paginate_by`), les entrades fixades poden aparèixer dues vegades: una vegada a la part superior de la primera pàgina, i una altra en la seva posició cronològica normal en pàgines posteriors.') }}
##### Mostrar la data dels articles al llistat
Per defecte, quan es llisten els articles, es mostra la data de creació. Pots configurar quina(es) data(es) mostrar utilitzant l'opció `post_listing_date`. Configuracions disponibles:
- `date`: Mostra només la data de publicació original de l'article (opció per defecte).
- `updated`: Mostra només la data de l'última actualització de l'article. Si no hi ha data d'actualització, es mostra la data de publicació original.
- `both`: Mostra tant la data de publicació original com la data de l'última actualització.
{% admonition(type="tip") %}
Aquesta configuració segueix la jerarquia: pots establir un valor global a `config.toml` o canviar-lo per a seccions específiques al seu arxiu `_index.md`. En ambdós casos, afegeix-lo a la secció `[extra]`.
{% end %}
#### Llistat de Projectes
Pots mostrar una selecció de projectes a la teva pàgina principal. Per fer això, primer necessitaràs configurar el directori `projects`.
@ -304,11 +307,11 @@ Si configures `tag_sorting = "frequency"`, s'ordenaran segons el nombre de publi
---
### Sèries
## Sèries
Per a una explicació detallada, consulta la [documentació de sèries](@/blog/series/index.ca.md).
#### Enllaç per saltar a les publicacions
### Enllaç per saltar a les publicacions
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
@ -320,7 +323,7 @@ Per defecte, apareix automàticament un enllaç "Salta a les publicacions" al co
Estableix `show_jump_to_posts = true` per forçar l'activació de la funció i `show_jump_to_posts = false` per desactivar-la.
#### Indexació de pàgines de sèries
### Indexació de pàgines de sèries
| Pàgina | Secció | `config.toml` | Segueix la jerarquia | Requereix JavaScript |
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
@ -457,10 +460,14 @@ Per defecte, l'arxiu llistarà les publicacions situades a `blog/`. Per personal
section_path = ["blog/", "notes/", "camí-tres/"]
```
**Nota**:
L'arxiu mostra les publicacions en ordre cronològic invers (les més recents primer). Pots invertir aquest ordre establint `archive_reverse = true` a la secció `[extra]`:
- La pàgina d'arxiu només llistarà publicacions amb data.
- L'ordre de les publicacions ve determinada per la variable `sort_by` de les seccions arxivades. Aquesta demo utilitza `sort_by = "date"` en `blog/_index.md`.
```toml
[extra]
archive_reverse = true # mostra les publicacions més antigues primer
```
{{ admonition(type="note", title="nota" text="La pàgina d'arxiu només llistarà publicacions que tinguin data al seu encapçalament.") }}
### Etiquetes
@ -509,6 +516,17 @@ path = "about"
Fixa't com s'estableix `path = "about"`. Zola situarà la pàgina a `$base_url/about/`. Si vols que la pàgina estigui disponible a `/contacte/`, hauries d'establir `path = "contacte"`.
La plantilla `info-page.html` també es pot utilitzar per crear landing pages a la ruta arrel (`"/"`). Per fer-ho, l'arxiu `content/_index.md` hauria de ser així:
```markdown
+++
title = "Títol de la pàgina"
template = "info-page.html"
+++
Contingut amb Markdown.
```
---
## SEO
@ -595,7 +613,9 @@ fediverse_creator = { handle = "username", domain = "example.com" }
|:------:|:------:|:-------------:|:---------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
La barra de navegació és la franja a la part superior de la pàgina que conté el títol del lloc i el menú de navegació. Pots personalitzar els elements que apareixen configurant `menu` en `config.toml`. Per exemple:
La barra de navegació és la franja a la part superior de la pàgina que conté el títol del lloc i el menú de navegació. Pots personalitzar els elements que apareixen configurant `menu` en `config.toml`.
Soporta links relatius per a pàgines internes i links absoluts per a enllaços externs. Per exemple:
```toml
menu = [
@ -604,6 +624,7 @@ menu = [
{ name = "etiquetes", url = "tags", trailing_slash = true },
{ name = "projectes", url = "projects", trailing_slash = true },
{ name = "sobre nosaltres", url = "about", trailing_slash = true },
{ name = "github", url = "https://github.com/welpo/tabi", trailing_slash = false },
]
```
@ -718,10 +739,12 @@ Consulta la [documentació de Mermaid](@/blog/shortcodes/index.ca.md#diagrames-d
|:------:|:------:|:-------------:|:------------------:|:--------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
Les tipus de lletra personalitzades causen parpalleig del text en Firefox. Per resoldre això, tabi carrega un subconjunt de glifs per a la capçalera. Donat que això (lleugerament) augmenta el temps de càrrega inicial, és una bona idea intentar minimitzar la mida d'aquest subconjunt.
Les tipus de lletra personalitzades causen parpalleig del text en Firefox. Per resoldre això, tabi carrega un subconjunt de glifs per a la capçalera. Donat que això (lleugerament) augmenta el temps de càrrega inicial, és una bona idea intentar minimitzar la mida d'aquest subconjunt, o desactivar-lo completament si no estàs fent servir un tipus de lletra personalitzat al teu tema.
Pots crear un subconjunt personalitzat adaptat al teu lloc, guardar-lo com a `static/custom_subset.css`, i fer que es carregui amb `custom_subset = true`.
Per desactivar el subconjunt, utilitza `enable_subset = false`.
Per obtenir més informació, incloent instruccions sobre com crear un subconjunt personalitzat, consulta la [documentació](@/blog/custom-font-subset/index.ca.md).
### Contingut complet al feed

View file

@ -179,6 +179,10 @@ Por defecto, cuando se listan los artículos, se muestra la fecha de creación.
- `updated`: Muestra solo la fecha de la última actualización del artículo. Si no hay fecha de actualización, muestra la fecha de publicación original.
- `both`: Muestra tanto la fecha de publicación original como la fecha de la última actualización.
{% admonition(type="tip") %}
Esta configuración sigue la jerarquía: puedes establecer un valor global en `config.toml` o configurarlo para secciones específicas en su archivo `_index.md`. En ambos casos, añádelo a la sección `[extra]`.
{% end %}
#### Listado de proyectos
Puedes mostrar una selección de proyectos en tu página principal. Para hacer esto, primero necesitarás configurar el directorio `projects`.
@ -304,11 +308,11 @@ Si configuras `tag_sorting = "frequency"`, se ordenarán según el número de pu
---
### Series
## Series
Para una explicación detallada, consulta la [documentación de series](@/blog/series/index.es.md).
#### Enlace para saltar a las publicaciones
### Enlace para saltar a las publicaciones
| Página | Sección | `config.toml` | Sigue jerarquía | Requiere JavaScript |
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
@ -320,7 +324,7 @@ Por defecto, aparece automáticamente un enlace "Saltar a publicaciones" junto a
Establece `show_jump_to_posts = true` para forzar la activación de la función y `show_jump_to_posts = false` para desactivarla.
#### Indexación de páginas de series
### Indexación de páginas de series
| Página | Sección | `config.toml` | Sigue la jerarquía | Requiere JavaScript |
|:------:|:-------:|:-------------:|:------------------:|:-------------------:|
@ -457,10 +461,14 @@ Por defecto, el archivo mostrará las publicaciones ubicadas en `blog/`. Para pe
section_path = ["blog/", "notas/", "ruta-tres/"]
```
**Nota**:
El archivo muestra las publicaciones en orden cronológico inverso (las más recientes primero). Puedes invertir este orden estableciendo `archive_reverse = true` en la sección `[extra]`:
- La página de Archivo sólo listará publicaciones con fecha.
- El orden las publicaciones viene determinada por la variable `sort_by` de las secciones archivadas. Esta demo utiliza `sort_by = "date"` en `blog/_index.md`.
```toml
[extra]
archive_reverse = true # muestra las publicaciones más antiguas primero
```
{{ admonition(type="note", title="nota" text="La página de Archivo sólo listará publicaciones que tengan fecha en su encabezado.") }}
### Etiquetas
@ -509,6 +517,17 @@ path = "about"
Fíjate cómo se establece `path = "about"`. Zola colocará la página en `$base_url/about/`. Si deseas que la página esté disponible en `/contacto/`, tendrías que establecer `path = "contacto"`.
La plantilla `info-page.html` también se puede utilizar para crear lading pages en la ruta raíz (`"/"`). Para hacerlo, el archivo `content/_index.md` debería verse así:
```markdown
+++
title = "Título de la página"
template = "info-page.html"
+++
Contenido con Markdown.
```
---
## SEO
@ -595,7 +614,9 @@ fediverse_creator = { handle = "username", domain = "example.com" }
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
La barra de navegación es la barra en la parte superior de la página que contiene el título del sitio y el menú de navegación. Puedes personalizar los elementos que aparecen configurando `menu` en `config.toml`. Por ejemplo:
La barra de navegación es la barra en la parte superior de la página que contiene el título del sitio y el menú de navegación. Puedes personalizar los elementos que aparecen configurando `menu` en `config.toml`.
Soporta links relativos para páginas internas y links absolutos para enlaces externos. Por ejemplo:
```toml
menu = [
@ -604,6 +625,7 @@ menu = [
{ name = "etiquetas", url = "tags", trailing_slash = true },
{ name = "proyectos", url = "projects", trailing_slash = true },
{ name = "acerca de", url = "about", trailing_slash = true },
{ name = "github", url = "https://github.com/welpo/tabi", trailing_slash = false },
]
```
@ -718,10 +740,12 @@ Consulta la [documentación de Mermaid](@/blog/shortcodes/index.es.md#diagramas-
|:------:|:-------:|:-------------:|:---------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
Las fuentes personalizadas causan parpadeo del texto en Firefox. Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Dado que esto (ligeramente) aumenta el tiempo de carga inicial, es una buena idea intentar minimizar el tamaño de este subconjunto.
Las fuentes personalizadas causan parpadeo del texto en Firefox. Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Dado que esto (ligeramente) aumenta el tiempo de carga inicial, es una buena idea intentar minimizar el tamaño de este subconjunto, o desactivarlo por completo si no estás usando una fuente personalizada en tu tema.
Puedes crear un subconjunto personalizado adaptado a tu sitio, guardarlo como `static/custom_subset.css`, y hacer que se cargue con `custom_subset = true`.
Para desactivar el subconjunto, puedes usar `enable_subset = false`.
Para obtener más información, incluyendo instrucciones sobre cómo crear un subconjunto personalizado, consulta la [documentación](@/blog/custom-font-subset/index.es.md).
### Contenido completo en el feed

View file

@ -183,6 +183,10 @@ By default, when listing posts, the date of post creation is shown. You can conf
post_listing_date = "date"
```
{% admonition(type="tip") %}
This setting follows the hierarchy: you can set a global value in `config.toml` or override it for specific sections in their `_index.md` file. In both cases, add it to the `[extra]` section.
{% end %}
#### Listing Projects
You can showcase a selection of projects on your main page. To do this, you'll need to set up the `projects` directory first.
@ -309,11 +313,11 @@ Setting `tag_sorting = "frequency"` will sort them by number-of-posts (descendin
---
### Series
## Series
For a detailed explanation of the series feature, see the [series documentation](@/blog/series/index.md).
#### Jump to posts link
### Jump to posts link
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
@ -325,7 +329,7 @@ By default, a "Jump to posts" link automatically appears next to the series titl
Set `show_jump_to_posts = true` to force the feature on and `show_jump_to_posts = false` to force it off.
#### Series pages indexation
### Series pages indexation
| Page | Section | `config.toml` | Follows Hierarchy | Requires JavaScript |
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
@ -462,10 +466,14 @@ By default, the archive will list posts located in `blog/`. To customise this, y
section_path = ["blog/", "notes/", "path-three/"]
```
**Notes**:
The archive displays posts in reverse chronological order (newest first). You can reverse this order by setting `archive_reverse = true` in the `[extra]` section:
- the Archive page will only list posts that have a date in their front matter.
- Post sorting is determined by the `sort_by` variable of the sections you are archiving. This demo uses `sort_by = "date"` set in the `blog/_index.md`.
```toml
[extra]
archive_reverse = true # displays oldest posts first.
```
{{ admonition(type="note", text="The Archive page will only list posts that have a date in their front matter.") }}
### Tags
@ -514,6 +522,17 @@ path = "about"
Notice how the `path` is set to `about`. Zola will place the page at `$base_url/about/`. If you'd like to have the page available at `/contact/`, you'd set `path = "contact"`.
The `info-page.html` template can also be used to create landing pages at the path root (`"/"`). To do that, the `content/_index.md` file should look like this:
```markdown
+++
title = "Landing Page Title"
template = "info-page.html"
+++
Place your landing page Markdown content here.
```
---
## SEO
@ -602,7 +621,9 @@ This adds metadata to your HTML, allowing Mastodon to display the author's fediv
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
The navigation bar is the bar at the top of the page that contains the site title and the navigation menu. You can customise which items appear by setting `menu` in `config.toml`. For example:
The navigation bar is the bar at the top of the page that contains the site title and the navigation menu. You can customise which items appear by setting `menu` in `config.toml`.
The menu supports both relative URLs for internal pages and absolute URLs for external links. For example:
```toml
menu = [
@ -611,6 +632,7 @@ menu = [
{ name = "tags", url = "tags", trailing_slash = true },
{ name = "projects", url = "projects", trailing_slash = true },
{ name = "about", url = "about", trailing_slash = true },
{ name = "github", url = "https://github.com/welpo/tabi", trailing_slash = false },
]
```
@ -728,9 +750,9 @@ See the [Mermaid documentation](@/blog/shortcodes/index.md#mermaid-diagrams) for
|:----:|:-------:|:-------------:|:-----------------:|:-------------------:|
| ❌ | ❌ | ✅ | ❌ | ❌ |
Custom fonts cause flashing text in Firefox. To amend this, tabi loads a subset of glyphs for the header. Since this (slightly) increases the initial load time, it's a good idea to try and minimise the size of this subset.
Custom fonts cause flashing text in Firefox. To amend this, tabi loads a subset of glyphs for the header. Since this (slightly) increases the initial load time, it's a good idea to try and minimise the size of this subset, or disable it completely if you're not using a custom font in your skin.
You can create a custom subset tailored to your site, save it as `static/custom_subset.css`, and have it load with `custom_subset = true`.
You can create a custom subset tailored to your site, save it as `static/custom_subset.css`, and have it load with `custom_subset = true`. Disabling the subset can be done with `enable_subset = false`.
For more information, including instructions on how to create a custom subset, see the [docs](@/blog/custom-font-subset/index.md).

View file

@ -1,7 +1,7 @@
+++
title = "Shortcodes personalitzats"
date = 2023-02-19
updated = 2024-11-27
updated = 2024-12-28
description = "Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran."
[taxonomies]
@ -216,6 +216,38 @@ dist/
## Shortcodes de text
### Aside (nota al marge)
Afegeix contingut complementari als marges en pantalles amples, o com a blocs distintius en mòbil.
{{ aside(text="*Nota al marge* ve de *nota* (del llatí, 'marca' o 'senyal') i *marge* (del llatí *margo*, 'vora' o 'límit').") }}
El shortcode accepta dos paràmetres:
- `position`: Establir com a `"right"` per col·locar al marge dret (per defecte, esquerre)
- El contingut es pot proporcionar mitjançant el paràmetre `text` o entre les etiquetes del shortcode
#### Ús
{{ admonition(type="warning", text="Separa la definició de la nota del shortcode amb dues línies en blanc per evitar errors de renderització.") }}
Fent servir el paràmetre `text`:
```
{{/* aside(text="*Nota al marge* ve de *nota* (del llatí, 'marca' o 'senyal') i *marge* (del llatí *margo*, 'vora' o 'límit').") */}}
```
Fent servir el cos del contingut i indicant la posició a la dreta:
```
{%/* aside(position="right") */%}
Una nota més llarga que
pot ocupar diverses línies.
S'admet *Markdown*.
{%/* end */%}
```
### Text remot
Afegeix text des d'una URL remota o un arxiu local.

View file

@ -1,7 +1,7 @@
+++
title = "Shortcodes personalizados"
date = 2023-02-19
updated = 2024-11-27
updated = 2024-12-28
description = "Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más."
[taxonomies]
@ -215,6 +215,38 @@ dist/
## Shortcodes de texto
### Aside (nota al margen)
Añade contenido complementario en los márgenes en pantallas anchas, o como bloques distintivos en móvil.
{{ aside(text="*Nota al margen* viene de *nota* (del latín, 'marca' o 'señal') y *margen* (del latín *margo*, 'borde' o 'límite').") }}
El shortcode acepta dos parámetros:
- `position`: Establecer como `"right"` para colocar en el margen derecho (por defecto, izquierdo)
- El contenido puede proporcionarse mediante el parámetro `text` o entre las etiquetas del shortcode
#### Uso
{{ admonition(type="warning", text="Separa la llamada al shortcode con saltos de línea para evitar errores de renderizado.") }}
Usando el parámetro `text`:
```
{{/* aside(text="*Nota al margen* viene de *nota* (del latín, 'marca' o 'señal') y *margen* (del latín *margo*, 'borde' o 'límite').") */}}
```
Usando el cuerpo del contenido e indicando la posición:
```
{%/* aside(position="right") */%}
Una nota más larga que
puede ocupar varias líneas.
Se admite *Markdown*.
{%/* end */%}
```
### Texto remoto
Añade texto desde una URL remota o un archivo local.

View file

@ -1,7 +1,7 @@
+++
title = "Custom shortcodes"
date = 2023-02-19
updated = 2024-11-27
updated = 2024-12-28
description = "This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered."
[taxonomies]
@ -216,6 +216,38 @@ dist/
## Text shortcodes
### Aside (side/margin note)
Add supplementary content in the margins on wide screens, or as distinct blocks on mobile.
{{ aside(text="*Sidenote* comes from Latin *nota* ('mark') + Old English *síde* ('side').") }}
The shortcode accepts two parameters:
- `position`: Set to `"right"` to place in right margin (defaults to left)
- Content can be provided via `text` parameter or between shortcode tags
#### Usage
{{ admonition(type="warning", text="Place the aside shortcode on its own line to prevent formatting issues.") }}
Using the `text` parameter:
```
{{/* aside(text="*Sidenote* comes from Latin *nota* ('mark') + Old English *síde* ('side').") */}}
```
Using the content body and setting the position to right:
```
{%/* aside(position="right") */%}
A longer note that
can span multiple lines.
*Markdown* is supported.
{%/* end */%}
```
### Remote text
Embed text from a remote URL or a local file. To display the path or URL on the code block, see the [show source or path shortcode](#show-source-or-path).

View file

@ -0,0 +1,35 @@
+++
title = "nemui"
description = "Ajusta gradualment el teu horari de son amb suport per horari d'estiu."
weight = 22
[taxonomies]
tags = ["son", "interactiu", "web app", "web", "JavaScript"]
[extra]
local_image = "projects/nemui/nemui_logo.webp"
canonical_url = "https://osc.garden/ca/projects/tabi/"
social_media_card = "social_cards/projects_nemui.jpg"
+++
nemui és una aplicació web que t'ajuda a fer una transició suau a un nou horari de son. El seu nom ve de les paraules japoneses per dormir (<ruby><rt>nemu</rt></ruby>) i transició (<ruby><rt>i</rt></ruby>), que es llegeix com <ruby>眠い<rt>nemui</rt></ruby> (somnolent).
#### [Prova-la ara](https://nemui.osc.garden) • [GitHub](https://github.com/welpo/nemui) • [Blog](https://osc.garden/ca/blog/nemui-sleep-schedule-planner/) {.centered-text}
## Característiques
- Interfície interactiva de rellotge inspirada en Apple
- Ajust gradual de l'horari de son basat en la ciència del son
- Suport complet per a l'horari d'estiu (DST)
- Exportació a calendari (.ics) amb recordatoris per anar a dormir
- Emmagatzematge local per seguir el teu progrés
- Accessible: compatible amb navegació per teclat i lectors de pantalla
## Per què nemui?
A diferència dels canvis bruscos que poden alterar el teu ritme circadià, nemui t'ajuda a ajustar el teu horari de son de manera gradual. És especialment útil per a:
- Adaptar-te a nous horaris de feina/estudi
- Preparar-te per a canvis de zona horària
- Fer una transició suau durant els canvis d'hora
- Corregir un horari de son desajustat

View file

@ -0,0 +1,35 @@
+++
title = "nemui"
description = "Ajusta gradualmente tu horario de sueño con soporte para horario de verano."
weight = 32
[taxonomies]
tags = ["sueño", "interactivo", "web app", "web", "JavaScript"]
[extra]
local_image = "projects/nemui/nemui_logo.webp"
canonical_url = "https://osc.garden/es/projects/tabi/"
social_media_card = "social_cards/projects_nemui.jpg"
+++
nemui es una aplicación web que te ayuda a hacer una transición suave a un nuevo horario de sueño. Su nombre viene de las palabras japonesas para dormir (<ruby><rt>nemu</rt></ruby>) y transición (<ruby><rt>i</rt></ruby>), que se lee como <ruby>眠い<rt>nemui</rt></ruby> (somnoliento).
#### [Pruébala ahora](https://nemui.osc.garden) • [GitHub](https://github.com/welpo/nemui) • [Blog](https://osc.garden/es/blog/nemui-sleep-schedule-planner/) {.centered-text}
## Características
- Interfaz interactiva de reloj inspirada en Apple
- Ajuste gradual del horario de sueño basado en la ciencia del sueño
- Soporte completo para el horario de verano (DST)
- Exportación a calendario (.ics) con recordatorios para dormir
- Almacenamiento local para seguir tu progreso
- Accesible: compatible con navegación por teclado y lectores de pantalla
## ¿Por qué nemui?
A diferencia de los cambios bruscos que pueden alterar tu ritmo circadiano, nemui te ayuda a ajustar tu horario de sueño de forma gradual. Es especialmente útil para:
- Adaptarte a nuevos horarios de trabajo/estudio
- Prepararte para cambios de zona horaria
- Hacer una transición suave durante los cambios de hora
- Corregir un horario de sueño desajustado

View file

@ -0,0 +1,35 @@
+++
title = "nemui"
description = "Gradually adjust your sleep schedule with support for DST transitions."
weight = 32
[taxonomies]
tags = ["sleep", "interactive", "web app", "web", "JavaScript"]
[extra]
local_image = "projects/nemui/nemui_logo.webp"
canonical_url = "https://osc.garden/projects/tabi/"
social_media_card = "social_cards/projects_nemui.jpg"
+++
nemui is a web app that helps you smoothly transition to a new sleep schedule. Named after the Japanese words for sleep (<ruby><rt>nemu</rt></ruby>) and transition (<ruby><rt>i</rt></ruby>), reading as <ruby>眠い<rt>nemui</rt></ruby> (sleepy).
#### [Try it now](https://nemui.osc.garden) • [GitHub](https://github.com/welpo/nemui) • [Blog post](https://osc.garden/blog/nemui-sleep-schedule-planner/) {.centered-text}
## Features
- Interactive clock interface inspired by Apple
- Gradual sleep schedule adjustment based on sleep science
- Full Daylight Saving Time (DST) support
- Calendar (.ics) export with bedtime reminders
- Local storage for progress tracking
- Accessible: supports keyboard navigation and screen readers
## Why nemui?
Unlike abrupt changes that can disrupt your circadian rhythm, nemui helps you adjust your sleep schedule gradually. It's particularly useful for:
- Adapting to new work/study schedules
- Preparing for timezone changes
- Smoothly transitioning through DST changes
- Fixing a misaligned sleep schedule

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

View file

@ -1,7 +1,7 @@
+++
title = "ラム (ramu)"
title = "ramu"
description = "Una aplicació web per practicar la lectura i comprensió auditiva de nombres en japonès."
weight = 30
weight = 35
[taxonomies]
tags = ["Japonès", "interactiu", "web app", "web", "PWA", "JavaScript"]

View file

@ -1,7 +1,7 @@
+++
title = "ラム (ramu)"
title = "ramu"
description = "Una aplicación web para practicar la lectura y comprensión auditiva de números en japonés."
weight = 30
weight = 35
[taxonomies]
tags = ["Japonés", "interactivo", "web app", "web", "PWA", "JavaScript"]

View file

@ -1,7 +1,7 @@
+++
title = "ラム (ramu)"
title = "ramu"
description = "A web app to practice reading and listening to Japanese numbers."
weight = 30
weight = 35
[taxonomies]
tags = ["Japanese", "interactive", "web app", "web", "PWA", "JavaScript"]

View file

@ -0,0 +1,48 @@
+++
title = "shuku"
description = "Condensa pel·lícules i sèries per quedar-te només amb el diàleg. Dissenyat per aprendre idiomes."
weight = 20
[taxonomies]
tags = ["Python", "media", "linguistics", "CLI"]
[extra]
local_image = "projects/shuku/shuku_logo.webp"
social_media_card = "social_cards/projects_shuku.jpg"
canonical_url = "https://osc.garden/ca/projects/shuku/"
+++
**shuku** (<ruby><rb></rb><rt>しゅく</rt></ruby><ruby><rb></rb><rt>しょう</rt></ruby>: «minificació») crea versions condensades de pel·lícules i sèries conservant només els diàlegs.
<video class="invertible-image" controls muted width="800" loop="true" autoplay="autoplay" title="demo de shuku" src="https://cdn.jsdelivr.net/gh/welpo/shuku/assets/animation_demo/shuku_demo.mov"></video>
#### [GitHub](https://github.com/welpo/shuku) • [Blog](https://osc.garden/ca/blog/shuku-condensed-media-language-learning/) • [Documentació](https://github.com/welpo/shuku#readme) • [PyPI](https://pypi.org/project/shuku/) {.centered-text}
## Característiques
### Gestió intel·ligent de continguts
- Detecció i correspondència automàtica de subtítols amb cerca difusa (fuzzy matching)
- Selecció intel·ligent de pistes d'àudio/subtítols
- Extracció de metadades (títol, temporada, número d'episodi)
### Output flexible
- Àudio condensat (MP3, FLAC, AAC, Opus…)
- Vídeo condensat
- Subtítols sincronitzats (SRT, ASS, o LRC per a apps tipus karaoke)
### Alta personalització
- Qualitat i còdecs d'àudio/vídeo configurables
- Ajust de temps de subtítols i farciment
- Filtra subtítols (efectes de so, lletres, capítols específics)
- Suport per a arguments personalitzats de FFmpeg
### Experiència de l'usuari
- Multiplataforma: GNU+Linux, macOS i Windows
- Logging detallat amb indicadors de progrés
- Suport per a processament per lots
[![targeta social de shuku](/img/social_cards/projects_shuku.jpg)](https://github.com/welpo/shuku)

View file

@ -0,0 +1,48 @@
+++
title = "shuku"
description = "Condensa películas y series para quedarte solo con el diálogo. Diseñado para aprender idiomas."
weight = 20
[taxonomies]
tags = ["Python", "media", "linguistics", "CLI"]
[extra]
local_image = "projects/shuku/shuku_logo.webp"
social_media_card = "social_cards/projects_shuku.jpg"
canonical_url = "https://osc.garden/es/projects/shuku/"
+++
**shuku** (<ruby><rb></rb><rt>しゅく</rt></ruby><ruby><rb></rb><rt>しょう</rt></ruby>: «minificación») crea versiones condensadas de películas y series conservando solo los diálogos.
<video class="invertible-image" controls muted width="800" loop="true" autoplay="autoplay" title="demo de shuku" src="https://cdn.jsdelivr.net/gh/welpo/shuku/assets/animation_demo/shuku_demo.mov"></video>
#### [GitHub](https://github.com/welpo/shuku) • [Blog](https://osc.garden/es/blog/shuku-condensed-media-language-learning/) • [Documentación](https://github.com/welpo/shuku#readme) • [PyPI](https://pypi.org/project/shuku/) {.centered-text}
## Características
### Manejo inteligente de medios
- Detección y correspondencia automática de subtítulos con búsqueda difusa (fuzzy matching)
- Selección inteligente de pistas de audio/subtítulos
- Extracción de metadatos (título, temporada, número de episodio)
### Output flexible
- Audio condensado (MP3, FLAC, AAC, Opus…)
- Video condensado
- Subtítulos sincronizados (SRT, ASS, o LRC para apps tipo karaoke)
### Alta personalización
- Calidad y códecs de audio/video configurables
- Ajuste de tiempo de subtítulos y relleno
- Filtra subtítulos (efectos de sonido, letras, capítulos específicos)
- Soporte para argumentos personalizados de FFmpeg
### Experiencia del usuario
- Multiplataforma: GNU+Linux, macOS y Windows
- Logging detallado con indicadores de progreso
- Soporte para procesamiento por lotes
[![tarjeta social de shuku](/img/social_cards/projects_shuku.jpg)](https://github.com/welpo/shuku)

View file

@ -0,0 +1,56 @@
+++
title = "shuku"
description = "Shrink media to keep only the dialogue. For immersion language learning."
weight = 20
[taxonomies]
tags = ["Python", "media", "linguistics", "CLI"]
[extra]
local_image = "projects/shuku/shuku_logo.webp"
social_media_card = "social_cards/projects_shuku.jpg"
canonical_url = "https://osc.garden/projects/shuku/"
+++
**shuku** (<ruby><rb></rb><rt>しゅく</rt></ruby><ruby><rb></rb><rt>しょう</rt></ruby>: "minification") creates condensed versions of films and TV shows by keeping only the dialogue.
<video class="invertible-image" controls muted width="800" loop="true" autoplay="autoplay" title="shuku demo" src="https://cdn.jsdelivr.net/gh/welpo/shuku/assets/animation_demo/shuku_demo.mov"></video>
#### [GitHub](https://github.com/welpo/shuku) • [Blog post](https://osc.garden/blog/shuku-condensed-media-language-learning/) • [Documentation](https://github.com/welpo/shuku#readme) • [PyPI](https://pypi.org/project/shuku/) {.centered-text}
## Features
### Smart media handling
- Automatic subtitle detection and matching with fuzzy search
- Intelligent audio/subtitle track selection
- Metadata extraction (title, season, episode number)
### Flexible output
- Condensed audio (MP3, FLAC, AAC, Opus...)
- Condensed video
- Synchronized subtitles (including LRC for karaoke-style review)
- Clean filenames in output
### High customization
- Configurable audio/video quality and codecs
- Subtitle timing adjustment and padding
- Skip unwanted content (sound effects, lyrics, specific chapters)
- Custom FFmpeg arguments support
### User experience
- Cross-platform: GNU+Linux, macOS, and Windows
- Detailed logging with progress indicators
- Batch processing support
## Development best practices
- Comprehensive testing: 100% code coverage
- Clean code: Type-hinted Python with clear responsibilities
- Continuous Integration/Deployment
- Comprehensive documentation
[![shuku social media card](/img/social_cards/projects_shuku.jpg)](https://github.com/welpo/shuku)

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View file

@ -4,7 +4,7 @@ description = "Una eina per calcular els royalties de streaming per a músics."
weight = 45
[taxonomies]
tags = ["música", "web app", "web", "JavaScript", "anàlisi de dades"]
tags = ["música", "interactiu", "web app", "web", "JavaScript", "anàlisi de dades"]
[extra]
local_image = "projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp"

View file

@ -4,7 +4,7 @@ description = "Una herramienta para calcular los royalties de streaming para mú
weight = 45
[taxonomies]
tags = ["música", "web app", "web", "JavaScript", "análisis de datos"]
tags = ["música", "interactivo", "web app", "web", "JavaScript", "análisis de datos"]
[extra]
local_image = "projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp"

View file

@ -4,7 +4,7 @@ description = "A tool to calculate streaming royalties for musicians."
weight = 45
[taxonomies]
tags = ["music", "web app", "web", "JavaScript", "data analysis"]
tags = ["music", "interactive", "web app", "web", "JavaScript", "data analysis"]
[extra]
local_image = "projects/streaming-royalties-calculator/streaming-royalties-calculator_logo.webp"

View file

@ -0,0 +1,51 @@
+++
title = "zutsu"
description = "Una aplicació minimalista i privada de gestió de tasques."
weight = 32
[taxonomies]
tags = ["interactiu", "productivitat", "web app", "web", "JavaScript"]
[extra]
local_image = "projects/zutsu/zutsu_logo.webp"
canonical_url = "https://osc.garden/ca/projects/zutsu/"
social_media_card = "social_cards/projects_zutsu.jpg"
+++
{% wide_container() %}
<video controls src="https://cdn.jsdelivr.net/gh/welpo/zutsu/assets/ずつ_demo.mov" title="demostració de zutsu"></video>
{% end %}
#### [Prova-la ara](https://zutsu.osc.garden) • [GitHub](https://github.com/welpo/zutsu) • [Article](https://osc.garden/ca/blog/zutsu-offline-task-planner-web-app/) {.centered-text}
<ruby><rt>zu</rt><rt>tsu</rt></ruby> és una aplicació web de gestió de tasques dissenyada per ajudar-te a centrar-te en una tasca cada vegada. El nom ve de <ruby>一つ<rt>hitotsu</rt>ずつ<rt>zutsu</rt></ruby>, que significa «d'un en un» en <ruby>日本語<rt>japonès</rt></ruby>.
## Per què?
Volia substituir els esdeveniments de calendari inflexibles per a les sessions d'estudi per alguna cosa senzilla i adaptable. Sense aplicacions de tercers, sense sincronització al núvol, només un espai centrat en a la gestió de tasques.
## Funcionalitats
### Principals
- Gestió de tasques amb possibilitat de reordenar-les arrossegant
- Temporitzador amb durada personalitzable per tasca
- Privada i offline —sense comptes, seguiment ni emmagatzematge al servidor
- Importació/exportació de llistes de tasques (JSON)
### Utilitats
- Temporitzador Pomodoro
- Calendari d'activitat (vista de 30 dies)
- Comptador i cronòmetre
- Espai per prendre notes
- Selectors aleatoris
### Qualitat de vida
- Tema fosc i clar
- Notificacions del navegador i so
- Dreceres de teclat
- Disseny responsive
[![targeta social de zutsu](social_cards/projects_zutsu.jpg)](https://zutsu.osc.garden)

View file

@ -0,0 +1,51 @@
+++
title = "zutsu"
description = "Una aplicación minimalista y privada de gestión de tareas."
weight = 32
[taxonomies]
tags = ["interactivo", "productividad", "web app", "web", "JavaScript"]
[extra]
local_image = "projects/zutsu/zutsu_logo.webp"
canonical_url = "https://osc.garden/es/projects/zutsu/"
social_media_card = "social_cards/projects_zutsu.jpg"
+++
{% wide_container() %}
<video controls src="https://cdn.jsdelivr.net/gh/welpo/zutsu/assets/ずつ_demo.mov" title="demostración de zutsu"></video>
{% end %}
#### [Pruébala ahora](https://zutsu.osc.garden) • [GitHub](https://github.com/welpo/zutsu) • [Artículo](https://osc.garden/es/blog/zutsu-offline-task-planner-web-app/) {.centered-text}
<ruby><rt>zu</rt><rt>tsu</rt></ruby> es una aplicación web de gestión de tareas diseñada para ayudarte a centrarte en una tarea a la vez. El nombre viene de <ruby>一つ<rt>hitotsu</rt>ずつ<rt>zutsu</rt></ruby>, que significa «uno por uno» en <ruby>日本語<rt>japonés</rt></ruby>.
## ¿Por qué?
Quería sustituir la inflexibilidad del calendario para planificar las sesiones de estudio por algo simple y adaptable. Sin aplicaciones de terceros, sin sincronización en la nube —solo un espacio centrado en la gestión de tareas.
## Funcionalidades
### Principales
- Gestión de tareas con posibilidad de reordenarlas arrastrando y soltando
- Temporizador con duración personalizable por tarea
- Privada y offline —sin cuentas, seguimiento ni almacenamiento en servidor
- Importación/exportación de listas de tareas (JSON)
### Utilidades
- Temporizador Pomodoro
- Calendario de actividad (vista de 30 días)
- Contador y cronómetro
- Espacio para tomar notas
- Selectores aleatorios
### Calidad de vida
- Tema oscuro y claro
- Notificaciones del navegador y sonido
- Atajos de teclado
- Diseño responsive
[![tarjeta social de zutsu](social_cards/projects_zutsu.jpg)](https://zutsu.osc.garden)

View file

@ -0,0 +1,51 @@
+++
title = "zutsu"
description = "A private minimalist task management app."
weight = 32
[taxonomies]
tags = ["interactive", "productivity", "web app", "web", "JavaScript"]
[extra]
local_image = "projects/zutsu/zutsu_logo.webp"
canonical_url = "https://osc.garden/projects/zutsu/"
social_media_card = "social_cards/projects_zutsu.jpg"
+++
{% wide_container() %}
<video controls src="https://cdn.jsdelivr.net/gh/welpo/zutsu/assets/ずつ_demo.mov" title="zutsu demo"></video>
{% end %}
#### [Try it now](https://zutsu.osc.garden) • [GitHub](https://github.com/welpo/zutsu) • [Blog post](https://osc.garden/blog/zutsu-offline-task-planner-web-app/) {.centered-text}
<ruby><rt>zu</rt><rt>tsu</rt></ruby> is a task management web app designed to help you focus on one task at a time. The name comes from <ruby>一つ<rt>hitotsu</rt>ずつ<rt>zutsu</rt></ruby> which means "one at a time" in <ruby>日本語<rt>Japanese</rt></ruby>.
## Why?
I wanted to replace inflexible calendar events for study sessions with something simple and adaptable. No third-party apps, no cloud sync —just a focused space for task management.
## Features
### Core
- Task management with drag-and-drop reordering
- Timer with customizable duration for each task
- Private & offline—no accounts, tracking, or server storage
- Import/export task lists (JSON)
### Utilities
- Pomodoro timer
- Activity calendar (30-day view)
- Counter & stopwatch
- Note-taking space
- Random choice makers
### Quality of life
- Dark and light theme support
- Browser and sound notifications
- Keyboard shortcuts
- Responsive design
[![zutsu social media card](social_cards/projects_zutsu.jpg)](https://zutsu.osc.garden)

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -1,5 +1,6 @@
@use 'parts/_admonitions.scss';
@use 'parts/_archive.scss';
@use 'parts/_aside.scss';
@use 'parts/_cards.scss';
@use 'parts/_code.scss';
@use 'parts/_comments.scss';
@ -161,6 +162,7 @@ body {
article {
$base-margin: 6rem;
position: relative;
margin: 0 auto;
max-width: calc(var(--max-layout-width) - 2*$base-margin);

31
sass/parts/_aside.scss Normal file
View file

@ -0,0 +1,31 @@
aside {
margin-block-end: var(--paragraph-spacing);
border-radius: 4px;
background: var(--bg-0);
padding-block: 0.8rem;
padding-inline: 1rem;
color: var(--meta-color);
font-size: 0.9rem;
article & p {
margin: 0;
font-family: var(--sans-serif-font);
}
@media only screen and (min-width: 1300px) {
position: absolute;
inset-inline-start: -14rem;
margin-block: 0;
border-radius: 0;
background: none;
padding: 0;
width: 12rem;
text-align: end;
&[data-position="right"] {
inset-inline-start: auto;
inset-inline-end: -14rem;
text-align: start;
}
}
}

View file

@ -31,7 +31,6 @@ header {
flex-wrap: inherit;
justify-content: inherit;
align-items: inherit;
gap: inherit;
gap: 1px;
margin: 0;
padding: 0;
@ -39,7 +38,13 @@ header {
}
}
#menu-icons-group {
.menu-icons-container {
display: flex;
align-items: center;
margin-left: auto;
}
.menu-icons-group {
gap: 1px;
margin: 0;
padding: 0;
@ -168,6 +173,10 @@ header {
display: flex;
justify-content: center;
}
.menu-icons-container {
margin-left: 0;
}
}
@media only screen and (max-width: 600px) {

View file

@ -126,7 +126,7 @@ a:hover {
}
a:hover rt {
color: initial;
color: var(--text-color);
}
a:not(.no-hover-padding):hover::before {

View file

@ -80,11 +80,23 @@ get_latest_version_github() {
}
get_local_mermaid_version() {
sed -n 's/.*bpt="\([^"]*\)".*/\1/p' "$MERMAID_PATH" | head -n 1
local version
version=$(grep -o '[A-Za-z]\+t="[0-9]\+\.[0-9]\+\.[0-9]\+"' "$MERMAID_PATH" | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
if [ -z "$version" ]; then
exit_with_message "Could not detect local Mermaid.js version"
fi
echo "$version"
}
get_local_katex_version() {
sed -n 's/.*version:"\([^"]*\)".*/\1/p' "$KATEX_JS_PATH" | head -n 1
local version
version=$(sed -n 's/.*version:"\([^"]*\)".*/\1/p' "$KATEX_JS_PATH" | head -n 1)
if [ -z "$version" ]; then
echo "Could not detect local KaTeX version" >&2
return 1
fi
echo "$version"
}
compare_md5() {

View file

@ -14,7 +14,13 @@
<meta charset="utf-8"/>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link rel="stylesheet" href="{/atom:feed/@xml:base}/main.css"/>
<!-- The base URL is assumed to be the first URL in the sitemap. -->
<xsl:variable name="baseUrl" select="(sitemap:urlset/sitemap:url)[1]/sitemap:loc"/>
<!-- Remove http[s]:// -->
<xsl:variable name="baseUrlWithoutProtocol" select="substring-after($baseUrl, '://')"/>
<!-- Remove trailing slash -->
<xsl:variable name="clean_base_url" select="substring-before($baseUrlWithoutProtocol, '/')"/>
<link rel="stylesheet" href="{$baseUrl}main.css"/>
<link rel="stylesheet" href="{/atom:feed/atom:link[@rel='extra-stylesheet']/@href}" />
</head>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,5 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M253.327 231.222C273.138 225.034 283.687 203.21 272.188 185.932C260.55 168.444 245.621 152.451 229.602 143.462C203.361 128.737 172.782 123.673 143.189 129.15C113.596 134.628 86.862 150.3 67.642 173.439C48.422 196.579 37.9328 225.719 38.0003 255.788C38.0679 285.858 48.6879 314.951 68.0117 338.004C87.3355 361.057 114.139 376.609 143.757 381.954C173.374 387.298 203.93 382.097 230.105 367.254C247.097 357.619 260.996 342.705 271.555 325.726C281.231 310.169 273.378 290.598 257.062 282.264L246.267 276.749C230.326 268.607 210.566 276.498 198.502 289.722C195.653 292.846 192.785 295.394 190.135 296.897C180.439 302.395 169.121 304.321 158.15 302.342C147.179 300.362 137.25 294.601 130.092 286.061C122.934 277.522 119 266.745 118.975 255.607C118.95 244.469 122.835 233.674 129.955 225.103C137.075 216.531 146.977 210.726 157.939 208.697C168.901 206.668 180.229 208.544 189.949 213.998C192.537 215.451 194.968 217.547 197.216 220.038C207.837 231.804 222.93 240.717 238.06 235.991L253.327 231.222Z" fill="black"/>
<path d="M421.573 367.463C403.986 378.276 394 384 363.125 384C318.094 380.224 285.22 359.611 281.006 332.093C278.04 312.732 293.883 296.726 308.315 283.484L338.429 255.854C344.434 250.344 351.456 245.328 359.605 245.252C374.389 245.114 387 254.944 387 273.5C387 297 347.525 303.39 356.532 314.5C360.484 319.376 367.351 318.507 372.544 314.982C378.422 310.992 384.145 306.646 389.128 302.248C394.303 297.682 398.329 291.945 400.802 285.502C403.018 279.727 404.777 273.376 404.399 268.651C403.789 261.014 401.082 253.697 396.577 247.508C392.073 241.319 385.948 236.5 378.88 233.585C371.812 230.67 364.077 229.773 356.532 230.993C348.986 232.212 341.925 235.502 336.129 240.496C327.139 248.243 314.042 248.66 305.606 240.312L290.129 224.995C279.549 214.525 279.604 197.416 290.251 187.014C305.896 173.531 324.958 164.652 345.327 161.36C365.696 158.067 386.577 160.489 405.657 168.358C424.737 176.227 441.272 189.235 453.431 205.942C465.589 222.649 472.897 242.404 474.545 263.017C476.193 283.631 472.116 304.299 462.767 322.734C453.417 341.168 439.16 356.65 421.573 367.463Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,5 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="86" y="86" width="340" height="341" rx="95" stroke="black" stroke-width="18"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M179.5 154C122.891 154 77 199.891 77 256.5C77 313.109 122.891 359 179.5 359H332.5C389.109 359 435 313.109 435 256.5C435 199.891 389.109 154 332.5 154H179.5ZM174.669 230.184C179.504 231.338 184.359 228.355 185.513 223.52C186.668 218.686 183.684 213.831 178.85 212.676C178.199 212.521 177.553 212.395 176.913 212.3C170.739 211.376 164.977 213.68 160.921 216.999C156.866 220.319 153.468 225.511 153.153 231.746C153.12 232.392 153.115 233.05 153.139 233.719C153.315 238.687 157.484 242.571 162.452 242.395C167.419 242.219 171.304 238.05 171.128 233.082C171.122 232.917 171.124 232.775 171.13 232.654C171.136 232.534 171.312 231.756 172.322 230.929C173.332 230.102 174.13 230.084 174.249 230.101C174.368 230.119 174.508 230.146 174.669 230.184ZM326.323 223.52C327.477 228.355 332.332 231.338 337.167 230.184C337.328 230.146 337.468 230.119 337.587 230.101C337.706 230.084 338.503 230.102 339.514 230.929C340.524 231.756 340.7 232.534 340.706 232.654C340.712 232.775 340.714 232.917 340.708 233.082C340.532 238.05 344.417 242.219 349.384 242.395C354.352 242.571 358.521 238.687 358.697 233.719C358.72 233.05 358.716 232.392 358.683 231.746C358.368 225.511 354.97 220.319 350.914 216.999C346.859 213.68 341.097 211.376 334.923 212.3C334.283 212.395 333.637 212.521 332.986 212.676C328.152 213.831 325.168 218.686 326.323 223.52ZM339 285C334.029 285 330 280.971 330 276C330 272.059 326.462 268 321 268C315.538 268 312 272.059 312 276C312 280.971 307.971 285 303 285C298.029 285 294 280.971 294 276C294 261.163 306.58 250 321 250C335.42 250 348 261.163 348 276C348 280.971 343.971 285 339 285ZM237 267C241.971 267 246 271.029 246 276C246 278.899 249.004 283 255 283C260.996 283 264 278.899 264 276C264 271.029 268.029 267 273 267C277.971 267 282 271.029 282 276C282 290.774 268.886 301 255 301C241.114 301 228 290.774 228 276C228 271.029 232.029 267 237 267ZM199 276C199 280.971 203.029 285 208 285C212.971 285 217 280.971 217 276C217 260.939 203.956 250 189.5 250C175.044 250 162 260.939 162 276C162 280.971 166.029 285 171 285C175.971 285 180 280.971 180 276C180 272.283 183.522 268 189.5 268C195.478 268 199 272.283 199 276Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -0,0 +1,4 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M181 77C123.562 77 77 123.562 77 181V332C77 389.438 123.562 436 181 436H332C389.438 436 436 389.438 436 332V181C436 123.562 389.438 77 332 77H181ZM303.03 151.269C294.762 151.269 288.06 157.971 288.06 166.239C288.06 174.506 294.762 181.209 303.03 181.209C311.297 181.209 318 174.506 318 166.239C318 157.971 311.297 151.269 303.03 151.269ZM271.173 157.714C274.93 143.638 287.769 133.269 303.03 133.269C321.239 133.269 336 148.03 336 166.239C336 184.448 321.239 199.209 303.03 199.209C288.153 199.209 275.577 189.355 271.473 175.818C242.538 179.872 220.271 204.724 220.271 234.777V275.467C232.746 260.426 250.741 250.13 271.15 247.686C274.879 233.566 287.739 223.156 303.03 223.156C321.239 223.156 336 237.917 336 256.126C336 274.335 321.239 289.096 303.03 289.096C288.188 289.096 275.637 279.289 271.503 265.802C245.851 269.666 225.495 289.692 221.136 315.179C234.719 319.254 244.615 331.852 244.615 346.762C244.615 364.971 229.854 379.732 211.645 379.732C193.436 379.732 178.675 364.971 178.675 346.762C178.675 331.81 188.629 319.182 202.271 315.144V234.777C202.271 194.874 232.414 162.01 271.173 157.714ZM288.06 256.126C288.06 247.858 294.762 241.156 303.03 241.156C311.297 241.156 318 247.858 318 256.126C318 264.394 311.297 271.096 303.03 271.096C294.762 271.096 288.06 264.394 288.06 256.126ZM196.675 346.762C196.675 338.494 203.378 331.792 211.645 331.792C219.913 331.792 226.615 338.494 226.615 346.762C226.615 355.029 219.913 361.732 211.645 361.732C203.378 361.732 196.675 355.029 196.675 346.762Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,5 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M86 181C86 128.533 128.533 86 181 86H332C384.467 86 427 128.533 427 181V332C427 384.467 384.467 427 332 427H181C128.533 427 86 384.467 86 332V181Z" stroke="black" stroke-width="18"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M330 77H181C176.726 77 172.513 77.2578 168.374 77.7586C151.65 81.1648 128.281 89.788 109.43 105.543C91.8071 122.264 80.0368 145.092 77.5098 170.637C77.5033 171.09 77.5001 171.544 77.5001 172V341.854C80.5 372.569 105.6 434 182 434V381.854C182 359.763 199.909 341.854 222 341.854H291.299C312.673 341.854 330 324.527 330 303.153C330 281.779 312.673 264.451 291.299 264.451H222C199.909 264.451 182 246.543 182 224.451V206.513C182 184.422 199.909 166.513 222 166.513H290C312.091 166.513 330 148.605 330 126.513V77Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 933 B

View file

@ -0,0 +1,9 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="86" y="86" width="341" height="341" rx="95" stroke="black" stroke-width="18"/>
<path d="M353.955 202.068C364.17 217.924 369.701 236.006 369.988 254.485C370.275 272.964 365.308 291.186 355.589 307.31C345.87 323.434 331.743 336.889 314.635 346.315C297.528 355.742 278.046 360.805 258.158 360.994C238.27 361.184 218.68 356.492 201.368 347.394C184.057 338.295 169.636 325.112 159.563 309.177C149.49 293.241 144.123 275.117 144.002 256.636C143.882 238.156 149.012 219.973 158.877 203.925" stroke="black" stroke-width="18" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M324.266 232.106C328.403 242.193 329.86 253.06 328.513 263.783C327.165 274.506 323.052 284.767 316.525 293.693C309.998 302.619 301.25 309.944 291.025 315.046C280.801 320.148 269.403 322.876 257.801 322.996C246.2 323.116 234.74 320.626 224.396 315.737C214.051 310.848 205.13 303.705 198.391 294.917C191.652 286.129 187.295 275.955 185.691 265.263C184.087 254.57 185.284 243.675 189.179 233.506" stroke="black" stroke-width="18" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M289 256C289 259.808 288.172 263.579 286.564 267.098C284.956 270.616 282.599 273.813 279.627 276.506C276.656 279.199 273.128 281.335 269.246 282.793C265.363 284.25 261.202 285 257 285C252.798 285 248.637 284.25 244.754 282.793C240.872 281.335 237.344 279.199 234.373 276.506C231.401 273.813 229.044 270.616 227.436 267.098C225.828 263.579 225 259.808 225 256" stroke="black" stroke-width="18" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M245.708 245.863C245.708 251.269 251.101 254.648 254.809 255.662L255.513 255.78C256.386 255.926 257.277 255.926 258.15 255.78L258.854 255.662C262.562 254.648 268.292 251.269 268.292 245.863C268.292 239.105 268.629 213.086 296.606 207.342C324.584 201.598 331.325 171.524 330.988 164.766C330.651 158.008 301.191 164.766 284.472 172.876C274.022 177.945 257.169 184.703 257.169 197.881H256.831C256.831 184.703 239.978 177.945 229.528 172.876C212.809 164.766 183.349 158.008 183.012 164.766C182.675 171.524 189.416 201.598 217.394 207.342C245.371 213.086 245.708 239.105 245.708 245.863Z" fill="black"/>
<path d="M254.809 255.662L252.436 264.344C252.729 264.424 253.026 264.489 253.326 264.539L254.809 255.662ZM217.394 207.342L215.583 216.158L217.394 207.342ZM183.012 164.766L192.001 165.215L183.012 164.766ZM229.528 172.876L233.456 164.778V164.778L229.528 172.876ZM256.831 197.881H247.831C247.831 202.851 251.861 206.881 256.831 206.881V197.881ZM258.854 255.662L260.337 264.539C260.637 264.489 260.934 264.424 261.227 264.344L258.854 255.662ZM330.988 164.766L339.977 164.318V164.318L330.988 164.766ZM284.472 172.876L288.4 180.974V180.974L284.472 172.876ZM257.169 197.881V206.881C262.139 206.881 266.169 202.851 266.169 197.881H257.169ZM258.15 255.78L256.667 246.903L256.667 246.903L258.15 255.78ZM255.513 255.78L256.996 246.903L256.996 246.903L255.513 255.78ZM257.182 246.981C256.915 246.908 256.498 246.755 256.034 246.51C255.573 246.266 255.193 245.996 254.923 245.751C254.652 245.504 254.59 245.372 254.608 245.408C254.646 245.482 254.708 245.663 254.708 245.863H236.708C236.708 251.831 239.743 256.277 242.814 259.069C245.812 261.795 249.402 263.514 252.436 264.344L257.182 246.981ZM254.708 245.863C254.708 242.308 254.667 232.479 250.268 222.571C245.642 212.15 236.35 202.046 219.204 198.526L215.583 216.158C226.415 218.382 231.28 224.16 233.816 229.874C236.581 236.101 236.708 242.66 236.708 245.863H254.708ZM219.204 198.526C208.448 196.318 201.668 189.511 197.417 182.001C195.279 178.223 193.862 174.385 193.008 171.159C192.583 169.553 192.312 168.155 192.158 167.056C192.082 166.508 192.038 166.062 192.017 165.724C191.994 165.371 192.001 165.211 192.001 165.215L174.023 164.318C173.874 167.304 174.466 171.456 175.607 175.765C176.797 180.258 178.751 185.564 181.753 190.868C187.782 201.52 198.362 212.622 215.583 216.158L219.204 198.526ZM192.001 165.215C191.839 168.456 189.643 170.279 188.527 170.851C187.776 171.236 187.573 171.09 188.627 171.025C190.556 170.905 193.909 171.2 198.398 172.078C207.223 173.805 218.017 177.295 225.6 180.974L233.456 164.778C224.321 160.347 212.025 156.403 201.855 154.413C196.847 153.433 191.727 152.798 187.515 153.059C185.498 153.184 182.808 153.555 180.317 154.833C177.459 156.297 174.269 159.387 174.023 164.318L192.001 165.215ZM225.6 180.974C231.364 183.769 237.142 186.262 241.843 189.643C246.518 193.006 247.831 195.645 247.831 197.881H265.831C265.831 186.939 258.718 179.609 252.354 175.031C246.016 170.472 238.142 167.051 233.456 164.778L225.6 180.974ZM261.227 264.344C264.181 263.536 267.802 261.866 270.866 259.204C273.969 256.508 277.292 252.034 277.292 245.863H259.292C259.292 245.56 259.386 245.317 259.435 245.228C259.458 245.186 259.383 245.336 259.061 245.616C258.743 245.892 258.303 246.19 257.78 246.458C257.255 246.728 256.784 246.898 256.48 246.981L261.227 264.344ZM277.292 245.863C277.292 242.66 277.419 236.101 280.184 229.874C282.72 224.16 287.585 218.382 298.417 216.158L294.796 198.526C277.65 202.046 268.358 212.15 263.732 222.571C259.333 232.479 259.292 242.308 259.292 245.863H277.292ZM298.417 216.158C315.638 212.622 326.218 201.52 332.247 190.868C335.249 185.564 337.203 180.258 338.393 175.765C339.534 171.456 340.126 167.304 339.977 164.318L321.999 165.215C321.999 165.211 322.006 165.371 321.983 165.724C321.962 166.062 321.918 166.508 321.842 167.056C321.688 168.155 321.417 169.553 320.992 171.159C320.138 174.385 318.721 178.223 316.583 182.001C312.332 189.511 305.552 196.318 294.796 198.526L298.417 216.158ZM339.977 164.318C339.731 159.387 336.541 156.297 333.683 154.833C331.192 153.555 328.502 153.184 326.485 153.059C322.273 152.798 317.153 153.433 312.145 154.413C301.975 156.403 289.679 160.347 280.544 164.778L288.4 180.974C295.983 177.295 306.777 173.805 315.602 172.078C320.091 171.2 323.444 170.905 325.373 171.025C326.427 171.09 326.224 171.236 325.473 170.851C324.357 170.279 322.161 168.456 321.999 165.215L339.977 164.318ZM280.544 164.778C275.858 167.051 267.984 170.472 261.646 175.031C255.282 179.609 248.169 186.939 248.169 197.881H266.169C266.169 195.645 267.482 193.006 272.157 189.643C276.858 186.262 282.636 183.769 288.4 180.974L280.544 164.778ZM256.831 206.881H257.169V188.881H256.831V206.881ZM257.371 246.785L256.667 246.903L259.632 264.657L260.337 264.539L257.371 246.785ZM256.996 246.903L256.292 246.785L253.326 264.539L254.031 264.657L256.996 246.903ZM256.667 246.903C256.776 246.885 256.887 246.885 256.996 246.903L254.031 264.657C255.885 264.967 257.778 264.967 259.632 264.657L256.667 246.903Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

5
static/social_icons/gitea.svg Executable file
View file

@ -0,0 +1,5 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M111 262C91.374 262 72.5518 254.204 58.6741 240.326C44.7964 226.448 37 207.626 37 188C37 168.374 44.7964 149.552 58.6741 135.674C72.5518 121.796 91.374 114 111 114L123 114" stroke="black" stroke-width="18"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M158 76C131.49 76 110 97.4903 110 124V285.5C110 367.79 176.71 434.5 259 434.5H334C416.29 434.5 483 367.79 483 285.5V124C483 97.4903 461.51 76 435 76H158ZM323 161.201V93.5H305V150.808L288.773 141.44C273.946 132.879 254.987 137.96 246.426 152.787L182.121 264.167C173.561 278.994 178.641 297.953 193.468 306.514L304.848 370.819C319.675 379.379 338.634 374.299 347.195 359.472L411.5 248.092C420.06 233.265 414.98 214.306 400.153 205.745L323 161.201ZM316.845 178.432L391.153 221.334C397.371 224.924 399.501 232.874 395.912 239.092L331.606 350.472C328.016 356.69 320.066 358.82 313.848 355.231L202.468 290.925C196.25 287.335 194.12 279.385 197.709 273.167L262.015 161.787C265.605 155.569 273.555 153.438 279.773 157.028L301.257 169.432L291.498 186.335C284.705 186.123 278.018 189.561 274.382 195.859C270.746 202.157 271.112 209.667 274.692 215.444L253.853 251.539C247.06 251.328 240.372 254.765 236.736 261.063C231.473 270.18 234.597 281.838 243.713 287.101C252.83 292.365 264.488 289.241 269.751 280.124C273.387 273.826 273.021 266.316 269.441 260.538L290.28 224.445C293.284 224.538 296.268 223.918 298.976 222.652L329.227 240.118L305.306 281.551C298.702 281.535 292.273 284.956 288.735 291.085C283.471 300.202 286.595 311.859 295.711 317.123C304.828 322.386 316.486 319.263 321.749 310.146C325.481 303.682 324.997 295.941 321.15 290.108L353.816 233.529L309.763 208.095C310.398 203.65 309.433 199.12 307.087 195.334L316.845 178.432Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,4 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M175.394 91.7845L232.098 84.5849C259.535 81.1012 286.351 93.3871 301.711 115.881L278.501 121.263C254.24 126.889 237.063 148.515 237.063 173.433V179.987C237.063 204.42 253.591 225.755 277.238 231.848L304.335 238.829L302.58 256.702C299.132 291.83 326.715 322.273 361.992 322.273H394.259C419.619 322.273 441.619 302.514 434.989 283.157C442.141 292.886 446.063 304.703 446.063 316.918V324.433H435.466L426.867 352.433C414.687 392.098 374.274 415.933 333.667 407.403L291.049 398.45C279.438 396.011 267.68 401.907 262.691 412.671C255.052 429.148 233.12 432.573 220.821 419.21L88.7782 275.742C56.8167 241.015 57.1105 187.496 89.4511 153.122L121.182 119.396C135.499 104.178 154.666 94.4163 175.394 91.7845ZM406.977 249.724L412.346 241.577L338.408 186.901L350.873 173.753C354.233 170.208 356.678 165.897 357.997 161.194C358.795 158.346 359.058 155.478 358.849 152.695C356.653 157.774 351.916 161.358 346.358 162.037L319.725 165.29V154.395H274.298V195.25L319.725 207.878L366.145 249.724H406.977ZM166.564 243.076L175.628 243.076C180.01 243.076 183.563 239.524 183.563 235.142C183.563 230.76 187.115 227.207 191.497 227.207H197.254C204.816 227.207 210.946 233.337 210.946 240.899V251.49C210.946 264.901 200.074 275.773 186.663 275.773L160.214 275.773C145.106 275.773 132.198 264.881 129.656 249.988L121.321 201.152C119.327 189.472 124.167 177.676 133.79 170.762L134.477 170.269C143.116 164.061 154.334 162.717 164.195 166.708L180.397 173.265C185.637 175.385 189.066 180.472 189.066 186.124C189.066 193.786 182.855 199.997 175.193 199.997H169.316C158.408 199.997 149.566 208.839 149.566 219.747L149.566 226.078C149.566 235.465 157.176 243.076 166.564 243.076Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,4 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M181 77C123.562 77 77 123.562 77 181V332C77 389.438 123.562 436 181 436H332C389.438 436 436 389.438 436 332V181C436 123.562 389.438 77 332 77H181ZM281.422 155.866C315.228 144.088 352.18 161.945 363.958 195.751C375.736 229.557 357.879 266.509 324.073 278.287C312.972 282.155 301.531 282.827 290.753 280.788L284.289 304.229C291.982 308.027 298.247 314.729 301.293 323.471C307.452 341.15 298.114 360.475 280.435 366.634C262.756 372.794 243.431 363.455 237.271 345.776C235.122 339.608 234.86 333.239 236.18 327.3L209.857 311.573C205.659 315.576 200.559 318.768 194.725 320.801C172.857 328.42 148.954 316.868 141.335 295.001C133.716 273.133 145.267 249.229 167.135 241.611C184.359 235.61 202.845 241.501 213.643 254.959L242.054 239.834C241.877 239.36 241.704 238.883 241.537 238.402C229.759 204.597 247.616 167.644 281.422 155.866ZM250.638 255.656C256.76 263.93 264.7 270.507 273.674 275.01L266.555 300.827C263.745 301.056 260.917 301.642 258.13 302.613C252.799 304.47 248.228 307.524 244.61 311.368L219.924 296.62C223.053 288.714 223.804 279.828 221.626 271.101L250.638 255.656Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

8
static/social_icons/lemmy.svg Executable file
View file

@ -0,0 +1,8 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M289 395C289 411.913 274.884 426 257 426C239.116 426 225 411.913 225 395C225 378.087 239.116 364 257 364C274.884 364 289 378.087 289 395Z" stroke="black" stroke-width="18"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M187.997 113.368C126.039 111.595 74.8511 161.339 74.8511 223.323V290.043C74.8511 349.569 122.203 398.296 181.705 399.998L217.077 401.01C216.862 399.32 216.751 397.598 216.751 395.849C216.751 373.544 234.832 355.462 257.137 355.462C279.442 355.462 297.524 373.544 297.524 395.849C297.524 398.392 297.289 400.88 296.84 403.293L324.095 404.073C386.053 405.845 437.241 356.101 437.241 294.117V227.397C437.241 167.871 389.889 119.145 330.387 117.443L187.997 113.368ZM349 313C361.15 313 371 303.15 371 291C371 278.85 361.15 269 349 269C336.85 269 327 278.85 327 291C327 303.15 336.85 313 349 313ZM349 331C371.091 331 389 313.091 389 291C389 268.909 371.091 251 349 251C326.909 251 309 268.909 309 291C309 313.091 326.909 331 349 331ZM185 291C185 303.15 175.15 313 163 313C150.85 313 141 303.15 141 291C141 278.85 150.85 269 163 269C175.15 269 185 278.85 185 291ZM203 291C203 313.091 185.091 331 163 331C140.909 331 123 313.091 123 291C123 268.909 140.909 251 163 251C185.091 251 203 268.909 203 291Z" fill="black"/>
<path d="M408.586 359L453 379.861M383 379.861L408.586 408" stroke="black" stroke-width="18" stroke-linecap="round"/>
<path d="M103.414 359L59 379.861M129 379.861L103.414 408" stroke="black" stroke-width="18" stroke-linecap="round"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M139.653 123.006C131.167 105.821 113.464 94 93 94C64.2812 94 41 117.281 41 146C41 169.612 56.7378 189.549 78.2961 195.892C76.8144 201.667 75.7895 207.628 75.2628 213.733C45.1917 205.88 23 178.532 23 146C23 107.34 54.3401 76 93 76C121.297 76 145.672 92.7902 156.707 116.951C150.817 118.507 145.117 120.539 139.653 123.006ZM96.4091 197.89C123.539 196.134 145 173.573 145 146C145 144.148 144.903 142.318 144.714 140.516C150.199 137.851 155.985 135.717 162.006 134.178C162.66 138.021 163 141.971 163 146C163 184.614 131.734 215.925 93.1379 216C93.6283 209.765 94.7396 203.708 96.4091 197.89ZM436.378 213.563C466.123 205.491 488 178.3 488 146C488 107.34 456.66 76 418 76C388.377 76 363.053 94.4002 352.831 120.395C358.75 121.804 364.48 123.691 369.981 126.011C377.814 107.214 396.364 94 418 94C446.719 94 470 117.281 470 146C470 169.627 454.242 189.574 432.663 195.904C434.366 201.611 435.618 207.512 436.378 213.563ZM414.4 197.877C416.365 203.682 417.767 209.744 418.541 215.998C418.361 215.999 418.18 216 418 216C379.34 216 348 184.66 348 146C348 143.248 348.159 140.532 348.468 137.863C354.587 139.307 360.466 141.361 366.039 143.956C366.013 144.634 366 145.315 366 146C366 173.509 387.36 196.028 414.4 197.877Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M521.3 128C586.9 128 640 181.1 640 246.6s-53.1 118.6-118.7 118.6c-42.5 0-79.7-22.3-100.7-55.8c11.4-18.2 18-39.7 18-62.8s-6.6-44.6-18-62.8l0 0 .8-1.2c20.8-32.3 56.8-53.9 97.9-54.6l2 0zM320 128c42.5 0 79.7 22.3 100.7 55.8c-11.4 18.2-18 39.7-18 62.8s6.6 44.6 18 62.8l0 0-.8 1.2c-20.8 32.3-56.8 53.9-97.9 54.6l-2 0c-42.5 0-79.7-22.3-100.7-55.8c11.4-18.2 18-39.7 18-62.8s-6.6-44.6-18-62.8l0 0 .8-1.2c20.8-32.3 56.8-53.9 97.9-54.6l2 0zm-201.3 0c42.5 0 79.7 22.3 100.7 55.8c-11.4 18.2-18 39.7-18 62.8s6.6 44.6 18 62.8l0 0-.8 1.2c-20.8 32.3-56.8 53.9-97.9 54.6l-2 0C53.1 365.1 0 312.1 0 246.6S53.1 128 118.7 128z"/></svg>

After

Width:  |  Height:  |  Size: 835 B

View file

@ -0,0 +1,9 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M95.2379 182.246V350.989C95.2379 364.802 106.436 376 120.249 376H121.593C135.406 376 146.604 364.802 146.604 350.989V245.078L164.604 266.756V350.989C164.604 374.743 145.347 394 121.593 394H120.249C96.4945 394 77.2379 374.743 77.2379 350.989V160.011C77.2379 136.257 96.4945 117 120.249 117H121.593C139.006 117 154.002 127.348 160.768 142.23L157.719 138.558C146.429 124.962 126.254 123.092 112.657 134.382L108.18 138.099C105.125 139.786 102.459 142.093 100.354 144.851C90.6383 154.915 88.6789 170.119 95.2379 182.246ZM256.001 267.238V350.989C256.001 374.743 275.258 394 299.012 394H300.356C324.11 394 343.367 374.743 343.367 350.989V160.011C343.367 136.257 324.11 117 300.356 117H299.012C281.203 117 265.923 127.823 259.389 143.251L263.285 138.558C274.575 124.962 294.75 123.092 308.347 134.382L313.839 138.942C315.594 140.067 317.199 141.406 318.618 142.922C330.282 153.074 332.857 169.929 325.367 182.963V350.989C325.367 364.802 314.169 376 300.356 376H299.012C285.199 376 274.001 364.802 274.001 350.989V245.56L256.001 267.238Z" fill="black"/>
<path d="M327.482 127.637C345.737 142.828 348.247 169.974 333.09 188.269L249.846 288.741C225.458 321.519 195.25 320.846 170.434 288.144L88.0374 188.694C72.6853 170.164 75.2282 142.671 93.717 127.285C112.206 111.899 139.639 114.447 154.991 132.977L207.307 196.12C208.907 198.051 211.868 198.051 213.468 196.12L266.136 132.552C281.293 114.257 308.379 111.741 326.634 126.932L327.482 127.637Z" fill="black"/>
<path d="M189.5 297.5L95 186C92.6667 183.667 88 178.2 88 175C88 171 88.5 151 88 143.5C87.5 136 103.5 128.5 116.5 125C126.9 122.2 137.5 128.5 141.5 132C172.167 168.667 235 243.4 241 249C247 254.6 247.5 270.333 247 277.5C241 284.167 227.2 298.7 220 303.5C212.8 308.3 196.667 301.5 189.5 297.5Z" fill="black" stroke="black"/>
<path d="M358 239C358 218.013 375.013 201 396 201C416.987 201 434 218.013 434 239V356C434 376.987 416.987 394 396 394C375.013 394 358 376.987 358 356V239Z" fill="black"/>
<ellipse cx="397" cy="156" rx="37" ry="38" fill="black"/>
<path d="M264.5 357.5V264V257L334.5 179.5V357.5L325.5 372L310 383.5H296L278 376.5L264.5 357.5Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,7 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M280.5 358.5L173.503 420.287C142.17 438.381 103 415.768 103 379.586L103 256L280.5 358.5Z" fill="black"/>
<path d="M280.5 153.5L103 256L103 132.414C103 96.232 142.17 73.6194 173.504 91.7133L280.5 153.5Z" fill="black"/>
<path d="M387.518 215.299C418.846 233.39 418.846 278.61 387.517 296.701L280.5 358.5L280.5 153.5L387.518 215.299Z" fill="black"/>
<path d="M280.5 358.5L173.503 420.287C142.17 438.381 103 415.768 103 379.586L103 256M280.5 358.5L103 256M280.5 358.5L387.517 296.701C418.846 278.61 418.846 233.39 387.518 215.299L280.5 153.5M280.5 358.5L280.5 153.5M103 256L280.5 153.5M103 256L103 132.414C103 96.232 142.17 73.6194 173.504 91.7133L280.5 153.5" stroke="black" stroke-width="18"/>
</svg>

After

Width:  |  Height:  |  Size: 867 B

View file

@ -0,0 +1,4 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M435 256C435 287.17 427.033 316.479 413.025 342.001C391.664 344.91 368.991 344.165 348.586 337.918C329.966 332.217 313.449 322.017 301.281 306.026C299.348 303.486 297.512 300.783 295.787 297.908C322.925 294.791 344 271.74 344 243.767V237.274C345.958 236.247 347.862 235.153 349.711 233.993C369.733 221.44 382.241 201.974 389.607 180.708C393.431 169.668 395.931 157.977 397.382 146.204C420.959 176.521 435 214.621 435 256ZM342.867 216.945C356.957 207.118 366.533 192.327 372.598 174.816C377.719 160.034 380.192 143.709 380.825 127.705C348.58 96.3263 304.547 77 256 77C157.141 77 77 157.141 77 256C77 258.032 77.0339 260.057 77.1011 262.073C96.1237 244.734 119.094 233.101 142.821 226.028C158.042 221.49 173.696 218.784 189 217.631V206C189 188.327 203.327 174 221 174H255.71C245.912 144.618 225.33 124.59 201.78 111.04C192.329 105.602 182.427 101.233 172.602 97.7727C179.957 93.8773 187.615 90.478 195.531 87.6195C200.671 89.9669 205.766 92.5664 210.757 95.4379C238.99 111.683 264.048 136.818 274.552 174H290C316.034 174 337.766 192.424 342.867 216.945ZM190.988 346.224C189.952 346.156 189 345.326 189 344.111V267.2V236.134V235.685C175.434 236.792 161.529 239.233 147.964 243.277C121.972 251.026 97.6574 264.497 79.405 285.413C90.518 352.636 139.086 407.22 202.953 427.009C200.261 421.782 197.985 416.505 196.101 411.193C188.308 389.215 187.398 367.119 190.988 346.224ZM215.671 323.921C213.579 329.506 211.806 335.226 210.418 341.045C205.458 361.831 205.442 383.677 213.066 405.177C216.321 414.355 221.008 423.585 227.418 432.73C236.725 434.224 246.272 435 256 435C315.506 435 368.23 405.964 400.777 361.286C381.537 362.46 361.757 360.775 343.317 355.129C321.737 348.523 301.786 336.413 286.957 316.926C282.66 311.28 278.835 305.068 275.539 298.267H266.5H253.963H247.695H244.561C242.554 298.267 240.629 299.064 239.211 300.484L238.435 301.26L235.443 304.252L229.46 310.238L217.493 322.208L215.671 323.921Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,6 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M144 124C144 97.4903 165.49 76 192 76H209C222.255 76 233 86.7452 233 100V412C233 425.255 222.255 436 209 436H168C154.745 436 144 425.255 144 412V124Z" fill="black"/>
<path d="M278 100C278 86.7452 288.745 76 302 76H344C357.255 76 368 86.7452 368 100V227C368 251.853 347.853 272 323 272H302C288.745 272 278 261.255 278 248V100Z" fill="black"/>
<path d="M278 358C278 344.745 288.745 334 302 334H344C357.255 334 368 344.745 368 358V388C368 414.51 346.51 436 320 436H302C288.745 436 278 425.255 278 412V358Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 694 B

View file

@ -0,0 +1,5 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M343.257 404.255C393.974 374.341 428 319.144 428 256C428 230.686 422.531 206.649 412.711 185.006C411.662 202.528 407.909 220.432 404.044 233.595L343.257 404.255ZM319.987 415.704L273.3 290.764C270.034 282.024 257.637 282.123 254.511 290.914L210.084 415.832C209.316 417.992 207.99 419.626 206.378 420.734C222.09 425.46 238.748 428 256 428C278.614 428 300.208 423.636 319.987 415.704ZM191.052 415.315C128.255 389.688 84 328.012 84 256C84 227.061 91.147 199.791 103.772 175.859L191.052 415.315ZM116.415 155.479H169.999C174.507 155.479 178.161 159.133 178.161 163.641C178.161 168.148 174.507 171.802 169.999 171.802H167.916C161.022 171.802 156.196 178.613 158.481 185.116L208.11 326.389C211.247 335.32 223.884 335.298 226.991 326.358L254.386 247.528C255.158 245.306 255.122 242.883 254.284 240.685L230.488 178.241C229.011 174.364 225.293 171.802 221.144 171.802H213.579C209.071 171.802 205.417 168.148 205.417 163.641C205.417 159.133 209.071 155.479 213.579 155.479H299.904C304.411 155.479 308.065 159.133 308.065 163.641C308.065 168.148 304.411 171.802 299.904 171.802H297.884C290.973 171.802 286.145 178.646 288.464 185.157L338.349 325.249C341.569 334.291 354.41 334.038 357.238 324.867C363.743 303.768 370.861 280.281 373.307 270.904C377.947 253.124 378.237 218.73 368.668 205.03C359.771 192.293 325.556 133.191 367.41 124.954C337.396 99.413 298.498 84 256 84C198.534 84 147.65 112.182 116.415 155.479Z" fill="black"/>
<path d="M410.638 235.944L410.704 235.757L410.76 235.567C416.245 216.893 421.635 188.545 419.535 164.489C418.487 152.486 415.511 140.747 408.999 131.852C402.206 122.573 391.995 117 378.237 117C362.493 117 351.281 121.615 345.111 130.844C339.204 139.68 339.291 150.814 341.249 160.734C345.19 180.697 357.947 201.906 362.929 209.039C364.598 211.428 366.113 215.172 367.26 220.168C368.387 225.079 369.064 230.778 369.322 236.74C369.843 248.745 368.64 261.068 366.534 269.136C364.136 278.329 357.073 301.643 350.549 322.804C349.718 325.497 345.918 325.638 344.944 322.901L295.058 182.808C294.362 180.855 295.811 178.802 297.884 178.802H299.904C308.277 178.802 315.065 172.014 315.065 163.641C315.065 155.267 308.277 148.479 299.904 148.479H213.579C205.205 148.479 198.417 155.267 198.417 163.641C198.417 172.014 205.205 178.802 213.579 178.802H221.144C222.389 178.802 223.504 179.571 223.947 180.734L247.743 243.177C247.995 243.837 248.005 244.564 247.774 245.23L220.379 324.06C219.447 326.742 215.656 326.748 214.714 324.069L165.085 182.796C164.4 180.845 165.848 178.802 167.916 178.802H169.999C178.373 178.802 185.161 172.014 185.161 163.641C185.161 155.267 178.373 148.479 169.999 148.479H105.193C97.9069 148.479 92 154.386 92 161.673C92 163.214 92.27 164.743 92.7977 166.191L184.69 418.303C190.145 433.27 211.342 433.187 216.68 418.178L261.106 293.259C262.044 290.622 265.763 290.592 266.743 293.214L313.663 418.78C319.214 433.634 340.281 433.471 345.602 418.533L410.638 235.944Z" stroke="black" stroke-width="14" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -0,0 +1,4 @@
<!-- CC-BY - https://github.com/reiver/fediverse-icons -->
<svg width="521" height="521" viewBox="0 0 521 521" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M185 81C127.562 81 81 127.562 81 185V336C81 393.438 127.562 440 185 440H336C393.438 440 440 393.438 440 336V185C440 127.562 393.438 81 336 81H185ZM347.261 302.318C353.068 294.389 357.947 283.263 361.357 271.479C364.793 259.608 366.928 246.416 366.831 234.07C366.736 221.936 364.475 209.481 357.993 200.108C351.015 190.017 339.9 184.615 325.359 186.013C319.294 186.597 314.023 188.657 310.178 192.011C306.47 195.246 303.499 200.377 304.449 206.269C305.488 212.72 310.608 216.592 316.089 217.758C321.282 218.864 327.222 217.834 333.377 215.343C337.153 213.814 339.328 210.013 338.963 206.155C340.678 207.257 342.045 208.693 343.188 210.346C346.713 215.444 348.749 223.68 348.832 234.211C348.913 244.53 347.105 255.977 344.067 266.475C341.004 277.059 336.878 286.031 332.739 291.683C322.798 305.257 312.989 312.694 304.461 315.632C296.305 318.443 288.746 317.378 281.782 312.617C280.605 311.813 278.555 309.136 276.868 302.56C275.278 296.362 274.41 288.287 274.141 279.056C273.766 266.213 274.566 251.91 275.764 238.762C276.624 233.132 277.39 227.724 278.059 222.768C278.182 221.857 278.269 220.496 277.946 218.97C277.79 218.231 277.439 216.975 276.564 215.658C275.693 214.347 273.733 212.2 270.362 211.67C266.917 211.129 264.323 212.635 263.013 213.75C261.743 214.832 261.046 216.015 260.698 216.704C259.976 218.131 259.719 219.497 259.611 220.399C259.012 225.388 258.417 230.846 257.89 236.568C255.149 254.441 251.55 273.946 247.355 287.715C238.055 318.24 212.07 319.579 202.328 312.696C197.605 309.359 195.185 301.984 197.043 285.625C198.246 275.036 200.907 263 203.91 249.414C205.399 242.675 206.973 235.555 208.495 228.042C211.159 214.89 209.829 204.919 204.981 197.868C200.095 190.759 192.992 188.575 188.467 188.035L188.443 188.032L188.42 188.03C177.902 186.831 167.697 191.154 161.177 198.748C154.465 206.568 151.756 217.749 156.116 229.408C157.857 234.063 163.043 236.426 167.698 234.685C172.354 232.944 174.717 227.759 172.976 223.103C170.987 217.785 172.257 213.476 174.835 210.473C177.6 207.252 181.985 205.422 186.357 205.911C187.75 206.082 189.181 206.658 190.148 208.065C191.16 209.536 193.004 213.853 190.853 224.468C189.509 231.105 188.04 237.761 186.598 244.291L186.598 244.291C183.468 258.473 180.468 272.064 179.158 283.593C177.305 299.913 178.043 317.578 191.942 327.397C210.257 340.338 243.128 335.614 259.175 305.995C259.259 306.344 259.345 306.689 259.433 307.032C261.398 314.694 264.848 322.845 271.623 327.477C283.282 335.447 296.783 337.317 310.325 332.65C323.497 328.112 336.026 317.66 347.261 302.318ZM321.837 205.745C321.836 205.745 321.842 205.737 321.857 205.721C321.845 205.737 321.837 205.745 321.837 205.745Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -25,6 +25,13 @@
{%- set_global all_posts = all_posts | concat(with=section_item.pages) -%}
{%- endfor %}
{# Sort all posts by date #}
{%- set archive_reverse = section.extra.archive_reverse | default(value=false) -%}
{%- set all_posts = all_posts | sort(attribute="date") -%}
{%- if not archive_reverse -%}
{%- set all_posts = all_posts | reverse -%}
{%- endif -%}
{# Group posts by year. #}
{% set posts_by_year = all_posts | group_by(attribute="year") %}
{% set years = [] %}
@ -32,8 +39,13 @@
{% set_global years = years | concat(with=[year]) %}
{% endfor %}
{# Iterate over sorted & reversed years (newest to oldest). #}
{% for year in years | sort | reverse %}
{# Iterate over years #}
{% set years = years | sort %}
{%- if not archive_reverse -%}
{%- set years = years | reverse -%}
{%- endif -%}
{% for year in years %}
{% set posts = posts_by_year[year] %}
{% if posts | length > 0 %}
<li>

View file

@ -4,13 +4,15 @@
{%- block main_content %}
{{ macros_page_header::page_header(title=page.title) }}
{%- set page_or_section = page | default(value=section) -%}
{{ macros_page_header::page_header(title=page_or_section.title) }}
<div id="page-content">
<main>
{# The replace pattern is used to enable arbitrary locations for the Table of Contents #}
{# This is Philipp Oppermann's workaround: https://github.com/getzola/zola/issues/584#issuecomment-474329637 #}
{{ page.content | replace(from="<!-- toc -->", to=macros_toc::toc(page=page, header=false, language_strings=language_strings)) | safe }}
{{ page_or_section.content | replace(from="<!-- toc -->", to=macros_toc::toc(page=page_or_section, header=false, language_strings=language_strings)) | safe }}
</main>
</div>

View file

@ -68,7 +68,9 @@
{%- if "dates" in metadata -%}
{%- set allowed_post_listing_dates = ["date", "updated", "both"] -%}
{%- set post_listing_date = config.extra.post_listing_date | default(value="date") -%}
{#- Calling the hierarchy macro here causes an error due to the "get parents" part of the macro. -#}
{#- This seems cleaner. -#}
{%- set post_listing_date = section.extra.post_listing_date | default(value=config.extra.post_listing_date) | default(value="date") -%}
{%- if post_listing_date not in allowed_post_listing_dates -%}
{{ throw(message="ERROR: Invalid value for config.extra.post_listing_date. Allowed values are 'date', 'updated', or 'both'.") }}
{%- endif -%}

View file

@ -151,10 +151,10 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
{% endif %}
{#- Reading time -#}
{% if macros_settings::evaluate_setting_priority(setting="show_reading_time", page=page, default_global_value=true) == "true" %}
{%- if macros_settings::evaluate_setting_priority(setting="show_reading_time", page=page, default_global_value=true) == "true" -%}
<li title="{{ macros_translate::translate(key="words", number=page.word_count, default="$NUMBER words", language_strings=language_strings) }}">{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}{{ macros_translate::translate(key="min_read", number=page.reading_time, default="$NUMBER min read", language_strings=language_strings) }}</li>
{%- set previous_visible = true -%}
{% endif %}
{%- endif -%}
{#- Tags -#}
{%- if page.taxonomies and page.taxonomies.tags -%}
@ -174,11 +174,12 @@ Current section extra: {% if current_section %}{{ current_section.extra | json_e
{%- set last_updated_str = macros_translate::translate(key="last_updated_on", default="Updated on $DATE", language_strings=language_strings) -%}
{%- set formatted_date = macros_format_date::format_date(date=page.updated, short=true, language_strings=language_strings) -%}
{%- set updated_str = last_updated_str | replace(from="$DATE", to=formatted_date) -%}
{%- set previous_visible = true -%}
</ul><ul class="meta last-updated"><li>{{ updated_str }}</li>
{# Show link to remote changes if enabled #}
{% if config.extra.remote_repository_url and macros_settings::evaluate_setting_priority(setting="show_remote_changes", page=page, default_global_value=true) == "true" %}
{#- Show link to remote changes if enabled -#}
{%- if config.extra.remote_repository_url and macros_settings::evaluate_setting_priority(setting="show_remote_changes", page=page, default_global_value=true) == "true" -%}
<li>{%- if previous_visible -%}{{ separator_with_class | safe }}{%- endif -%}<a class="external" href="{% include "partials/history_url.html" %}" {{ blank_target }} rel="{{ rel_attributes }}">{{ macros_translate::translate(key="see_changes", default="See changes", language_strings=language_strings) }}</a></li>
{% endif %}
{%- endif -%}
{% endif %}
</ul>

View file

@ -23,7 +23,7 @@
src="{{ self_hosted_url ~ '/script.js' }}"
{% else %}
data-website-id="{{ analytics_id }}"
src="https://analytics.eu.umami.is/script.js"
src="https://cloud.umami.is/script.js"
{% endif %}
data-do-not-track="true">
</script>

View file

@ -29,8 +29,8 @@ content="default-src 'self'
{%- set script_src = script_src ~ " gc.zgo.at" -%}
{%- set connect_src = connect_src ~ " " ~ config.extra.analytics.id ~ ".goatcounter.com/count" -%}
{%- elif config.extra.analytics.service == "umami" -%}
{%- set script_src = script_src ~ " analytics.eu.umami.is" -%}
{%- set connect_src = connect_src ~ " *.umami.dev" ~ " analytics.eu.umami.is" -%}
{%- set script_src = script_src ~ " cloud.umami.is" -%}
{%- set connect_src = connect_src ~ " *.umami.dev" ~ " cloud.umami.is" -%}
{%- elif config.extra.analytics.service == "plausible" -%}
{%- set script_src = script_src ~ " plausible.io" -%}
{%- set connect_src = connect_src ~ " plausible.io" -%}

View file

@ -1,6 +1,11 @@
{%- set page_or_section = page | default(value=section) -%}
{# prepare parameters for evaluate_setting_priority macro #}
{%- set page_s = page | default(value="") -%}
{%- set section_s = section | default(value="") -%}
{# Quick navigation buttons #}
{% if macros_settings::evaluate_setting_priority(setting="quick_navigation_buttons", page=page_or_section, default_global_value=false) == "true" %}
{% if macros_settings::evaluate_setting_priority(setting="quick_navigation_buttons", page=page_s, section=section_s, default_global_value=false) == "true" %}
<div id="button-container">
{# Button to go show a floating Table of Contents #}
{% if page_or_section.toc %}
@ -31,13 +36,13 @@
{% endif %}
{# Add KaTeX functionality #}
{%- if macros_settings::evaluate_setting_priority(setting="katex", page=page_or_section, default_global_value=false) == "true" -%}
{%- if macros_settings::evaluate_setting_priority(setting="katex", page=page_s, section=section_s, default_global_value=false) == "true" -%}
<link rel="stylesheet" href="{{ get_url(path='katex.min.css', trailing_slash=false) | safe }}">
<script defer src="{{ get_url(path='js/katex.min.js', trailing_slash=false) | safe }}"></script>
{%- endif -%}
{# Load mermaid.js #}
{%- if macros_settings::evaluate_setting_priority(setting="mermaid", page=page_or_section, default_global_value=false) == "true" -%}
{%- if macros_settings::evaluate_setting_priority(setting="mermaid", page=page_s, section=section_s, default_global_value=false) == "true" -%}
{%- if config.extra.serve_local_mermaid | default(value=true) -%}
<script defer src="{{ get_url(path='js/mermaid.min.js', trailing_slash=false) | safe }}"></script>
{%- else -%}
@ -46,7 +51,7 @@
{%- endif -%}
{# Add copy button to code blocks #}
{%- if macros_settings::evaluate_setting_priority(setting="copy_button", page=page_or_section, default_global_value=true) == "true" -%}
{%- if macros_settings::evaluate_setting_priority(setting="copy_button", page=page_s, section=section_s, default_global_value=true) == "true" -%}
{#- Add hidden HTML elements with the translated strings for the button's interactions -#}
<span id="copy-success" class="hidden">
{{ macros_translate::translate(key="copied", default="Copied!", language_strings=language_strings) }}
@ -58,11 +63,11 @@
{%- endif -%}
{# JavaScript to use the "Show source or path" on code blocks shortcode: https://welpo.github.io/tabi/blog/shortcodes/#show-source-or-path #}
{%- if macros_settings::evaluate_setting_priority(setting="add_src_to_code_block", page=page_or_section, default_global_value=false) == "true" -%}
{%- if macros_settings::evaluate_setting_priority(setting="add_src_to_code_block", page=page_s, section=section_s, default_global_value=false) == "true" -%}
<script defer src="{{ get_url(path='js/addSrcToCodeBlock.min.js', trailing_slash=false) | safe }}"></script>
{%- endif -%}
{# Add backlinks to footnotes #}
{%- if macros_settings::evaluate_setting_priority(setting="footnote_backlinks", page=page_or_section, default_global_value=false) == "true" -%}
{%- if macros_settings::evaluate_setting_priority(setting="footnote_backlinks", page=page_s, section=section_s, default_global_value=false) == "true" -%}
<script defer src="{{ get_url(path='js/footnoteBacklinks.min.js', trailing_slash=false | safe )}}"></script>
{%- endif -%}

View file

@ -8,17 +8,20 @@
{%- set blank_target = "" -%}
{%- endif -%}
{#- Feed icon -#}
{#- Zola 0.19.0 uses `generate_feeds`. Prior versions use `generate_feed` -#}
{%- set generate_feed = config.generate_feeds | default(value=config.generate_feed) -%}
{%- set feed_url = config.feed_filenames[0] | default(value=(config.feed_filename)) -%}
{%- set should_show_feed = generate_feed and config.extra.feed_icon and feed_url -%}
{%- set should_show_footer_icons = should_show_feed or config.extra.socials or config.extra.email -%}
<footer>
<section>
<nav class="socials nav-navs">
{%- if config.extra.socials or config.extra.email %}
{%- if should_show_footer_icons -%}
<ul>
{# Feed icon #}
{# Zola 0.19.0 uses `generate_feeds`. Prior versions use `generate_feed` #}
{% set generate_feed = config.generate_feeds | default(value=config.generate_feed) %}
{% set feed_url = config.feed_filenames[0] | default(value=(config.feed_filename)) %}
{%- if generate_feed and config.extra.feed_icon and feed_url -%}
{%- if should_show_feed -%}
<li>
<a class="nav-links no-hover-padding social" rel="{{ rel_attributes }}" {{ blank_target }} href="{{ get_url(path=feed_url, lang=lang, trailing_slash=false) | safe }}">
<img loading="lazy" alt="feed" title="feed" src="{{ get_url(path='/social_icons/rss.svg') }}">

View file

@ -1,5 +1,10 @@
<head>
<meta charset="UTF-8">
{%- if macros_settings::evaluate_setting_priority(setting="enable_csp", page=page | default(value=""), section=section | default(value=""), default_global_value="true") == "true" -%}
{%- include "partials/content_security_policy.html" -%}
{%- endif -%}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="base" content="{{ config.base_url | safe }}">
@ -11,7 +16,7 @@
<link rel="icon" type="image/png" href="{{ get_url(path=config.extra.favicon) }}"/>
{% endif %}
{% if config.extra.favicon_emoji %}
<link rel=icon href='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 105 55"><text y=".7em" font-size="82">{{ config.extra.favicon_emoji }}</text></svg>'>
<link rel=icon href='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y="50%" x="50%" dominant-baseline="central" text-anchor="middle" font-size="88">{{ config.extra.favicon_emoji }}</text></svg>'>
{% endif %}
{# Feeds #}
@ -36,13 +41,15 @@
{# CSS #}
{# Load subset of glyphs for header. Avoids flashing issue in Firefox #}
{% if config.extra.custom_subset and config.extra.custom_subset == true %}
{% if config.extra.enable_subset %}
{% if config.extra.custom_subset == true %}
<link rel="stylesheet" href="{{ get_url(path="custom_subset.css" , cachebust=true) }}">
{% elif lang == 'en' %}
<link rel="stylesheet" href="{{ get_url(path="inter_subset_en.css", cachebust=true ) }}">
{% elif lang == 'es' %}
<link rel="stylesheet" href="{{ get_url(path="inter_subset_es.css", cachebust=true ) }}">
{% endif %}
{% endif %}
{# Define array of CSS files to load. main.css is always loaded. #}
{%- set stylesheets = [ "main.css" ] -%}
@ -94,8 +101,6 @@
{% if is_404 %}
<meta name="robots" content="noindex, follow" />
{% else %}
<meta name="robots" content="index, nofollow" />
{% endif %}
<meta property="og:title" content="{{ page.title | default(value=config.title) | safe }}" />
@ -130,10 +135,6 @@
<meta property="og:site_name" content="{{ config.title }}">
{%- if macros_settings::evaluate_setting_priority(setting="enable_csp", page=page | default(value=""), section=section | default(value=""), default_global_value="true") == "true" -%}
{%- include "partials/content_security_policy.html" -%}
{%- endif -%}
{%- if config.extra.theme_switcher and config.extra.theme_switcher == true -%}
{# If JavaScript is disabled, hide the button. #}
<noscript><link rel="stylesheet" href="{{ get_url(path='no_js.css') | safe }}"/></noscript>

View file

@ -11,19 +11,28 @@
{% for menu in config.extra.menu %}
<li>
{% set trailing_slash = menu.trailing_slash | default(value=true) %}
{%- if menu.url is starting_with("http") -%}
{%- if trailing_slash -%}
<a class="nav-links no-hover-padding" href="{{ menu.url }}/">
{%- else -%}
<a class="nav-links no-hover-padding" href="{{ menu.url }}">
{%- endif -%}
{%- else -%}
<a class="nav-links no-hover-padding" href="{{ get_url(path=menu.url, lang=lang, trailing_slash=trailing_slash) }}">
{%- endif -%}
{{ macros_translate::translate(key=menu.name, default=menu.name, language_strings=language_strings) }}
</a>
</li>
{% endfor %}
{%- endif -%}
{#- Wrap the icons in a div to keep them all together -#}
<div class="nav-navs" id="menu-icons-group">
{#- Wrap the icons to keep them all together -#}
<li class="menu-icons-container">
<ul class="menu-icons-group">
{# Search #}
{%- if config.build_search_index %}
{%- set search_icon_title = macros_translate::translate(key='search_icon_title', default='Press $SHORTCUT to open search', language_strings=language_strings) -%}
<li class="js">
<li class="js menu-icon">
<div role="button" tabindex="0" id="search-button" class="search-icon interactive-icon" title="{{ search_icon_title }}" aria-label="{{ search_icon_title }}">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960">
<path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/>
@ -42,7 +51,8 @@
{%- if config.extra.theme_switcher and config.extra.theme_switcher == true -%}
{%- include "partials/theme_switcher.html" -%}
{%- endif -%}
</div>
</ul>
</li>
</ul>
</div>
{% endif %}

View file

@ -26,6 +26,10 @@
<main {% if more_than_one_section_shown %}class="{{ first_section }}-first"{% endif %}>
{%- if section.extra.header %}
{%- include "partials/home_banner.html" -%}
{%- elif section.content -%}
<section>
{{ section.content | safe }}
</section>
{% endif -%}
{% if section.extra.section_path -%}

View file

@ -0,0 +1,5 @@
{%- set text = text | default(value=body) -%}
<aside {% if position %}data-position="{{ position }}"{% endif %}>
{{ text | markdown | safe }}
</aside>

View file

@ -291,11 +291,15 @@ allowed_domains = [
# Can be set at page or section levels, following the hierarchy: page > section > config. See: https://welpo.github.io/tabi/blog/mastering-tabi-settings/#settings-hierarchy
enable_csp = true
# Custom subset of characters for the header.
# If set to true, the `static/custom_subset.css` file will be loaded first.
# This avoids a flashing text issue in Firefox.
# Please see https://welpo.github.io/tabi/blog/custom-font-subset/ to learn how to create this file.
# custom_subset = true
# Font subsetting configuration.
# This feature helps prevent text flashing in Firefox when using custom fonts.
# See: https://welpo.github.io/tabi/blog/custom-font-subset/
# Enable or disable font subsetting completely, both built-in and custom subsets.
enable_subset = true
# Use a custom subset of characters for the header.
# If true, tabi will load the `static/custom_subset.css` file.
# If false, tabi will use the default language-specific subset (English or Spanish).
custom_subset = true
[extra.analytics]
# Specify which analytics service you want to use.