judu/ex-egopublic Fork
⑂ 64f28fc
Commits
⬇ Clone ▾
git clone https://git.rickub.com/judu/ex-ego.git
git clone ssh://git@rickub.com/judu/ex-ego.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

docs: site de documentation Zola trilingue (écrans + trois histoires)Unverified

Nouveau site statique dans docs/site-documentation, publiable sur
ex-ego.durillon.family/documentation :

- Zola 0.23 (composants Tera, les shortcodes ayant disparu), français,
  anglais et allemand à parité, gabarit repris des tokens « Organic »
  de assets/style.css avec les polices sous-ensemblées en woff2.
- 15 pages « écrans » qui décrivent chaque écran et son intention, y
  compris le minuteur et les groupes de catégories, absents jusqu'ici
  de la doc du dépôt.
- 3 récits utilisateurs à la première personne, appuyés sur les groupes
  (le temps de présence avec le bébé), les équipes multiples et les
  tâches.
- Captures dans les trois langues (19 écrans + 10 extraits recadrés par
  langue) en JPEG XL avec repli PNG, produites par shots.mjs puis img.sh.
- seed.mjs étendu : groupe « Temps avec Alix », catégorie archivée et
  une tâche en cours prise par le compte de démonstration.
Julien Durillon committed 2026-08-11T13:40:47+02:00 Browse files
64f28fc parent: c798ab9
modified .gitignore +1 -0
@@ -1,2 +1,3 @@
11 /target
22 .clever.json
3+/_site
@@ -1,2 +1,3 @@
1 /target1 /target
2 .clever.json2 .clever.json
3+/_site
modified README.md +6 -0
@@ -97,6 +97,12 @@ front, une seule feuille de CSS.
9797 compte sur tous les appareils. Français par défaut à la création,
9898 modifiable par la variable d'environnement `DEFAULT_LANG`.
9999
100+## Documentation
101+
102+Un site de documentation trilingue décrit chaque écran, son intention, et
103+raconte trois usages réels : `docs/site-documentation` (site Zola, publié sur
104+[ex-ego.durillon.family/documentation](https://ex-ego.durillon.family/documentation)).
105+
100106 ## Captures d'écran
101107
102108 | | |
@@ -97,6 +97,12 @@ front, une seule feuille de CSS.
97 compte sur tous les appareils. Français par défaut à la création,97 compte sur tous les appareils. Français par défaut à la création,
98 modifiable par la variable d'environnement `DEFAULT_LANG`.98 modifiable par la variable d'environnement `DEFAULT_LANG`.
99 99
100+## Documentation
101+
102+Un site de documentation trilingue décrit chaque écran, son intention, et
103+raconte trois usages réels : `docs/site-documentation` (site Zola, publié sur
104+[ex-ego.durillon.family/documentation](https://ex-ego.durillon.family/documentation)).
105+
100 ## Captures d'écran106 ## Captures d'écran
101 107
102 | | |108 | | |
added docs/site-documentation/.gitignore +2 -0
new file mode 100644
@@ -0,0 +1,2 @@
1+public/
2+.zola-cache/
new file mode 100644
@@ -0,0 +1,2 @@
1+public/
2+.zola-cache/
added docs/site-documentation/DEPLOIEMENT.md +88 -0
new file mode 100644
@@ -0,0 +1,88 @@
1+# Déployer la documentation sur Clever Cloud
2+
3+La doc est servie par une **seconde application**, de type `static`, branchée
4+sur le domaine de production avec un préfixe de chemin :
5+`https://ex-ego.durillon.family/documentation`. L'application Rust
6+(`app_f7c88187-…`) garde la racine du domaine, elle n'est pas touchée.
7+
8+## Le point qui commande tout le reste
9+
10+Sur Clever Cloud, le routage par chemin **transmet le préfixe** à
11+l'application : une requête sur `ex-ego.durillon.family/documentation/ecrans/`
12+arrive côté statique en tant que `/documentation/ecrans/`. La sortie du build
13+doit donc vivre dans un dossier `documentation/`, et pas à la racine du
14+webroot. D'où la construction :
15+
16+```bash
17+cd docs/site-documentation
18+zola build --output-dir ../../_site/documentation
19+```
20+
21+soit un webroot `_site/` contenant un unique dossier `documentation/`. Le
22+`base_url` du `config.toml` porte déjà ce même sous-chemin, les deux doivent
23+rester d'accord.
24+
25+Vérification locale du montage complet :
26+
27+```bash
28+cd _site && python3 -m http.server 8099
29+curl -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8099/documentation/
30+```
31+
32+## Création de l'application (une seule fois)
33+
34+```bash
35+# Application statique, plus petite taille possible, dans l'org perso
36+clever create --type static ex-ego-doc --region par --alias doc
37+
38+# Construction : zola épinglé, téléchargé au build (le runtime statique sait
39+# détecter Zola tout seul, mais seulement si config.toml est à la racine du
40+# dépôt, ce qui n'est pas le cas ici — d'où la commande explicite)
41+clever env set --alias doc CC_BUILD_COMMAND \
42+ 'curl -sSL https://github.com/getzola/zola/releases/download/v0.23.2/zola-v0.23.2-x86_64-unknown-linux-gnu.tar.gz | tar -xz -C /tmp && cd docs/site-documentation && /tmp/zola build --output-dir ../../_site/documentation'
43+clever env set --alias doc CC_WEBROOT /_site
44+
45+# Le domaine de production, avec le chemin
46+clever domain add --alias doc ex-ego.durillon.family/documentation
47+
48+clever deploy --alias doc
49+```
50+
51+`clever create` ajoute un bloc dans `.clever.json`, qui est **ignoré par
52+git** : chaque poste refait son `clever link` si besoin.
53+
54+## Déploiements suivants
55+
56+```bash
57+clever deploy --alias doc # pousse le HEAD git, donc le parent du working copy jj
58+clever logs --alias doc # si le build échoue, la sortie de zola est là
59+```
60+
61+Les captures d'écran sont versionnées, le build ne fait que du HTML : il n'a
62+besoin ni de Chrome, ni de la base, ni de `cjxl`.
63+
64+## À vérifier après le premier déploiement
65+
66+1. `curl -sI https://ex-ego.durillon.family/documentation/img/fr/stats.jxl`
67+ doit renvoyer `content-type: image/jxl`. Si le serveur statique ne connaît
68+ pas l'extension et répond `application/octet-stream`, ajouter un
69+ `Caddyfile` (variables `CC_STATIC_SERVER=caddy` et `CC_STATIC_CADDYFILE`)
70+ qui pose le type sur `*.jxl`. Les navigateurs sans JPEG XL, eux, ne sont
71+ pas concernés : ils prennent le PNG de repli du `<picture>`.
72+2. La racine `https://ex-ego.durillon.family/` doit continuer à servir
73+ l'application Rust.
74+3. `https://ex-ego.durillon.family/documentation/en/` et `/de/` répondent, et
75+ le sélecteur de langue conserve la page courante.
76+
77+## Repli si le build distant pose problème
78+
79+Rien n'oblige à construire sur Clever. On peut construire en local et ne
80+pousser que le résultat, sur une branche dédiée :
81+
82+```bash
83+zola build --output-dir /chemin/vers/worktree/documentation
84+# commit dans la branche de publication, puis
85+clever deploy --alias doc --branch <branche>
86+```
87+
88+Dans ce cas, retirer `CC_BUILD_COMMAND` et laisser `CC_WEBROOT=/`.
new file mode 100644
@@ -0,0 +1,88 @@
1+# Déployer la documentation sur Clever Cloud
2+
3+La doc est servie par une **seconde application**, de type `static`, branchée
4+sur le domaine de production avec un préfixe de chemin :
5+`https://ex-ego.durillon.family/documentation`. L'application Rust
6+(`app_f7c88187-…`) garde la racine du domaine, elle n'est pas touchée.
7+
8+## Le point qui commande tout le reste
9+
10+Sur Clever Cloud, le routage par chemin **transmet le préfixe** à
11+l'application : une requête sur `ex-ego.durillon.family/documentation/ecrans/`
12+arrive côté statique en tant que `/documentation/ecrans/`. La sortie du build
13+doit donc vivre dans un dossier `documentation/`, et pas à la racine du
14+webroot. D'où la construction :
15+
16+```bash
17+cd docs/site-documentation
18+zola build --output-dir ../../_site/documentation
19+```
20+
21+soit un webroot `_site/` contenant un unique dossier `documentation/`. Le
22+`base_url` du `config.toml` porte déjà ce même sous-chemin, les deux doivent
23+rester d'accord.
24+
25+Vérification locale du montage complet :
26+
27+```bash
28+cd _site && python3 -m http.server 8099
29+curl -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8099/documentation/
30+```
31+
32+## Création de l'application (une seule fois)
33+
34+```bash
35+# Application statique, plus petite taille possible, dans l'org perso
36+clever create --type static ex-ego-doc --region par --alias doc
37+
38+# Construction : zola épinglé, téléchargé au build (le runtime statique sait
39+# détecter Zola tout seul, mais seulement si config.toml est à la racine du
40+# dépôt, ce qui n'est pas le cas ici — d'où la commande explicite)
41+clever env set --alias doc CC_BUILD_COMMAND \
42+ 'curl -sSL https://github.com/getzola/zola/releases/download/v0.23.2/zola-v0.23.2-x86_64-unknown-linux-gnu.tar.gz | tar -xz -C /tmp && cd docs/site-documentation && /tmp/zola build --output-dir ../../_site/documentation'
43+clever env set --alias doc CC_WEBROOT /_site
44+
45+# Le domaine de production, avec le chemin
46+clever domain add --alias doc ex-ego.durillon.family/documentation
47+
48+clever deploy --alias doc
49+```
50+
51+`clever create` ajoute un bloc dans `.clever.json`, qui est **ignoré par
52+git** : chaque poste refait son `clever link` si besoin.
53+
54+## Déploiements suivants
55+
56+```bash
57+clever deploy --alias doc # pousse le HEAD git, donc le parent du working copy jj
58+clever logs --alias doc # si le build échoue, la sortie de zola est là
59+```
60+
61+Les captures d'écran sont versionnées, le build ne fait que du HTML : il n'a
62+besoin ni de Chrome, ni de la base, ni de `cjxl`.
63+
64+## À vérifier après le premier déploiement
65+
66+1. `curl -sI https://ex-ego.durillon.family/documentation/img/fr/stats.jxl`
67+ doit renvoyer `content-type: image/jxl`. Si le serveur statique ne connaît
68+ pas l'extension et répond `application/octet-stream`, ajouter un
69+ `Caddyfile` (variables `CC_STATIC_SERVER=caddy` et `CC_STATIC_CADDYFILE`)
70+ qui pose le type sur `*.jxl`. Les navigateurs sans JPEG XL, eux, ne sont
71+ pas concernés : ils prennent le PNG de repli du `<picture>`.
72+2. La racine `https://ex-ego.durillon.family/` doit continuer à servir
73+ l'application Rust.
74+3. `https://ex-ego.durillon.family/documentation/en/` et `/de/` répondent, et
75+ le sélecteur de langue conserve la page courante.
76+
77+## Repli si le build distant pose problème
78+
79+Rien n'oblige à construire sur Clever. On peut construire en local et ne
80+pousser que le résultat, sur une branche dédiée :
81+
82+```bash
83+zola build --output-dir /chemin/vers/worktree/documentation
84+# commit dans la branche de publication, puis
85+clever deploy --alias doc --branch <branche>
86+```
87+
88+Dans ce cas, retirer `CC_BUILD_COMMAND` et laisser `CC_WEBROOT=/`.
added docs/site-documentation/README.md +73 -0
new file mode 100644
@@ -0,0 +1,73 @@
1+# Site de documentation d'Ex Ego
2+
3+Site statique **Zola** (≥ 0.23, qui a remplacé les shortcodes par les
4+composants Tera), trilingue français / anglais / allemand comme l'application,
5+publié sur `https://ex-ego.durillon.family/documentation`.
6+
7+```
8+config.toml base_url avec le sous-chemin, langues, chaînes du gabarit
9+content/ une page par écran (ecrans/) + trois récits (histoires/)
10+ fr = fichier nu, en/de = suffixe .en.md / .de.md
11+templates/ base + index/section/page + components.html
12+static/doc.css tokens « Organic » repris de assets/style.css
13+static/fonts/ Caprasimo + Figtree sous-ensemblés en woff2 (OFL)
14+static/img/<langue>/ captures, en JPEG XL et en PNG
15+shots.mjs produit les captures (3 langues)
16+img.sh encode les .jxl à côté des .png
17+```
18+
19+## Construire
20+
21+```bash
22+mise install zola@latest # ou tout autre moyen d'avoir zola ≥ 0.23
23+mise exec zola@latest -- zola build # sortie dans public/ (ignoré par git)
24+mise exec zola@latest -- zola serve --port 1112 # aperçu local
25+mise exec zola@latest -- zola check # liens internes et externes
26+```
27+
28+`zola serve` réécrit `base_url` tout seul : ne pas passer `--base-url`, il
29+recolle le port et fabrique une URL invalide.
30+
31+## Refaire les captures
32+
33+Les images sont versionnées : on ne les régénère que lorsque l'interface
34+bouge. Il faut un serveur exego branché sur la base **DEV** (jamais la prod),
35+seedé par `docs/slides/demo/seed.mjs`, et les dépendances node d'`a11y/`.
36+
37+```bash
38+# 1. base DEV seedée (le seed pose les catégories, les temps, les tâches,
39+# le groupe « Temps avec Alix » et la catégorie archivée)
40+node ../slides/demo/seed.mjs | psql -X "$DATABASE_URL"
41+
42+# 2. serveur local sur cette base, port 8090
43+
44+# 3. captures : login, bascule de langue, 19 écrans et 10 extraits par langue
45+CHROME=/usr/host/bin/google-chrome-stable TT_USER=camille TT_PASS=… node shots.mjs
46+
47+# 4. JPEG XL à côté des PNG
48+./img.sh
49+```
50+
51+Le script bascule la langue du compte de démonstration entre chaque passe et
52+le remet en français à la fin. Les pages anonymes (connexion, erreurs) sont
53+toujours rendues dans la langue par défaut de l'instance : elles sont
54+capturées une fois et recopiées dans les trois dossiers, ce que le texte des
55+pages concernées mentionne explicitement.
56+
57+## Écrire
58+
59+- Les images passent par les composants Tera de `templates/components.html`
60+ et **doivent recevoir la langue** : `{{<shot name="stats" alt="…"
61+ lang={lang} legende="…" />}}`. Un composant ne voit pas le contexte de la
62+ page appelante, d'où le paramètre.
63+- `shot` = capture pleine page, `extrait` = recadrage dans le fil du texte,
64+ `duo` = deux captures côte à côte, `apart` = encadré avec corps.
65+- Les liens internes portent la langue : depuis une page anglaise, écrire
66+ `@/ecrans/categories.en.md`. Sans le suffixe, Zola renvoie vers la version
67+ française.
68+- Conventions de rédaction : pas de tiret cadratin, le moins de listes à
69+ puces possible, tutoiement, et le même ton que l'application.
70+
71+## Déployer
72+
73+Voir [DEPLOIEMENT.md](DEPLOIEMENT.md).
new file mode 100644
@@ -0,0 +1,73 @@
1+# Site de documentation d'Ex Ego
2+
3+Site statique **Zola** (≥ 0.23, qui a remplacé les shortcodes par les
4+composants Tera), trilingue français / anglais / allemand comme l'application,
5+publié sur `https://ex-ego.durillon.family/documentation`.
6+
7+```
8+config.toml base_url avec le sous-chemin, langues, chaînes du gabarit
9+content/ une page par écran (ecrans/) + trois récits (histoires/)
10+ fr = fichier nu, en/de = suffixe .en.md / .de.md
11+templates/ base + index/section/page + components.html
12+static/doc.css tokens « Organic » repris de assets/style.css
13+static/fonts/ Caprasimo + Figtree sous-ensemblés en woff2 (OFL)
14+static/img/<langue>/ captures, en JPEG XL et en PNG
15+shots.mjs produit les captures (3 langues)
16+img.sh encode les .jxl à côté des .png
17+```
18+
19+## Construire
20+
21+```bash
22+mise install zola@latest # ou tout autre moyen d'avoir zola ≥ 0.23
23+mise exec zola@latest -- zola build # sortie dans public/ (ignoré par git)
24+mise exec zola@latest -- zola serve --port 1112 # aperçu local
25+mise exec zola@latest -- zola check # liens internes et externes
26+```
27+
28+`zola serve` réécrit `base_url` tout seul : ne pas passer `--base-url`, il
29+recolle le port et fabrique une URL invalide.
30+
31+## Refaire les captures
32+
33+Les images sont versionnées : on ne les régénère que lorsque l'interface
34+bouge. Il faut un serveur exego branché sur la base **DEV** (jamais la prod),
35+seedé par `docs/slides/demo/seed.mjs`, et les dépendances node d'`a11y/`.
36+
37+```bash
38+# 1. base DEV seedée (le seed pose les catégories, les temps, les tâches,
39+# le groupe « Temps avec Alix » et la catégorie archivée)
40+node ../slides/demo/seed.mjs | psql -X "$DATABASE_URL"
41+
42+# 2. serveur local sur cette base, port 8090
43+
44+# 3. captures : login, bascule de langue, 19 écrans et 10 extraits par langue
45+CHROME=/usr/host/bin/google-chrome-stable TT_USER=camille TT_PASS=… node shots.mjs
46+
47+# 4. JPEG XL à côté des PNG
48+./img.sh
49+```
50+
51+Le script bascule la langue du compte de démonstration entre chaque passe et
52+le remet en français à la fin. Les pages anonymes (connexion, erreurs) sont
53+toujours rendues dans la langue par défaut de l'instance : elles sont
54+capturées une fois et recopiées dans les trois dossiers, ce que le texte des
55+pages concernées mentionne explicitement.
56+
57+## Écrire
58+
59+- Les images passent par les composants Tera de `templates/components.html`
60+ et **doivent recevoir la langue** : `{{<shot name="stats" alt="…"
61+ lang={lang} legende="…" />}}`. Un composant ne voit pas le contexte de la
62+ page appelante, d'où le paramètre.
63+- `shot` = capture pleine page, `extrait` = recadrage dans le fil du texte,
64+ `duo` = deux captures côte à côte, `apart` = encadré avec corps.
65+- Les liens internes portent la langue : depuis une page anglaise, écrire
66+ `@/ecrans/categories.en.md`. Sans le suffixe, Zola renvoie vers la version
67+ française.
68+- Conventions de rédaction : pas de tiret cadratin, le moins de listes à
69+ puces possible, tutoiement, et le même ton que l'application.
70+
71+## Déployer
72+
73+Voir [DEPLOIEMENT.md](DEPLOIEMENT.md).
added docs/site-documentation/config.toml +85 -0
new file mode 100644
@@ -0,0 +1,85 @@
1+# Site de documentation d'Ex Ego — Zola.
2+#
3+# Construction : zola build (sortie dans public/)
4+# Aperçu local : zola serve --base-url http://127.0.0.1:1111
5+#
6+# base_url porte le sous-chemin de production : la doc est servie par une app
7+# statique Clever Cloud branchée sur ex-ego.durillon.family/documentation.
8+base_url = "https://ex-ego.durillon.family/documentation"
9+title = "Documentation d'Ex Ego"
10+description = "Compter le temps qu'on passe, à plusieurs, sans se compter dessus."
11+
12+default_language = "fr"
13+compile_sass = false
14+build_search_index = false
15+generate_feeds = false
16+minify_html = true
17+
18+taxonomies = []
19+
20+[markdown]
21+smart_punctuation = true
22+lazy_async_image = true
23+
24+[extra]
25+app_url = "https://ex-ego.durillon.family/"
26+repo_url = "https://github.com/judu/ex-ego"
27+langs = ["fr", "en", "de"]
28+
29+# Chaîne d'interface du gabarit (le contenu, lui, vit dans content/).
30+[translations]
31+skip = "Aller au contenu"
32+languages = "Langue"
33+lang_fr = "Français"
34+lang_en = "English"
35+lang_de = "Deutsch"
36+sections = "Sommaire du site"
37+summary = "Sommaire"
38+home = "Accueil"
39+pager = "Page précédente et suivante"
40+prev = "Précédent"
41+next = "Suivant"
42+footer = "Ex Ego est un logiciel libre, sous licence Unlicense."
43+open_app = "Ouvrir l'application"
44+
45+[languages.en]
46+title = "Ex Ego documentation"
47+description = "Track the time you spend, together, without keeping score."
48+generate_feeds = false
49+build_search_index = false
50+
51+[languages.en.translations]
52+skip = "Skip to content"
53+languages = "Language"
54+lang_fr = "Français"
55+lang_en = "English"
56+lang_de = "Deutsch"
57+sections = "Site contents"
58+summary = "Contents"
59+home = "Home"
60+pager = "Previous and next page"
61+prev = "Previous"
62+next = "Next"
63+footer = "Ex Ego is free software, released under the Unlicense."
64+open_app = "Open the app"
65+
66+[languages.de]
67+title = "Ex-Ego-Dokumentation"
68+description = "Die eigene Zeit gemeinsam erfassen, ohne sie gegeneinander aufzurechnen."
69+generate_feeds = false
70+build_search_index = false
71+
72+[languages.de.translations]
73+skip = "Zum Inhalt springen"
74+languages = "Sprache"
75+lang_fr = "Français"
76+lang_en = "English"
77+lang_de = "Deutsch"
78+sections = "Inhalt der Website"
79+summary = "Inhalt"
80+home = "Startseite"
81+pager = "Vorherige und nächste Seite"
82+prev = "Zurück"
83+next = "Weiter"
84+footer = "Ex Ego ist freie Software unter der Unlicense."
85+open_app = "Zur Anwendung"
new file mode 100644
@@ -0,0 +1,85 @@
1+# Site de documentation d'Ex Ego — Zola.
2+#
3+# Construction : zola build (sortie dans public/)
4+# Aperçu local : zola serve --base-url http://127.0.0.1:1111
5+#
6+# base_url porte le sous-chemin de production : la doc est servie par une app
7+# statique Clever Cloud branchée sur ex-ego.durillon.family/documentation.
8+base_url = "https://ex-ego.durillon.family/documentation"
9+title = "Documentation d'Ex Ego"
10+description = "Compter le temps qu'on passe, à plusieurs, sans se compter dessus."
11+
12+default_language = "fr"
13+compile_sass = false
14+build_search_index = false
15+generate_feeds = false
16+minify_html = true
17+
18+taxonomies = []
19+
20+[markdown]
21+smart_punctuation = true
22+lazy_async_image = true
23+
24+[extra]
25+app_url = "https://ex-ego.durillon.family/"
26+repo_url = "https://github.com/judu/ex-ego"
27+langs = ["fr", "en", "de"]
28+
29+# Chaîne d'interface du gabarit (le contenu, lui, vit dans content/).
30+[translations]
31+skip = "Aller au contenu"
32+languages = "Langue"
33+lang_fr = "Français"
34+lang_en = "English"
35+lang_de = "Deutsch"
36+sections = "Sommaire du site"
37+summary = "Sommaire"
38+home = "Accueil"
39+pager = "Page précédente et suivante"
40+prev = "Précédent"
41+next = "Suivant"
42+footer = "Ex Ego est un logiciel libre, sous licence Unlicense."
43+open_app = "Ouvrir l'application"
44+
45+[languages.en]
46+title = "Ex Ego documentation"
47+description = "Track the time you spend, together, without keeping score."
48+generate_feeds = false
49+build_search_index = false
50+
51+[languages.en.translations]
52+skip = "Skip to content"
53+languages = "Language"
54+lang_fr = "Français"
55+lang_en = "English"
56+lang_de = "Deutsch"
57+sections = "Site contents"
58+summary = "Contents"
59+home = "Home"
60+pager = "Previous and next page"
61+prev = "Previous"
62+next = "Next"
63+footer = "Ex Ego is free software, released under the Unlicense."
64+open_app = "Open the app"
65+
66+[languages.de]
67+title = "Ex-Ego-Dokumentation"
68+description = "Die eigene Zeit gemeinsam erfassen, ohne sie gegeneinander aufzurechnen."
69+generate_feeds = false
70+build_search_index = false
71+
72+[languages.de.translations]
73+skip = "Zum Inhalt springen"
74+languages = "Sprache"
75+lang_fr = "Français"
76+lang_en = "English"
77+lang_de = "Deutsch"
78+sections = "Inhalt der Website"
79+summary = "Inhalt"
80+home = "Startseite"
81+pager = "Vorherige und nächste Seite"
82+prev = "Zurück"
83+next = "Weiter"
84+footer = "Ex Ego ist freie Software unter der Unlicense."
85+open_app = "Zur Anwendung"
added docs/site-documentation/content/_index.de.md +41 -0
new file mode 100644
@@ -0,0 +1,41 @@
1++++
2+title = "Ex Ego"
3+description = "Die eigene Zeit gemeinsam erfassen, ohne sie gegeneinander aufzurechnen."
4+sort_by = "weight"
5+template = "index.html"
6++++
7+
8+Ex Ego ist eine kleine Webanwendung, in der man die Zeit notiert, die man für
9+Dinge aufwendet, Kategorie für Kategorie, und danach anschaut, was daraus für
10+eine ganze Gruppe wird. Ein Haushalt, ein Verein, eine
11+Eigentümergemeinschaft: überall dort, wo mehrere Menschen gemeinsam etwas tun,
12+ohne dass jemand die anderen führt.
13+
14+Es gibt keine Administratorrolle. Alle Mitglieder eines Teams haben genau
15+dieselben Rechte: das Team umbenennen, jemanden einladen, eine Kategorie
16+anlegen, eine Aufgabe korrigieren. Das Einzige, was dir allein gehört, sind
17+deine eigenen Zeiteinträge, die sonst niemand ändern kann.
18+
19+## Fünf Wörter, die man kennen sollte
20+
21+Ein **Team** versammelt Menschen und alles, was sie gemeinsam zählen. Du kannst
22+mehreren Teams angehören und zwischen ihnen wechseln: die gesamte Oberfläche
23+folgt dem aktiven Team, Farben inbegriffen.
24+
25+Eine **Kategorie** ist das, worauf Zeit gezählt wird, zum Beispiel Kochen,
26+Einkaufen oder Sitzungen. Sie gehört dem Team und nicht dir, und alle dürfen
27+neue anlegen. Wird eine Kategorie nicht mehr gebraucht, archiviert man sie: sie
28+verschwindet aus den Eingabelisten, die bereits erfassten Zeiten bleiben aber
29+in der Statistik.
30+
31+Ein **Zeiteintrag** ist eine Anzahl Minuten, an eine Kategorie und ein Datum
32+geheftet. Es gibt keine Anfangszeit, keine Endzeit und keine Obergrenze. Ein
33+Eintrag gehört dir: nur du kannst ihn korrigieren oder löschen.
34+
35+Eine **Gruppe** stellt bestimmte Kategorien beiseite. Ihre Zeit verlässt die
36+Team-Statistik und lebt in einer eigenen Ansicht. Das ist für ein Thema
37+gedacht, das man verfolgen will, ohne dass es alles andere erdrückt.
38+
39+Eine **Aufgabe** ist etwas zu Erledigendes, mit Datum, an eine Kategorie
40+gebunden. Man übernimmt sie, man schließt sie ab, und die Anwendung schlägt
41+danach vor, sie im beobachteten Rhythmus erneut anzusetzen.
new file mode 100644
@@ -0,0 +1,41 @@
1++++
2+title = "Ex Ego"
3+description = "Die eigene Zeit gemeinsam erfassen, ohne sie gegeneinander aufzurechnen."
4+sort_by = "weight"
5+template = "index.html"
6++++
7+
8+Ex Ego ist eine kleine Webanwendung, in der man die Zeit notiert, die man für
9+Dinge aufwendet, Kategorie für Kategorie, und danach anschaut, was daraus für
10+eine ganze Gruppe wird. Ein Haushalt, ein Verein, eine
11+Eigentümergemeinschaft: überall dort, wo mehrere Menschen gemeinsam etwas tun,
12+ohne dass jemand die anderen führt.
13+
14+Es gibt keine Administratorrolle. Alle Mitglieder eines Teams haben genau
15+dieselben Rechte: das Team umbenennen, jemanden einladen, eine Kategorie
16+anlegen, eine Aufgabe korrigieren. Das Einzige, was dir allein gehört, sind
17+deine eigenen Zeiteinträge, die sonst niemand ändern kann.
18+
19+## Fünf Wörter, die man kennen sollte
20+
21+Ein **Team** versammelt Menschen und alles, was sie gemeinsam zählen. Du kannst
22+mehreren Teams angehören und zwischen ihnen wechseln: die gesamte Oberfläche
23+folgt dem aktiven Team, Farben inbegriffen.
24+
25+Eine **Kategorie** ist das, worauf Zeit gezählt wird, zum Beispiel Kochen,
26+Einkaufen oder Sitzungen. Sie gehört dem Team und nicht dir, und alle dürfen
27+neue anlegen. Wird eine Kategorie nicht mehr gebraucht, archiviert man sie: sie
28+verschwindet aus den Eingabelisten, die bereits erfassten Zeiten bleiben aber
29+in der Statistik.
30+
31+Ein **Zeiteintrag** ist eine Anzahl Minuten, an eine Kategorie und ein Datum
32+geheftet. Es gibt keine Anfangszeit, keine Endzeit und keine Obergrenze. Ein
33+Eintrag gehört dir: nur du kannst ihn korrigieren oder löschen.
34+
35+Eine **Gruppe** stellt bestimmte Kategorien beiseite. Ihre Zeit verlässt die
36+Team-Statistik und lebt in einer eigenen Ansicht. Das ist für ein Thema
37+gedacht, das man verfolgen will, ohne dass es alles andere erdrückt.
38+
39+Eine **Aufgabe** ist etwas zu Erledigendes, mit Datum, an eine Kategorie
40+gebunden. Man übernimmt sie, man schließt sie ab, und die Anwendung schlägt
41+danach vor, sie im beobachteten Rhythmus erneut anzusetzen.
added docs/site-documentation/content/_index.en.md +39 -0
new file mode 100644
@@ -0,0 +1,39 @@
1++++
2+title = "Ex Ego"
3+description = "Track the time you spend, together, without keeping score."
4+sort_by = "weight"
5+template = "index.html"
6++++
7+
8+Ex Ego is a small web application where you note the time you spend on things,
9+one category at a time, and then look at what it adds up to for a whole group.
10+A household, an association, a building committee: anywhere several people do
11+things together without anyone being in charge of the others.
12+
13+There is no administrator role. Every member of a team has exactly the same
14+powers: rename the team, invite someone, create a category, fix a task. The
15+only thing that is yours alone is your own time entries, which nobody else can
16+change.
17+
18+## Five words worth knowing
19+
20+A **team** gathers people and everything they count together. You can belong to
21+several teams and switch between them: the whole interface follows the active
22+team, colours included.
23+
24+A **category** is what you count time on, for instance Cooking, Groceries or
25+Meetings. It belongs to the team rather than to you, and anyone can create one.
26+When a category stops being useful you archive it: it leaves the entry lists,
27+but the time already recorded stays in the statistics.
28+
29+A **time entry** is a number of minutes, attached to a category and to a date.
30+There is no start time, no end time and no ceiling. An entry belongs to you:
31+you alone can correct or delete it.
32+
33+A **group** sets some categories apart. Their time leaves the team statistics
34+and lives in a panel of its own. It exists for a subject you want to follow
35+without letting it crush everything else.
36+
37+A **task** is something to do, dated, attached to a category. You take it, you
38+finish it, and the application then offers to schedule it again at the rhythm
39+it has observed.
new file mode 100644
@@ -0,0 +1,39 @@
1++++
2+title = "Ex Ego"
3+description = "Track the time you spend, together, without keeping score."
4+sort_by = "weight"
5+template = "index.html"
6++++
7+
8+Ex Ego is a small web application where you note the time you spend on things,
9+one category at a time, and then look at what it adds up to for a whole group.
10+A household, an association, a building committee: anywhere several people do
11+things together without anyone being in charge of the others.
12+
13+There is no administrator role. Every member of a team has exactly the same
14+powers: rename the team, invite someone, create a category, fix a task. The
15+only thing that is yours alone is your own time entries, which nobody else can
16+change.
17+
18+## Five words worth knowing
19+
20+A **team** gathers people and everything they count together. You can belong to
21+several teams and switch between them: the whole interface follows the active
22+team, colours included.
23+
24+A **category** is what you count time on, for instance Cooking, Groceries or
25+Meetings. It belongs to the team rather than to you, and anyone can create one.
26+When a category stops being useful you archive it: it leaves the entry lists,
27+but the time already recorded stays in the statistics.
28+
29+A **time entry** is a number of minutes, attached to a category and to a date.
30+There is no start time, no end time and no ceiling. An entry belongs to you:
31+you alone can correct or delete it.
32+
33+A **group** sets some categories apart. Their time leaves the team statistics
34+and lives in a panel of its own. It exists for a subject you want to follow
35+without letting it crush everything else.
36+
37+A **task** is something to do, dated, attached to a category. You take it, you
38+finish it, and the application then offers to schedule it again at the rhythm
39+it has observed.
added docs/site-documentation/content/_index.md +40 -0
new file mode 100644
@@ -0,0 +1,40 @@
1++++
2+title = "Ex Ego"
3+description = "Compter le temps qu'on passe, à plusieurs, sans se compter dessus."
4+sort_by = "weight"
5+template = "index.html"
6++++
7+
8+Ex Ego est une petite application web où l'on note le temps qu'on passe sur les
9+choses, catégorie par catégorie, et où l'on regarde ensuite ce que ça donne à
10+l'échelle d'un groupe. Un foyer, une association, une copropriété : partout où
11+plusieurs personnes font des choses ensemble sans que personne ne dirige les
12+autres.
13+
14+Il n'y a pas de rôle d'administrateur. Tous les membres d'une équipe ont
15+exactement les mêmes droits : renommer l'équipe, inviter quelqu'un, créer une
16+catégorie, corriger une tâche. La seule chose qui t'appartienne en propre, ce
17+sont tes saisies de temps, que personne d'autre ne peut modifier.
18+
19+## Cinq mots à connaître
20+
21+Une **équipe** rassemble des personnes et tout ce qu'elles comptent ensemble.
22+Tu peux appartenir à plusieurs équipes et basculer de l'une à l'autre : toute
23+l'interface suit l'équipe active, y compris les couleurs.
24+
25+Une **catégorie** est ce sur quoi on compte du temps, par exemple Cuisine,
26+Courses ou Réunions. Elle appartient à l'équipe, pas à toi, et tout le monde
27+peut en créer. Quand une catégorie ne sert plus, on l'archive : elle quitte les
28+listes de saisie mais les temps déjà notés restent dans les statistiques.
29+
30+Un **temps** est une durée en minutes, posée sur une catégorie et sur une date.
31+Il n'y a ni heure de début ni heure de fin, ni plafond. Un temps t'appartient :
32+toi seul peux le corriger ou le supprimer.
33+
34+Un **groupe** met certaines catégories à part. Leur temps sort des
35+statistiques de l'équipe et se lit dans un panneau qui n'appartient qu'à lui.
36+C'est fait pour un sujet qu'on veut suivre sans qu'il écrase tout le reste.
37+
38+Une **tâche** est une chose à faire, datée, rattachée à une catégorie. On la
39+prend, on la termine, et l'application propose alors de la reprogrammer au
40+rythme constaté.
new file mode 100644
@@ -0,0 +1,40 @@
1++++
2+title = "Ex Ego"
3+description = "Compter le temps qu'on passe, à plusieurs, sans se compter dessus."
4+sort_by = "weight"
5+template = "index.html"
6++++
7+
8+Ex Ego est une petite application web où l'on note le temps qu'on passe sur les
9+choses, catégorie par catégorie, et où l'on regarde ensuite ce que ça donne à
10+l'échelle d'un groupe. Un foyer, une association, une copropriété : partout où
11+plusieurs personnes font des choses ensemble sans que personne ne dirige les
12+autres.
13+
14+Il n'y a pas de rôle d'administrateur. Tous les membres d'une équipe ont
15+exactement les mêmes droits : renommer l'équipe, inviter quelqu'un, créer une
16+catégorie, corriger une tâche. La seule chose qui t'appartienne en propre, ce
17+sont tes saisies de temps, que personne d'autre ne peut modifier.
18+
19+## Cinq mots à connaître
20+
21+Une **équipe** rassemble des personnes et tout ce qu'elles comptent ensemble.
22+Tu peux appartenir à plusieurs équipes et basculer de l'une à l'autre : toute
23+l'interface suit l'équipe active, y compris les couleurs.
24+
25+Une **catégorie** est ce sur quoi on compte du temps, par exemple Cuisine,
26+Courses ou Réunions. Elle appartient à l'équipe, pas à toi, et tout le monde
27+peut en créer. Quand une catégorie ne sert plus, on l'archive : elle quitte les
28+listes de saisie mais les temps déjà notés restent dans les statistiques.
29+
30+Un **temps** est une durée en minutes, posée sur une catégorie et sur une date.
31+Il n'y a ni heure de début ni heure de fin, ni plafond. Un temps t'appartient :
32+toi seul peux le corriger ou le supprimer.
33+
34+Un **groupe** met certaines catégories à part. Leur temps sort des
35+statistiques de l'équipe et se lit dans un panneau qui n'appartient qu'à lui.
36+C'est fait pour un sujet qu'on veut suivre sans qu'il écrase tout le reste.
37+
38+Une **tâche** est une chose à faire, datée, rattachée à une catégorie. On la
39+prend, on la termine, et l'application propose alors de la reprogrammer au
40+rythme constaté.
added docs/site-documentation/content/ecrans/_index.de.md +9 -0
new file mode 100644
@@ -0,0 +1,9 @@
1++++
2+title = "Die Bildschirme"
3+description = "Der vollständige Rundgang durch die Anwendung, Bildschirm für Bildschirm."
4+weight = 1
5+sort_by = "weight"
6++++
7+
8+Die Anwendung besteht aus vier Reitern und einer Handvoll Nebenbildschirmen.
9+Jede Seite hier beschreibt einen Bildschirm.
new file mode 100644
@@ -0,0 +1,9 @@
1++++
2+title = "Die Bildschirme"
3+description = "Der vollständige Rundgang durch die Anwendung, Bildschirm für Bildschirm."
4+weight = 1
5+sort_by = "weight"
6++++
7+
8+Die Anwendung besteht aus vier Reitern und einer Handvoll Nebenbildschirmen.
9+Jede Seite hier beschreibt einen Bildschirm.
added docs/site-documentation/content/ecrans/_index.en.md +9 -0
new file mode 100644
@@ -0,0 +1,9 @@
1++++
2+title = "The screens"
3+description = "The complete tour of the application, screen by screen"
4+weight = 1
5+sort_by = "weight"
6++++
7+
8+The application fits into four tabs and a handful of secondary screens.
9+Each page below describes one screen.
new file mode 100644
@@ -0,0 +1,9 @@
1++++
2+title = "The screens"
3+description = "The complete tour of the application, screen by screen"
4+weight = 1
5+sort_by = "weight"
6++++
7+
8+The application fits into four tabs and a handful of secondary screens.
9+Each page below describes one screen.
added docs/site-documentation/content/ecrans/_index.md +9 -0
new file mode 100644
@@ -0,0 +1,9 @@
1++++
2+title = "Les écrans"
3+description = "Le tour complet de l'application, écran par écran, avec l'intention de chacun."
4+weight = 1
5+sort_by = "weight"
6++++
7+
8+L'application tient en quatre onglets et une poignée d'écrans secondaires.
9+Chaque page ci-dessous décrit un écran.
new file mode 100644
@@ -0,0 +1,9 @@
1++++
2+title = "Les écrans"
3+description = "Le tour complet de l'application, écran par écran, avec l'intention de chacun."
4+weight = 1
5+sort_by = "weight"
6++++
7+
8+L'application tient en quatre onglets et une poignée d'écrans secondaires.
9+Chaque page ci-dessous décrit un écran.
added docs/site-documentation/content/ecrans/ajouter.de.md +36 -0
new file mode 100644
@@ -0,0 +1,36 @@
1++++
2+title = "Zeit hinzufügen"
3+description = "Die Weggabelung des Hinzufügen-Reiters: ab jetzt zählen, oder Erledigtes nachtragen."
4+weight = 3
5++++
6+
7+{{<shot name="ajouter-choix" alt="Hinzufügen-Bildschirm: zwei große Karten, „Stoppuhr starten“ und „Zeit hinzufügen“, darunter ein Link „Kategorien verwalten“." lang={lang} legende="Zwei Arten zu zählen, eine Entscheidung pro Geste." />}}
8+
9+Der Hinzufügen-Reiter beginnt mit einer kurzen Frage: zähle ich ab jetzt, oder
10+trage ich etwas nach, das schon getan ist?
11+
12+## Warum zwei Wege
13+
14+Zwei verschiedene Situationen:
15+- Ich will gleich etwas tun und denke daran, es zu messen: ich starte die
16+ Stoppuhr jetzt.
17+- Ich habe etwas getan, beim Anfangen kurz auf die Uhr geschaut, und schätze
18+ auf fünf Minuten genau, wie lange es gedauert hat.
19+
20+Die Stoppuhr fragt am Anfang nicht nach der Kategorie: die wählt man beim
21+Anhalten. Das ist Absicht, denn beim Beginnen will man drücken und losgehen,
22+und weil man immer besser weiß, was man getan hat, wenn es getan ist.
23+
24+## Kategorien verwalten
25+
26+Der Link zur Kategorienverwaltung lebt auf diesem Bildschirm, zusätzlich zu den
27+Einstellungen. Er steht auch auf der Seite der Kategorienauswahl, in dem
28+Moment, in dem man merkt, dass eine fehlt.
29+
30+## Wenn schon eine Stoppuhr läuft
31+
32+Läuft im aktiven Team bereits eine Stoppuhr, verschwindet dieser
33+Auswahlbildschirm: der Hinzufügen-Reiter wird direkt zum
34+[Stoppuhr-Bildschirm](@/ecrans/minuteur.de.md). Zwei Messungen gleichzeitig gibt
35+es nicht, und die Anwendung zeigt lieber die laufende, als eine zweite
36+anzubieten.
new file mode 100644
@@ -0,0 +1,36 @@
1++++
2+title = "Zeit hinzufügen"
3+description = "Die Weggabelung des Hinzufügen-Reiters: ab jetzt zählen, oder Erledigtes nachtragen."
4+weight = 3
5++++
6+
7+{{<shot name="ajouter-choix" alt="Hinzufügen-Bildschirm: zwei große Karten, „Stoppuhr starten“ und „Zeit hinzufügen“, darunter ein Link „Kategorien verwalten“." lang={lang} legende="Zwei Arten zu zählen, eine Entscheidung pro Geste." />}}
8+
9+Der Hinzufügen-Reiter beginnt mit einer kurzen Frage: zähle ich ab jetzt, oder
10+trage ich etwas nach, das schon getan ist?
11+
12+## Warum zwei Wege
13+
14+Zwei verschiedene Situationen:
15+- Ich will gleich etwas tun und denke daran, es zu messen: ich starte die
16+ Stoppuhr jetzt.
17+- Ich habe etwas getan, beim Anfangen kurz auf die Uhr geschaut, und schätze
18+ auf fünf Minuten genau, wie lange es gedauert hat.
19+
20+Die Stoppuhr fragt am Anfang nicht nach der Kategorie: die wählt man beim
21+Anhalten. Das ist Absicht, denn beim Beginnen will man drücken und losgehen,
22+und weil man immer besser weiß, was man getan hat, wenn es getan ist.
23+
24+## Kategorien verwalten
25+
26+Der Link zur Kategorienverwaltung lebt auf diesem Bildschirm, zusätzlich zu den
27+Einstellungen. Er steht auch auf der Seite der Kategorienauswahl, in dem
28+Moment, in dem man merkt, dass eine fehlt.
29+
30+## Wenn schon eine Stoppuhr läuft
31+
32+Läuft im aktiven Team bereits eine Stoppuhr, verschwindet dieser
33+Auswahlbildschirm: der Hinzufügen-Reiter wird direkt zum
34+[Stoppuhr-Bildschirm](@/ecrans/minuteur.de.md). Zwei Messungen gleichzeitig gibt
35+es nicht, und die Anwendung zeigt lieber die laufende, als eine zweite
36+anzubieten.
added docs/site-documentation/content/ecrans/ajouter.en.md +34 -0
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Adding time"
3+description = "The crossroads of the Add tab: count from now, or write down what is already done."
4+weight = 3
5++++
6+
7+{{<shot name="ajouter-choix" alt="Add screen: two large cards, “Start the timer” and “Add time”, then a “Manage categories” link." lang={lang} legende="Two ways of counting, one decision per gesture." />}}
8+
9+The Add tab opens on a short question: am I counting from now, or writing down
10+something already done?
11+
12+## Why two paths
13+
14+Two different situations:
15+- I am about to do something and I think of timing it: I start the timer now.
16+- I have done something, I glanced at the clock when I started, and I can
17+ estimate to within five minutes how long it took me.
18+
19+The timer does not ask for a category up front: you choose it when you stop the
20+timer. That is deliberate, because when you start something you want to press
21+and go, and because you always know better what you did once it is done.
22+
23+## Managing categories
24+
25+The link to category management lives on this screen, on top of the settings.
26+It will also sit on the category choice page, at the moment you realise one is
27+missing.
28+
29+## When a timer is already running
30+
31+If a timer is running in the active team, this choice screen disappears: the
32+Add tab becomes [the timer screen](@/ecrans/minuteur.en.md) directly. There cannot
33+be two measurements at once, and the application would rather show the one that
34+is running than offer a second.
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Adding time"
3+description = "The crossroads of the Add tab: count from now, or write down what is already done."
4+weight = 3
5++++
6+
7+{{<shot name="ajouter-choix" alt="Add screen: two large cards, “Start the timer” and “Add time”, then a “Manage categories” link." lang={lang} legende="Two ways of counting, one decision per gesture." />}}
8+
9+The Add tab opens on a short question: am I counting from now, or writing down
10+something already done?
11+
12+## Why two paths
13+
14+Two different situations:
15+- I am about to do something and I think of timing it: I start the timer now.
16+- I have done something, I glanced at the clock when I started, and I can
17+ estimate to within five minutes how long it took me.
18+
19+The timer does not ask for a category up front: you choose it when you stop the
20+timer. That is deliberate, because when you start something you want to press
21+and go, and because you always know better what you did once it is done.
22+
23+## Managing categories
24+
25+The link to category management lives on this screen, on top of the settings.
26+It will also sit on the category choice page, at the moment you realise one is
27+missing.
28+
29+## When a timer is already running
30+
31+If a timer is running in the active team, this choice screen disappears: the
32+Add tab becomes [the timer screen](@/ecrans/minuteur.en.md) directly. There cannot
33+be two measurements at once, and the application would rather show the one that
34+is running than offer a second.
added docs/site-documentation/content/ecrans/ajouter.md +36 -0
new file mode 100644
@@ -0,0 +1,36 @@
1++++
2+title = "Ajouter du temps"
3+description = "Le carrefour de l'onglet Ajouter : compter maintenant, ou noter après coup."
4+weight = 3
5++++
6+
7+{{<shot name="ajouter-choix" alt="Écran Ajouter : deux grandes cartes, « Lancer le minuteur » et « Ajouter du temps », puis un lien « Gérer les catégories »." lang={lang} legende="Deux façons de compter, une décision par geste." />}}
8+
9+L'onglet Ajouter s'ouvre sur une question courte : est-ce que je compte
10+maintenant, ou est-ce que je note quelque chose de déjà fait ?
11+
12+## Pourquoi deux chemins
13+
14+Deux situations différentes:
15+- Je m’apprête à faire une tâche et je pense à minuter : je le lance maintenant.
16+- J’ai fait une tâche, j’ai regardé vite fait l’heure en commençant, j’estime à 5 minutes
17+ près le temps qu’elle m’a pris.
18+
19+Le minuteur ne demande pas la catégorie au départ : c'est en l'arrêtant qu'on
20+la choisira. C'est volontaire, parce qu'au moment de commencer une tâche on
21+veut appuyer et partir, et parce qu'on sait mieux ce qu'on a fait une fois que
22+c'est fait.
23+
24+## Gérer les catégories
25+
26+Le lien vers la gestion des catégories vit sur cet écran, en plus des réglages.
27+Il sera aussi sur la page de choix de catégorie, au moment où on réalise qu’il en manque
28+une.
29+
30+## Quand un minuteur tourne déjà
31+
32+Si un minuteur est en cours dans l'équipe active, cet écran de choix
33+disparaît : l'onglet Ajouter devient directement [l'écran du
34+minuteur](@/ecrans/minuteur.md). Il ne peut pas y avoir deux mesures en même
35+temps, et l'application préfère montrer celle qui court plutôt que d'en
36+proposer une seconde.
new file mode 100644
@@ -0,0 +1,36 @@
1++++
2+title = "Ajouter du temps"
3+description = "Le carrefour de l'onglet Ajouter : compter maintenant, ou noter après coup."
4+weight = 3
5++++
6+
7+{{<shot name="ajouter-choix" alt="Écran Ajouter : deux grandes cartes, « Lancer le minuteur » et « Ajouter du temps », puis un lien « Gérer les catégories »." lang={lang} legende="Deux façons de compter, une décision par geste." />}}
8+
9+L'onglet Ajouter s'ouvre sur une question courte : est-ce que je compte
10+maintenant, ou est-ce que je note quelque chose de déjà fait ?
11+
12+## Pourquoi deux chemins
13+
14+Deux situations différentes:
15+- Je m’apprête à faire une tâche et je pense à minuter : je le lance maintenant.
16+- J’ai fait une tâche, j’ai regardé vite fait l’heure en commençant, j’estime à 5 minutes
17+ près le temps qu’elle m’a pris.
18+
19+Le minuteur ne demande pas la catégorie au départ : c'est en l'arrêtant qu'on
20+la choisira. C'est volontaire, parce qu'au moment de commencer une tâche on
21+veut appuyer et partir, et parce qu'on sait mieux ce qu'on a fait une fois que
22+c'est fait.
23+
24+## Gérer les catégories
25+
26+Le lien vers la gestion des catégories vit sur cet écran, en plus des réglages.
27+Il sera aussi sur la page de choix de catégorie, au moment où on réalise qu’il en manque
28+une.
29+
30+## Quand un minuteur tourne déjà
31+
32+Si un minuteur est en cours dans l'équipe active, cet écran de choix
33+disparaît : l'onglet Ajouter devient directement [l'écran du
34+minuteur](@/ecrans/minuteur.md). Il ne peut pas y avoir deux mesures en même
35+temps, et l'application préfère montrer celle qui court plutôt que d'en
36+proposer une seconde.
added docs/site-documentation/content/ecrans/cadre.de.md +47 -0
new file mode 100644
@@ -0,0 +1,47 @@
1++++
2+title = "Der gemeinsame Rahmen"
3+description = "Kopfzeile, Reiterleiste und Team-Wechsel, überall vorhanden."
4+weight = 1
5++++
6+
7+Alle Seiten außer der Anmeldung und den Fehlerseiten teilen sich denselben
8+Rahmen. Ihn einmal zu lernen genügt, um sich überall zurechtzufinden.
9+
10+## Oben: wo ich bin und wer ich bin
11+
12+{{<extrait name="x-entete" alt="Kopfzeile: grüne Pille des Teams Maison links, Benutzername rechts, Seitentitel darunter." lang={lang} legende="Die Kopfzeile beantwortet zwei Fragen, bevor man die Seite überhaupt liest." />}}
13+
14+Die Pille links trägt den Namen des aktiven Teams, in dessen Farbe getönt.
15+Diese Farbe wird aus der Kennung des Teams berechnet: sie lässt sich nicht
16+einstellen, ändert sich aber auch nie, und wird damit zu einem verlässlichen
17+Anker, wenn man zwischen zwei Teams jongliert. Der Benutzername rechts erinnert
18+daran, unter welchem Konto geschrieben wird, eine Kleinigkeit, die zählt, wenn
19+das Telefon auf dem Küchentisch liegt und von allen benutzt wird.
20+
21+Die Absicht ist einfach: kein Eintrag soll aus Unachtsamkeit im falschen Team
22+landen. Also steht die Antwort dauerhaft da, statt in einem Menü zu stecken.
23+
24+## Team wechseln
25+
26+Ein Tippen auf die Pille öffnet ein Blatt, das von unten hereinfährt und die
27+Teams auflistet, denen ich angehöre.
28+
29+{{<shot name="equipes" alt="Das Blatt „Team wechseln“ über dem Hinzufügen-Bildschirm, mit der Liste der Teams." lang={lang} legende="Das Blatt ist ein Anker in der Seite: es öffnet sich auch ohne JavaScript." />}}
30+
31+Das aktive Team wird nicht in der Datenbank gespeichert, es ist eine
32+Einstellung des Geräts. Das Telefon kann also beim Haushalt bleiben, während
33+der Laptop beim Verein bleibt, ohne dass sich beide in die Quere kommen.
34+
35+## Unten: die vier Reiter
36+
37+{{<extrait name="x-tabbar" alt="Reiterleiste: Hinzufügen, Statistik, Aufgaben mit einer 3 als Zähler, Einstellungen mit einer 1." lang={lang} legende="Die Zähler zählen offene Aufgaben und erhaltene Einladungen." />}}
38+
39+Die Leiste klebt unten, in Daumenreichweite. Nur vier Reiter, und ihre
40+Reihenfolge folgt der Häufigkeit: Zeit trägt man oft ein, Statistiken schaut
41+man regelmäßig an, Aufgaben pflegt man ab und zu, in die Einstellungen geht man
42+selten.
43+
44+Zwei wichtige Bildschirme haben bewusst keinen Reiter. „Meine Zeiten“
45+erreicht man aus der Statistik und aus den Einstellungen, denn man geht dorthin
46+zum Korrigieren, nicht zum Stöbern. „Kategorien“ erreicht man aus dem
47+Hinzufügen-Reiter, genau dort, wo eine fehlende Kategorie auffällt.
new file mode 100644
@@ -0,0 +1,47 @@
1++++
2+title = "Der gemeinsame Rahmen"
3+description = "Kopfzeile, Reiterleiste und Team-Wechsel, überall vorhanden."
4+weight = 1
5++++
6+
7+Alle Seiten außer der Anmeldung und den Fehlerseiten teilen sich denselben
8+Rahmen. Ihn einmal zu lernen genügt, um sich überall zurechtzufinden.
9+
10+## Oben: wo ich bin und wer ich bin
11+
12+{{<extrait name="x-entete" alt="Kopfzeile: grüne Pille des Teams Maison links, Benutzername rechts, Seitentitel darunter." lang={lang} legende="Die Kopfzeile beantwortet zwei Fragen, bevor man die Seite überhaupt liest." />}}
13+
14+Die Pille links trägt den Namen des aktiven Teams, in dessen Farbe getönt.
15+Diese Farbe wird aus der Kennung des Teams berechnet: sie lässt sich nicht
16+einstellen, ändert sich aber auch nie, und wird damit zu einem verlässlichen
17+Anker, wenn man zwischen zwei Teams jongliert. Der Benutzername rechts erinnert
18+daran, unter welchem Konto geschrieben wird, eine Kleinigkeit, die zählt, wenn
19+das Telefon auf dem Küchentisch liegt und von allen benutzt wird.
20+
21+Die Absicht ist einfach: kein Eintrag soll aus Unachtsamkeit im falschen Team
22+landen. Also steht die Antwort dauerhaft da, statt in einem Menü zu stecken.
23+
24+## Team wechseln
25+
26+Ein Tippen auf die Pille öffnet ein Blatt, das von unten hereinfährt und die
27+Teams auflistet, denen ich angehöre.
28+
29+{{<shot name="equipes" alt="Das Blatt „Team wechseln“ über dem Hinzufügen-Bildschirm, mit der Liste der Teams." lang={lang} legende="Das Blatt ist ein Anker in der Seite: es öffnet sich auch ohne JavaScript." />}}
30+
31+Das aktive Team wird nicht in der Datenbank gespeichert, es ist eine
32+Einstellung des Geräts. Das Telefon kann also beim Haushalt bleiben, während
33+der Laptop beim Verein bleibt, ohne dass sich beide in die Quere kommen.
34+
35+## Unten: die vier Reiter
36+
37+{{<extrait name="x-tabbar" alt="Reiterleiste: Hinzufügen, Statistik, Aufgaben mit einer 3 als Zähler, Einstellungen mit einer 1." lang={lang} legende="Die Zähler zählen offene Aufgaben und erhaltene Einladungen." />}}
38+
39+Die Leiste klebt unten, in Daumenreichweite. Nur vier Reiter, und ihre
40+Reihenfolge folgt der Häufigkeit: Zeit trägt man oft ein, Statistiken schaut
41+man regelmäßig an, Aufgaben pflegt man ab und zu, in die Einstellungen geht man
42+selten.
43+
44+Zwei wichtige Bildschirme haben bewusst keinen Reiter. „Meine Zeiten“
45+erreicht man aus der Statistik und aus den Einstellungen, denn man geht dorthin
46+zum Korrigieren, nicht zum Stöbern. „Kategorien“ erreicht man aus dem
47+Hinzufügen-Reiter, genau dort, wo eine fehlende Kategorie auffällt.
added docs/site-documentation/content/ecrans/cadre.en.md +46 -0
new file mode 100644
@@ -0,0 +1,46 @@
1++++
2+title = "The common frame"
3+description = "The header, the tab bar and the team switcher, present everywhere."
4+weight = 1
5++++
6+
7+Every page except sign-in and the error pages shares the same frame. Learning
8+it once is enough to find your way anywhere.
9+
10+## At the top: where I am and who I am
11+
12+{{<extrait name="x-entete" alt="Header: green pill of the Maison team on the left, user name on the right, page title below." lang={lang} legende="The header answers two questions before you even read the page." />}}
13+
14+The pill on the left carries the name of the active team, tinted with its
15+colour. That colour is derived from the team identifier: it cannot be set, but
16+it never changes either, which makes it a reliable landmark when you juggle two
17+teams. The user name on the right is a reminder of which account is writing, a
18+detail that matters on a phone left on the kitchen table and picked up by
19+anyone.
20+
21+The intent is simple: no entry should ever land in the wrong team by
22+inattention. So the answer is shown permanently, not hidden in a menu.
23+
24+## Switching teams
25+
26+Touching the pill opens a sheet that slides up from the bottom and lists the
27+teams I belong to.
28+
29+{{<shot name="equipes" alt="The “Change team” sheet open over the Add screen, listing the teams." lang={lang} legende="The sheet is an anchor inside the page: it opens without JavaScript too." />}}
30+
31+The active team is not stored in the database, it is a setting of the device.
32+The phone can stay on the household while the laptop stays on the association,
33+without the two stepping on each other.
34+
35+## At the bottom: four tabs
36+
37+{{<extrait name="x-tabbar" alt="Tab bar: Add, Stats, Tasks with a badge showing 3, Settings with a badge showing 1." lang={lang} legende="The badges count the tasks to do and the invitations received." />}}
38+
39+The bar stays pinned at the bottom, within thumb reach. Four tabs only, ordered
40+by how often they are used: you add time often, you look at statistics
41+regularly, you deal with tasks now and then, you visit the settings rarely.
42+
43+Two important screens deliberately have no tab. “My time” is reached from the
44+statistics and from the settings, because you go there to correct something,
45+not to browse. “Categories” is reached from the Add tab, exactly where a
46+missing category makes itself felt.
new file mode 100644
@@ -0,0 +1,46 @@
1++++
2+title = "The common frame"
3+description = "The header, the tab bar and the team switcher, present everywhere."
4+weight = 1
5++++
6+
7+Every page except sign-in and the error pages shares the same frame. Learning
8+it once is enough to find your way anywhere.
9+
10+## At the top: where I am and who I am
11+
12+{{<extrait name="x-entete" alt="Header: green pill of the Maison team on the left, user name on the right, page title below." lang={lang} legende="The header answers two questions before you even read the page." />}}
13+
14+The pill on the left carries the name of the active team, tinted with its
15+colour. That colour is derived from the team identifier: it cannot be set, but
16+it never changes either, which makes it a reliable landmark when you juggle two
17+teams. The user name on the right is a reminder of which account is writing, a
18+detail that matters on a phone left on the kitchen table and picked up by
19+anyone.
20+
21+The intent is simple: no entry should ever land in the wrong team by
22+inattention. So the answer is shown permanently, not hidden in a menu.
23+
24+## Switching teams
25+
26+Touching the pill opens a sheet that slides up from the bottom and lists the
27+teams I belong to.
28+
29+{{<shot name="equipes" alt="The “Change team” sheet open over the Add screen, listing the teams." lang={lang} legende="The sheet is an anchor inside the page: it opens without JavaScript too." />}}
30+
31+The active team is not stored in the database, it is a setting of the device.
32+The phone can stay on the household while the laptop stays on the association,
33+without the two stepping on each other.
34+
35+## At the bottom: four tabs
36+
37+{{<extrait name="x-tabbar" alt="Tab bar: Add, Stats, Tasks with a badge showing 3, Settings with a badge showing 1." lang={lang} legende="The badges count the tasks to do and the invitations received." />}}
38+
39+The bar stays pinned at the bottom, within thumb reach. Four tabs only, ordered
40+by how often they are used: you add time often, you look at statistics
41+regularly, you deal with tasks now and then, you visit the settings rarely.
42+
43+Two important screens deliberately have no tab. “My time” is reached from the
44+statistics and from the settings, because you go there to correct something,
45+not to browse. “Categories” is reached from the Add tab, exactly where a
46+missing category makes itself felt.
added docs/site-documentation/content/ecrans/cadre.md +48 -0
new file mode 100644
@@ -0,0 +1,48 @@
1++++
2+title = "Le cadre commun"
3+description = "L'en-tête, la barre d'onglets et la feuille de changement d'équipe, présents partout."
4+weight = 1
5++++
6+
7+Toutes les pages, sauf la connexion et les erreurs, partagent la même
8+charpente. L'apprendre une fois suffit pour se repérer partout.
9+
10+## En haut : où je suis et qui je suis
11+
12+{{<extrait name="x-entete" alt="En-tête : pastille verte de l'équipe Maison à gauche, nom d'utilisateur à droite, titre de la page en dessous." lang={lang} legende="L'en-tête répond à deux questions avant même de lire la page." />}}
13+
14+La pastille de gauche porte le nom de l'équipe active, teintée de sa couleur.
15+Cette couleur est calculée à partir de l'identifiant de l'équipe : elle ne se
16+règle pas, mais elle ne change jamais non plus, ce qui en fait un repère fiable
17+quand on jongle entre deux équipes. Le nom d'utilisateur à droite rappelle sous
18+quel compte on écrit, détail qui compte sur un téléphone posé sur la table de
19+la cuisine et attrapé par n'importe qui.
20+
21+L'intention est simple : aucune saisie ne doit partir dans la mauvaise équipe
22+par distraction. La réponse est donc affichée en permanence, pas cachée dans un
23+menu.
24+
25+## Changer d'équipe
26+
27+Toucher la pastille ouvre une feuille qui glisse depuis le bas et liste les
28+équipes dont je suis membre.
29+
30+{{<shot name="equipes" alt="Feuille « Changer d'équipe » ouverte par-dessus l'écran Ajouter, avec la liste des équipes." lang={lang} legende="La feuille est une ancre dans la page : elle s'ouvre même sans JavaScript." />}}
31+
32+L'équipe active n'est pas stockée en base, c'est un réglage de l'appareil. Le
33+téléphone peut donc rester sur « Maison » pendant que l'ordinateur portable est
34+sur l'association, sans que les deux se marchent dessus.
35+
36+## En bas : les quatre onglets
37+
38+{{<extrait name="x-tabbar" alt="Barre d'onglets : Ajouter, Stats, Tâches avec une pastille 3, Réglages avec une pastille 1." lang={lang} legende="Les pastilles comptent les tâches à faire et les invitations reçues." />}}
39+
40+La barre reste collée en bas, à portée de pouce. Quatre onglets seulement, et
41+l'ordre suit la fréquence d'usage : on ajoute du temps souvent, on regarde les
42+statistiques régulièrement, on gère les tâches de temps en temps, on va dans
43+les réglages rarement.
44+
45+Deux écrans importants n'ont volontairement pas d'onglet. « Mes temps » se
46+rejoint depuis les statistiques et depuis les réglages, parce qu'on y va pour
47+corriger, pas pour consulter. « Catégories » se rejoint depuis l'onglet
48+Ajouter, là où le manque d'une catégorie se fait sentir.
new file mode 100644
@@ -0,0 +1,48 @@
1++++
2+title = "Le cadre commun"
3+description = "L'en-tête, la barre d'onglets et la feuille de changement d'équipe, présents partout."
4+weight = 1
5++++
6+
7+Toutes les pages, sauf la connexion et les erreurs, partagent la même
8+charpente. L'apprendre une fois suffit pour se repérer partout.
9+
10+## En haut : où je suis et qui je suis
11+
12+{{<extrait name="x-entete" alt="En-tête : pastille verte de l'équipe Maison à gauche, nom d'utilisateur à droite, titre de la page en dessous." lang={lang} legende="L'en-tête répond à deux questions avant même de lire la page." />}}
13+
14+La pastille de gauche porte le nom de l'équipe active, teintée de sa couleur.
15+Cette couleur est calculée à partir de l'identifiant de l'équipe : elle ne se
16+règle pas, mais elle ne change jamais non plus, ce qui en fait un repère fiable
17+quand on jongle entre deux équipes. Le nom d'utilisateur à droite rappelle sous
18+quel compte on écrit, détail qui compte sur un téléphone posé sur la table de
19+la cuisine et attrapé par n'importe qui.
20+
21+L'intention est simple : aucune saisie ne doit partir dans la mauvaise équipe
22+par distraction. La réponse est donc affichée en permanence, pas cachée dans un
23+menu.
24+
25+## Changer d'équipe
26+
27+Toucher la pastille ouvre une feuille qui glisse depuis le bas et liste les
28+équipes dont je suis membre.
29+
30+{{<shot name="equipes" alt="Feuille « Changer d'équipe » ouverte par-dessus l'écran Ajouter, avec la liste des équipes." lang={lang} legende="La feuille est une ancre dans la page : elle s'ouvre même sans JavaScript." />}}
31+
32+L'équipe active n'est pas stockée en base, c'est un réglage de l'appareil. Le
33+téléphone peut donc rester sur « Maison » pendant que l'ordinateur portable est
34+sur l'association, sans que les deux se marchent dessus.
35+
36+## En bas : les quatre onglets
37+
38+{{<extrait name="x-tabbar" alt="Barre d'onglets : Ajouter, Stats, Tâches avec une pastille 3, Réglages avec une pastille 1." lang={lang} legende="Les pastilles comptent les tâches à faire et les invitations reçues." />}}
39+
40+La barre reste collée en bas, à portée de pouce. Quatre onglets seulement, et
41+l'ordre suit la fréquence d'usage : on ajoute du temps souvent, on regarde les
42+statistiques régulièrement, on gère les tâches de temps en temps, on va dans
43+les réglages rarement.
44+
45+Deux écrans importants n'ont volontairement pas d'onglet. « Mes temps » se
46+rejoint depuis les statistiques et depuis les réglages, parce qu'on y va pour
47+corriger, pas pour consulter. « Catégories » se rejoint depuis l'onglet
48+Ajouter, là où le manque d'une catégorie se fait sentir.
added docs/site-documentation/content/ecrans/categorie.de.md +28 -0
new file mode 100644
@@ -0,0 +1,28 @@
1++++
2+title = "Schritt 1: die Kategorie"
3+description = "Die Kategorien des Teams, jede mit meiner Zeit dieser Woche."
4+weight = 5
5++++
6+
7+{{<shot name="ajouter-categorie" alt="Schritt eins: die Kategorien des Teams als Pillen, jede mit einer Farbe, einem Namen und der Zeit dieser Woche." lang={lang} legende="Schritt 1 von 2: wähle die Kategorie." />}}
8+
9+Die manuelle Erfassung geschieht in zwei Schritten.
10+Der erste ist die Auswahl einer Kategorie aus einer Liste.
11+
12+## Was jede Zeile sagt
13+
14+{{<extrait name="x-categorie-pill" alt="Eine Kategorie-Pille: farbiger Punkt, Name der Kategorie, rechts die diese Woche bereits gezählte Zeit." lang={lang} />}}
15+
16+Jede Kategorie hat eine Farbe, auf diesem Bildschirm und in den Diagrammen.
17+Die Farbe ist nicht wählbar und ändert sich nie.
18+
19+Rechts steht, sofern vorhanden, die Zeit, die ich persönlich diese Woche auf
20+dieser Kategorie gezählt habe. Es geht nicht um ein Dashboard, sondern um die
21+Frage, die man sich unmittelbar vor der Eingabe stellt: habe ich das schon
22+notiert oder nicht?
23+
24+Archivierte Kategorien werden hier nicht angeboten. Sie bleiben in der
25+Statistik sichtbar, aber man kann keine Zeit mehr auf sie zählen.
26+
27+Hat das Team noch keine Kategorie, weicht die Liste einer Aufforderung, eine
28+anzulegen, und der Link „Kategorien verwalten“ wartet direkt darunter.
new file mode 100644
@@ -0,0 +1,28 @@
1++++
2+title = "Schritt 1: die Kategorie"
3+description = "Die Kategorien des Teams, jede mit meiner Zeit dieser Woche."
4+weight = 5
5++++
6+
7+{{<shot name="ajouter-categorie" alt="Schritt eins: die Kategorien des Teams als Pillen, jede mit einer Farbe, einem Namen und der Zeit dieser Woche." lang={lang} legende="Schritt 1 von 2: wähle die Kategorie." />}}
8+
9+Die manuelle Erfassung geschieht in zwei Schritten.
10+Der erste ist die Auswahl einer Kategorie aus einer Liste.
11+
12+## Was jede Zeile sagt
13+
14+{{<extrait name="x-categorie-pill" alt="Eine Kategorie-Pille: farbiger Punkt, Name der Kategorie, rechts die diese Woche bereits gezählte Zeit." lang={lang} />}}
15+
16+Jede Kategorie hat eine Farbe, auf diesem Bildschirm und in den Diagrammen.
17+Die Farbe ist nicht wählbar und ändert sich nie.
18+
19+Rechts steht, sofern vorhanden, die Zeit, die ich persönlich diese Woche auf
20+dieser Kategorie gezählt habe. Es geht nicht um ein Dashboard, sondern um die
21+Frage, die man sich unmittelbar vor der Eingabe stellt: habe ich das schon
22+notiert oder nicht?
23+
24+Archivierte Kategorien werden hier nicht angeboten. Sie bleiben in der
25+Statistik sichtbar, aber man kann keine Zeit mehr auf sie zählen.
26+
27+Hat das Team noch keine Kategorie, weicht die Liste einer Aufforderung, eine
28+anzulegen, und der Link „Kategorien verwalten“ wartet direkt darunter.
added docs/site-documentation/content/ecrans/categorie.en.md +28 -0
new file mode 100644
@@ -0,0 +1,28 @@
1++++
2+title = "Step 1: the category"
3+description = "The team's categories, each with the time you already logged this week."
4+weight = 5
5++++
6+
7+{{<shot name="ajouter-categorie" alt="Step one: the team categories listed as pills, each with a colour, a name and the time already logged this week." lang={lang} legende="Step 1 of 2: choose the category." />}}
8+
9+Manual entry happens in two steps.
10+The first one is the choice of a category in a list.
11+
12+## What each line says
13+
14+{{<extrait name="x-categorie-pill" alt="A category pill: coloured dot, category name, and on the right the time already counted this week." lang={lang} />}}
15+
16+Every category has a colour, on this screen and in the charts.
17+The colour cannot be chosen and never changes.
18+
19+On the right, when there is one, sits the time I personally logged on that
20+category this week. The point is not to build a dashboard, but to answer the
21+question you ask yourself right before typing: have I already noted this, or
22+not?
23+
24+Archived categories are not offered here. They stay visible in the statistics,
25+but you can no longer count time on them.
26+
27+If the team has no category yet, the list gives way to an invitation to create
28+one, and the “Manage categories” link waits just below.
new file mode 100644
@@ -0,0 +1,28 @@
1++++
2+title = "Step 1: the category"
3+description = "The team's categories, each with the time you already logged this week."
4+weight = 5
5++++
6+
7+{{<shot name="ajouter-categorie" alt="Step one: the team categories listed as pills, each with a colour, a name and the time already logged this week." lang={lang} legende="Step 1 of 2: choose the category." />}}
8+
9+Manual entry happens in two steps.
10+The first one is the choice of a category in a list.
11+
12+## What each line says
13+
14+{{<extrait name="x-categorie-pill" alt="A category pill: coloured dot, category name, and on the right the time already counted this week." lang={lang} />}}
15+
16+Every category has a colour, on this screen and in the charts.
17+The colour cannot be chosen and never changes.
18+
19+On the right, when there is one, sits the time I personally logged on that
20+category this week. The point is not to build a dashboard, but to answer the
21+question you ask yourself right before typing: have I already noted this, or
22+not?
23+
24+Archived categories are not offered here. They stay visible in the statistics,
25+but you can no longer count time on them.
26+
27+If the team has no category yet, the list gives way to an invitation to create
28+one, and the “Manage categories” link waits just below.
added docs/site-documentation/content/ecrans/categorie.md +28 -0
new file mode 100644
@@ -0,0 +1,28 @@
1++++
2+title = "Étape 1 : la catégorie"
3+description = "La liste des catégories de l'équipe, avec mon temps de la semaine sur chacune."
4+weight = 5
5++++
6+
7+{{<shot name="ajouter-categorie" alt="Étape 1 : liste des catégories de l'équipe sous forme de pastilles, chacune avec une couleur, un nom et le temps passé cette semaine." lang={lang} legende="Étape 1 sur 2 : choisis la catégorie." />}}
8+
9+La saisie manuelle se fait en deux étapes.
10+La première est le choix de catégorie dans une liste.
11+
12+## Ce que dit chaque ligne
13+
14+{{<extrait name="x-categorie-pill" alt="Une pastille de catégorie : rond de couleur, nom de la catégorie, et à droite le temps déjà compté cette semaine." lang={lang} />}}
15+
16+Chaque catégorie a une couleur, dans cet écran et dans les graphiques.
17+La couleur ne se choisit pas et ne change jamais.
18+
19+À droite, quand il y en a, figure le temps que j'ai personnellement déjà compté
20+sur cette catégorie cette semaine. L'idée n'est
21+pas de faire un tableau de bord, mais de répondre à la question qu'on se pose
22+juste avant de saisir : est-ce que j'ai déjà noté ça, ou pas ?
23+
24+Les catégories archivées ne sont pas proposées ici. Elles restent visibles dans
25+les statistiques, mais on ne peut plus compter dessus.
26+
27+Si l'équipe n'a encore aucune catégorie, la liste laisse place à une invitation
28+à en créer une, et le lien « Gérer les catégories » attend juste en dessous.
new file mode 100644
@@ -0,0 +1,28 @@
1++++
2+title = "Étape 1 : la catégorie"
3+description = "La liste des catégories de l'équipe, avec mon temps de la semaine sur chacune."
4+weight = 5
5++++
6+
7+{{<shot name="ajouter-categorie" alt="Étape 1 : liste des catégories de l'équipe sous forme de pastilles, chacune avec une couleur, un nom et le temps passé cette semaine." lang={lang} legende="Étape 1 sur 2 : choisis la catégorie." />}}
8+
9+La saisie manuelle se fait en deux étapes.
10+La première est le choix de catégorie dans une liste.
11+
12+## Ce que dit chaque ligne
13+
14+{{<extrait name="x-categorie-pill" alt="Une pastille de catégorie : rond de couleur, nom de la catégorie, et à droite le temps déjà compté cette semaine." lang={lang} />}}
15+
16+Chaque catégorie a une couleur, dans cet écran et dans les graphiques.
17+La couleur ne se choisit pas et ne change jamais.
18+
19+À droite, quand il y en a, figure le temps que j'ai personnellement déjà compté
20+sur cette catégorie cette semaine. L'idée n'est
21+pas de faire un tableau de bord, mais de répondre à la question qu'on se pose
22+juste avant de saisir : est-ce que j'ai déjà noté ça, ou pas ?
23+
24+Les catégories archivées ne sont pas proposées ici. Elles restent visibles dans
25+les statistiques, mais on ne peut plus compter dessus.
26+
27+Si l'équipe n'a encore aucune catégorie, la liste laisse place à une invitation
28+à en créer une, et le lien « Gérer les catégories » attend juste en dessous.
added docs/site-documentation/content/ecrans/categories.de.md +51 -0
new file mode 100644
@@ -0,0 +1,51 @@
1++++
2+title = "Kategorien und Gruppen"
3+description = "Anlegen, umbenennen, archivieren, und einzelne Kategorien beiseitestellen."
4+weight = 14
5++++
6+
7+{{<shot name="categories" alt="Kategorien-Bildschirm: Hinweis, dass die Kategorien dem Team gehören, Eingabefeld, dann die Liste der Kategorien mit ihren Farben." lang={lang} legende="Ein Feld, eine Liste, keine Zeremonie." />}}
8+
9+Hierher kommt man aus dem Hinzufügen-Reiter oder aus den Einstellungen, über den Link „Kategorien verwalten“.
10+
11+## Anlegen, umbenennen, archivieren
12+
13+Eine Kategorie anzulegen braucht ein Feld und eine Schaltfläche. Umbenannt wird
14+an Ort und Stelle, indem man den Text in der Liste ändert und mit der
15+Eingabetaste bestätigt.
16+
17+Eine Kategorie, die nicht mehr gebraucht wird, archiviert man, statt sie zu
18+löschen. Sie verschwindet aus den Eingabelisten, rutscht ausgegraut ans Ende
19+des Bildschirms, und die bereits gezählten Zeiten bleiben in der Statistik
20+unversehrt.
21+Eine archivierte Kategorie wird mit einer Geste zurückgeholt.
22+
23+Die Farbe ist keine Einstellung. Sie ergibt sich aus dem Rang bei der
24+Erstellung im Team, aus einer Palette von fünfzehn Tönen, was sicherstellt,
25+dass eine Farbe auf jedem Bildschirm und für alle dasselbe bedeutet.
26+
27+## Die Gruppen
28+
29+{{<extrait name="x-groupe-carte" alt="Karte der Gruppe „Temps avec Alix“ mit drei Kategorien, Balade, Histoires und Jeux, jeweils mit einem Kreuz zum Entfernen." lang={lang} legende="Die Gruppe existiert, solange eine Kategorie sie trägt." />}}
30+
31+Darunter erlaubt der Abschnitt Gruppen, Kategorien beiseitezustellen. Die
32+darauf gezählte Zeit verlässt die Team-Statistik und wird in einer eigenen
33+Ansicht gelesen.
34+
35+Es gibt keinen Bildschirm zum Anlegen einer Gruppe: man wählt eine Kategorie,
36+schreibt einen Gruppennamen, und die Gruppe existiert. Sie verschwindet von
37+selbst, sobald keine Kategorie sie mehr trägt. Sie ist kein zu verwaltendes
38+Objekt, sie ist ein Etikett.
39+
40+Das Formular schlägt beim Tippen bestehende Gruppen vor, was verhindert, wegen
41+eines vergessenen Großbuchstabens eine zweite anzulegen.
42+
43+## Wozu Gruppen dienen
44+
45+Eine Gruppe ist gerechtfertigt, wenn ein Thema die Lesbarkeit des Übrigen
46+verzerren würde. Die Begleitung eines Angehörigen, oder die Freizeit mit einem
47+Kind. Interessant zu messen, aber nicht mit der Wäsche vergleichbar.
48+
49+Diese Funktion ist nicht für alle nützlich. Wer Messungen wirklich voneinander
50+trennen will (etwa eine Baustelle parallel zum Alltag), fährt womöglich besser
51+damit, zwei Teams anzulegen.
new file mode 100644
@@ -0,0 +1,51 @@
1++++
2+title = "Kategorien und Gruppen"
3+description = "Anlegen, umbenennen, archivieren, und einzelne Kategorien beiseitestellen."
4+weight = 14
5++++
6+
7+{{<shot name="categories" alt="Kategorien-Bildschirm: Hinweis, dass die Kategorien dem Team gehören, Eingabefeld, dann die Liste der Kategorien mit ihren Farben." lang={lang} legende="Ein Feld, eine Liste, keine Zeremonie." />}}
8+
9+Hierher kommt man aus dem Hinzufügen-Reiter oder aus den Einstellungen, über den Link „Kategorien verwalten“.
10+
11+## Anlegen, umbenennen, archivieren
12+
13+Eine Kategorie anzulegen braucht ein Feld und eine Schaltfläche. Umbenannt wird
14+an Ort und Stelle, indem man den Text in der Liste ändert und mit der
15+Eingabetaste bestätigt.
16+
17+Eine Kategorie, die nicht mehr gebraucht wird, archiviert man, statt sie zu
18+löschen. Sie verschwindet aus den Eingabelisten, rutscht ausgegraut ans Ende
19+des Bildschirms, und die bereits gezählten Zeiten bleiben in der Statistik
20+unversehrt.
21+Eine archivierte Kategorie wird mit einer Geste zurückgeholt.
22+
23+Die Farbe ist keine Einstellung. Sie ergibt sich aus dem Rang bei der
24+Erstellung im Team, aus einer Palette von fünfzehn Tönen, was sicherstellt,
25+dass eine Farbe auf jedem Bildschirm und für alle dasselbe bedeutet.
26+
27+## Die Gruppen
28+
29+{{<extrait name="x-groupe-carte" alt="Karte der Gruppe „Temps avec Alix“ mit drei Kategorien, Balade, Histoires und Jeux, jeweils mit einem Kreuz zum Entfernen." lang={lang} legende="Die Gruppe existiert, solange eine Kategorie sie trägt." />}}
30+
31+Darunter erlaubt der Abschnitt Gruppen, Kategorien beiseitezustellen. Die
32+darauf gezählte Zeit verlässt die Team-Statistik und wird in einer eigenen
33+Ansicht gelesen.
34+
35+Es gibt keinen Bildschirm zum Anlegen einer Gruppe: man wählt eine Kategorie,
36+schreibt einen Gruppennamen, und die Gruppe existiert. Sie verschwindet von
37+selbst, sobald keine Kategorie sie mehr trägt. Sie ist kein zu verwaltendes
38+Objekt, sie ist ein Etikett.
39+
40+Das Formular schlägt beim Tippen bestehende Gruppen vor, was verhindert, wegen
41+eines vergessenen Großbuchstabens eine zweite anzulegen.
42+
43+## Wozu Gruppen dienen
44+
45+Eine Gruppe ist gerechtfertigt, wenn ein Thema die Lesbarkeit des Übrigen
46+verzerren würde. Die Begleitung eines Angehörigen, oder die Freizeit mit einem
47+Kind. Interessant zu messen, aber nicht mit der Wäsche vergleichbar.
48+
49+Diese Funktion ist nicht für alle nützlich. Wer Messungen wirklich voneinander
50+trennen will (etwa eine Baustelle parallel zum Alltag), fährt womöglich besser
51+damit, zwei Teams anzulegen.
added docs/site-documentation/content/ecrans/categories.en.md +47 -0
new file mode 100644
@@ -0,0 +1,47 @@
1++++
2+title = "Categories and groups"
3+description = "Create, rename, archive, and set some categories apart."
4+weight = 14
5++++
6+
7+{{<shot name="categories" alt="Categories screen: a reminder that categories belong to the team, an add field, then the list of categories with their colours." lang={lang} legende="A field, a list, no ceremony." />}}
8+
9+You get here from the Add tab or from the settings, through the “Manage categories” link.
10+
11+## Create, rename, archive
12+
13+Creating a category takes one field and one button. Renaming happens in place,
14+by editing the text in the list and confirming with the Enter key.
15+
16+A category you no longer use is archived rather than deleted. It disappears
17+from the entry lists, moves to the bottom of the screen greyed out, and the
18+time already counted on it stays intact in the statistics.
19+An archived category is restored in one gesture.
20+
21+Colour is not a setting. It follows the creation rank inside the team, in a
22+palette of fifteen shades, which guarantees that a colour means the same thing
23+on every screen and for everybody.
24+
25+## Groups
26+
27+{{<extrait name="x-groupe-carte" alt="Card of the “Temps avec Alix” group holding three categories, Balade, Histoires and Jeux, each with a cross to remove it." lang={lang} legende="A group exists as long as one category carries it." />}}
28+
29+Below it, the Groups section lets you set categories apart. The time counted on
30+them leaves the team statistics and is read in a panel of its own.
31+
32+There is no group creation screen: you pick a category, you write a group name,
33+and the group exists. It vanishes by itself when no category carries it any
34+more. It is not an object to manage, it is a label.
35+
36+The form suggests existing groups as you type, which avoids creating a second
37+one over a forgotten capital letter.
38+
39+## Using groups
40+
41+A group is justified when a subject would distort the reading of everything
42+else. Caring for a relative, or leisure time with a child. Worth measuring, but
43+not comparable with the laundry.
44+
45+This feature is not useful for everybody. If you really want to keep
46+measurements apart from one another (a building project running alongside daily
47+life, say), making two teams may be more interesting.
new file mode 100644
@@ -0,0 +1,47 @@
1++++
2+title = "Categories and groups"
3+description = "Create, rename, archive, and set some categories apart."
4+weight = 14
5++++
6+
7+{{<shot name="categories" alt="Categories screen: a reminder that categories belong to the team, an add field, then the list of categories with their colours." lang={lang} legende="A field, a list, no ceremony." />}}
8+
9+You get here from the Add tab or from the settings, through the “Manage categories” link.
10+
11+## Create, rename, archive
12+
13+Creating a category takes one field and one button. Renaming happens in place,
14+by editing the text in the list and confirming with the Enter key.
15+
16+A category you no longer use is archived rather than deleted. It disappears
17+from the entry lists, moves to the bottom of the screen greyed out, and the
18+time already counted on it stays intact in the statistics.
19+An archived category is restored in one gesture.
20+
21+Colour is not a setting. It follows the creation rank inside the team, in a
22+palette of fifteen shades, which guarantees that a colour means the same thing
23+on every screen and for everybody.
24+
25+## Groups
26+
27+{{<extrait name="x-groupe-carte" alt="Card of the “Temps avec Alix” group holding three categories, Balade, Histoires and Jeux, each with a cross to remove it." lang={lang} legende="A group exists as long as one category carries it." />}}
28+
29+Below it, the Groups section lets you set categories apart. The time counted on
30+them leaves the team statistics and is read in a panel of its own.
31+
32+There is no group creation screen: you pick a category, you write a group name,
33+and the group exists. It vanishes by itself when no category carries it any
34+more. It is not an object to manage, it is a label.
35+
36+The form suggests existing groups as you type, which avoids creating a second
37+one over a forgotten capital letter.
38+
39+## Using groups
40+
41+A group is justified when a subject would distort the reading of everything
42+else. Caring for a relative, or leisure time with a child. Worth measuring, but
43+not comparable with the laundry.
44+
45+This feature is not useful for everybody. If you really want to keep
46+measurements apart from one another (a building project running alongside daily
47+life, say), making two teams may be more interesting.
added docs/site-documentation/content/ecrans/categories.md +49 -0
new file mode 100644
@@ -0,0 +1,49 @@
1++++
2+title = "Les catégories et les groupes"
3+description = "Créer, renommer, archiver, et mettre certaines catégories à part."
4+weight = 14
5++++
6+
7+{{<shot name="categories" alt="Écran Catégories : rappel que les catégories appartiennent à l'équipe, champ d'ajout, puis la liste des catégories avec leur couleur." lang={lang} legende="Un champ, une liste, aucune cérémonie." />}}
8+
9+On arrive ici depuis l'onglet Ajouter ou Paramètres, par le lien « Gérer les catégories ».
10+
11+## Créer, renommer, archiver
12+
13+Créer une catégorie tient en un champ et un bouton. Renommer se fait sur place,
14+en modifiant le texte dans la liste et en validant avec la touche Entrée.
15+
16+Une catégorie dont on ne se sert plus s'archive plutôt qu'elle ne se supprime.
17+Elle disparaît des listes de saisie, elle se retrouve en bas de l'écran, grisée,
18+et les temps déjà comptés dessus restent intacts dans les
19+statistiques.
20+Une catégorie archivée se restaure d'un geste.
21+
22+La couleur n'est pas un réglage. Elle découle du rang de création dans
23+l'équipe, dans une palette de quinze teintes, ce qui garantit qu'une couleur
24+veuille dire la même chose sur tous les écrans et pour tout le monde.
25+
26+## Les groupes
27+
28+{{<extrait name="x-groupe-carte" alt="Carte du groupe « Temps avec Alix » contenant trois catégories, Balade, Histoires et Jeux, chacune avec une croix pour la retirer." lang={lang} legende="Le groupe existe tant qu'une catégorie le porte." />}}
29+
30+En dessous, la section Groupes permet de mettre des catégories à part. Le temps
31+compté dessus sort des statistiques de l'équipe et se lit dans un panneau qui
32+lui est propre.
33+
34+Il n'y a pas d'écran de création de groupe : on choisit une catégorie, on écrit
35+un nom de groupe, et le groupe existe. Il disparaît de lui-même quand plus
36+aucune catégorie ne le porte. Ce n'est pas un objet à gérer, c'est une étiquette.
37+
38+Le formulaire suggère les groupes déjà existants pendant la frappe, ce qui
39+évite d'en créer un deuxième pour cause de majuscule oubliée.
40+
41+## Usage des groupes
42+
43+Un groupe se justifie quand un sujet fausserait la lecture du reste.
44+L'accompagnement d'un proche, ou le temps de loisir avec un enfant. Intéressant à mesurer
45+mais pas comparable à la lessive.
46+
47+Cette fonctionnalité n’est pas utile pour tout le monde. Si on veut vraiment séparer des
48+mesures de catégorie (par exemple, un chantier en parallèle de la vie quotidienne), ça
49+peut être plus intéressant de faire deux équipes.
new file mode 100644
@@ -0,0 +1,49 @@
1++++
2+title = "Les catégories et les groupes"
3+description = "Créer, renommer, archiver, et mettre certaines catégories à part."
4+weight = 14
5++++
6+
7+{{<shot name="categories" alt="Écran Catégories : rappel que les catégories appartiennent à l'équipe, champ d'ajout, puis la liste des catégories avec leur couleur." lang={lang} legende="Un champ, une liste, aucune cérémonie." />}}
8+
9+On arrive ici depuis l'onglet Ajouter ou Paramètres, par le lien « Gérer les catégories ».
10+
11+## Créer, renommer, archiver
12+
13+Créer une catégorie tient en un champ et un bouton. Renommer se fait sur place,
14+en modifiant le texte dans la liste et en validant avec la touche Entrée.
15+
16+Une catégorie dont on ne se sert plus s'archive plutôt qu'elle ne se supprime.
17+Elle disparaît des listes de saisie, elle se retrouve en bas de l'écran, grisée,
18+et les temps déjà comptés dessus restent intacts dans les
19+statistiques.
20+Une catégorie archivée se restaure d'un geste.
21+
22+La couleur n'est pas un réglage. Elle découle du rang de création dans
23+l'équipe, dans une palette de quinze teintes, ce qui garantit qu'une couleur
24+veuille dire la même chose sur tous les écrans et pour tout le monde.
25+
26+## Les groupes
27+
28+{{<extrait name="x-groupe-carte" alt="Carte du groupe « Temps avec Alix » contenant trois catégories, Balade, Histoires et Jeux, chacune avec une croix pour la retirer." lang={lang} legende="Le groupe existe tant qu'une catégorie le porte." />}}
29+
30+En dessous, la section Groupes permet de mettre des catégories à part. Le temps
31+compté dessus sort des statistiques de l'équipe et se lit dans un panneau qui
32+lui est propre.
33+
34+Il n'y a pas d'écran de création de groupe : on choisit une catégorie, on écrit
35+un nom de groupe, et le groupe existe. Il disparaît de lui-même quand plus
36+aucune catégorie ne le porte. Ce n'est pas un objet à gérer, c'est une étiquette.
37+
38+Le formulaire suggère les groupes déjà existants pendant la frappe, ce qui
39+évite d'en créer un deuxième pour cause de majuscule oubliée.
40+
41+## Usage des groupes
42+
43+Un groupe se justifie quand un sujet fausserait la lecture du reste.
44+L'accompagnement d'un proche, ou le temps de loisir avec un enfant. Intéressant à mesurer
45+mais pas comparable à la lessive.
46+
47+Cette fonctionnalité n’est pas utile pour tout le monde. Si on veut vraiment séparer des
48+mesures de catégorie (par exemple, un chantier en parallèle de la vie quotidienne), ça
49+peut être plus intéressant de faire deux équipes.
added docs/site-documentation/content/ecrans/duree.de.md +26 -0
new file mode 100644
@@ -0,0 +1,26 @@
1++++
2+title = "Schritt 2: Dauer und Datum"
3+description = "Wie viel Zeit vergangen ist, und wann."
4+weight = 6
5++++
6+
7+{{<shot name="ajouter-duree" alt="Schritt zwei: die gewählte Kategorie, ein Minutenzähler mit Minus und Plus, Kurzwahlen für 5, 15, 30, 45 Minuten und 1 Std., ein Datumsfeld, die Schaltfläche Zeit hinzufügen." lang={lang} legende="Zuerst die Dauer, dann das Datum, unten die Bestätigung." />}}
8+
9+Zweiter Schritt. Die gewählte Kategorie steht oben mit ihrer Farbe, und ein
10+Link erlaubt es, sie zu wechseln, ohne den Rest zu verlieren.
11+
12+## Drei Arten, eine Dauer einzugeben
13+
14+{{<extrait name="x-stepper" alt="Dauer-Zähler: Minus-Schaltfläche links, die Zahl 30 in der Mitte, Plus-Schaltfläche rechts." lang={lang} legende="Der Zähler geht in Schritten von fünf Minuten." />}}
15+
16+Plus und Minus rücken um fünf Minuten weiter, was meistens reicht. Die
17+Kurzwahlen darunter setzen eine Dauer mit einer einzigen Geste. Und die Zahl
18+selbst ist ein Eingabefeld: für drei Stunden und eine Viertelstunde tippt man
19+den Wert, statt vierzig Mal zu klicken.
20+
21+Es gibt keine Obergrenze, eine Dauer muss lediglich größer als null sein.
22+
23+## Das Datum
24+
25+Das Formular schlägt standardmäßig das heutige Datum vor, und man kann
26+zurückgehen, wenn etwas nachzutragen ist.
new file mode 100644
@@ -0,0 +1,26 @@
1++++
2+title = "Schritt 2: Dauer und Datum"
3+description = "Wie viel Zeit vergangen ist, und wann."
4+weight = 6
5++++
6+
7+{{<shot name="ajouter-duree" alt="Schritt zwei: die gewählte Kategorie, ein Minutenzähler mit Minus und Plus, Kurzwahlen für 5, 15, 30, 45 Minuten und 1 Std., ein Datumsfeld, die Schaltfläche Zeit hinzufügen." lang={lang} legende="Zuerst die Dauer, dann das Datum, unten die Bestätigung." />}}
8+
9+Zweiter Schritt. Die gewählte Kategorie steht oben mit ihrer Farbe, und ein
10+Link erlaubt es, sie zu wechseln, ohne den Rest zu verlieren.
11+
12+## Drei Arten, eine Dauer einzugeben
13+
14+{{<extrait name="x-stepper" alt="Dauer-Zähler: Minus-Schaltfläche links, die Zahl 30 in der Mitte, Plus-Schaltfläche rechts." lang={lang} legende="Der Zähler geht in Schritten von fünf Minuten." />}}
15+
16+Plus und Minus rücken um fünf Minuten weiter, was meistens reicht. Die
17+Kurzwahlen darunter setzen eine Dauer mit einer einzigen Geste. Und die Zahl
18+selbst ist ein Eingabefeld: für drei Stunden und eine Viertelstunde tippt man
19+den Wert, statt vierzig Mal zu klicken.
20+
21+Es gibt keine Obergrenze, eine Dauer muss lediglich größer als null sein.
22+
23+## Das Datum
24+
25+Das Formular schlägt standardmäßig das heutige Datum vor, und man kann
26+zurückgehen, wenn etwas nachzutragen ist.
added docs/site-documentation/content/ecrans/duree.en.md +26 -0
new file mode 100644
@@ -0,0 +1,26 @@
1++++
2+title = "Step 2: duration and date"
3+description = "How much time went by, and when."
4+weight = 6
5++++
6+
7+{{<shot name="ajouter-duree" alt="Step two: the chosen category, a minute counter with minus and plus buttons, shortcuts for 5, 15, 30, 45 minutes and 1 h, a date picker, and the Add time button." lang={lang} legende="Duration first, date second, confirmation at the bottom." />}}
8+
9+Second step. The chosen category is recalled at the top with its colour, and a
10+link lets you change it without losing the rest.
11+
12+## Three ways to enter a duration
13+
14+{{<extrait name="x-stepper" alt="Duration counter: minus button on the left, the number 30 in the middle, plus button on the right." lang={lang} legende="The counter moves in steps of five minutes." />}}
15+
16+The plus and minus buttons move by five minutes, which covers most cases. The
17+shortcuts below set a duration in one gesture. And the number itself is an
18+input field: for three hours and a quarter, you type the value instead of
19+tapping forty times.
20+
21+There is no ceiling, a duration simply has to be greater than zero.
22+
23+## The date
24+
25+The form offers today's date by default, and you can walk back if there is
26+something to catch up on.
new file mode 100644
@@ -0,0 +1,26 @@
1++++
2+title = "Step 2: duration and date"
3+description = "How much time went by, and when."
4+weight = 6
5++++
6+
7+{{<shot name="ajouter-duree" alt="Step two: the chosen category, a minute counter with minus and plus buttons, shortcuts for 5, 15, 30, 45 minutes and 1 h, a date picker, and the Add time button." lang={lang} legende="Duration first, date second, confirmation at the bottom." />}}
8+
9+Second step. The chosen category is recalled at the top with its colour, and a
10+link lets you change it without losing the rest.
11+
12+## Three ways to enter a duration
13+
14+{{<extrait name="x-stepper" alt="Duration counter: minus button on the left, the number 30 in the middle, plus button on the right." lang={lang} legende="The counter moves in steps of five minutes." />}}
15+
16+The plus and minus buttons move by five minutes, which covers most cases. The
17+shortcuts below set a duration in one gesture. And the number itself is an
18+input field: for three hours and a quarter, you type the value instead of
19+tapping forty times.
20+
21+There is no ceiling, a duration simply has to be greater than zero.
22+
23+## The date
24+
25+The form offers today's date by default, and you can walk back if there is
26+something to catch up on.
added docs/site-documentation/content/ecrans/duree.md +27 -0
new file mode 100644
@@ -0,0 +1,27 @@
1++++
2+title = "Étape 2 : la durée et la date"
3+description = "Combien de temps écoulé, et quand."
4+weight = 6
5++++
6+
7+{{<shot name="ajouter-duree" alt="Étape 2 : nom de la catégorie choisie, compteur de minutes avec boutons moins et plus, raccourcis 5, 15, 30, 45 minutes et 1 h, sélecteur de date, bouton Ajouter du temps." lang={lang} legende="La durée d'abord, la date ensuite, la validation en bas." />}}
8+
9+Deuxième étape. La catégorie choisie est rappelée en haut, avec sa
10+couleur, et un lien permet d'en changer sans perdre le reste.
11+
12+## Trois façons de saisir une durée
13+
14+{{<extrait name="x-stepper" alt="Compteur de durée : bouton moins à gauche, le nombre 30 au centre, bouton plus à droite." lang={lang} legende="Le compteur avance par pas de cinq minutes." />}}
15+
16+Les boutons plus et moins avancent de cinq minutes, ce qui suffit dans la
17+plupart des cas. Les raccourcis en dessous posent une durée d'un seul geste.
18+Et le nombre lui-même est un champ de saisie : pour trois heures et quart, on
19+tape la valeur, sans faire quarante clics.
20+
21+Il n'y a pas de plafond, une durée doit simplement être supérieure à zéro.
22+
23+## La date
24+
25+Le formulaire propose la date du jour par défaut, avec possibilité de revenir en arrière
26+si besoin de rattraper un temps.
27+
new file mode 100644
@@ -0,0 +1,27 @@
1++++
2+title = "Étape 2 : la durée et la date"
3+description = "Combien de temps écoulé, et quand."
4+weight = 6
5++++
6+
7+{{<shot name="ajouter-duree" alt="Étape 2 : nom de la catégorie choisie, compteur de minutes avec boutons moins et plus, raccourcis 5, 15, 30, 45 minutes et 1 h, sélecteur de date, bouton Ajouter du temps." lang={lang} legende="La durée d'abord, la date ensuite, la validation en bas." />}}
8+
9+Deuxième étape. La catégorie choisie est rappelée en haut, avec sa
10+couleur, et un lien permet d'en changer sans perdre le reste.
11+
12+## Trois façons de saisir une durée
13+
14+{{<extrait name="x-stepper" alt="Compteur de durée : bouton moins à gauche, le nombre 30 au centre, bouton plus à droite." lang={lang} legende="Le compteur avance par pas de cinq minutes." />}}
15+
16+Les boutons plus et moins avancent de cinq minutes, ce qui suffit dans la
17+plupart des cas. Les raccourcis en dessous posent une durée d'un seul geste.
18+Et le nombre lui-même est un champ de saisie : pour trois heures et quart, on
19+tape la valeur, sans faire quarante clics.
20+
21+Il n'y a pas de plafond, une durée doit simplement être supérieure à zéro.
22+
23+## La date
24+
25+Le formulaire propose la date du jour par défaut, avec possibilité de revenir en arrière
26+si besoin de rattraper un temps.
27+
added docs/site-documentation/content/ecrans/mes-temps.de.md +18 -0
new file mode 100644
@@ -0,0 +1,18 @@
1++++
2+title = "Meine Zeiten"
3+description = "Die Liste meiner Einträge im aktiven Team, die neuesten zuerst."
4+weight = 8
5++++
6+
7+{{<shot name="mes-temps" alt="Liste „Meine Zeiten“: eine Zeile pro Eintrag, mit der Farbe der Kategorie, ihrem Namen, dem Datum und der Dauer, dazu ein Stift zum Bearbeiten." lang={lang} legende="Zwanzig Zeilen, dann „Mehr anzeigen“." />}}
8+
9+Dieser Bildschirm zeigt nur meine Einträge im aktiven Team, die neuesten
10+zuerst. Man kommt hierher, um zu prüfen oder zu korrigieren.
11+
12+Ein Eintrag gehört der Person, die ihn erfasst hat, und nur sie kann ihn
13+ändern.
14+
15+Jede Zeile trägt einen Stift, der zur
16+[Bearbeitungsseite](@/ecrans/modifier-temps.de.md) führt. Gibt es nichts zu
17+zeigen, lädt eine eigene Meldung zum Anfangen ein, statt eine leere Seite
18+stehen zu lassen.
new file mode 100644
@@ -0,0 +1,18 @@
1++++
2+title = "Meine Zeiten"
3+description = "Die Liste meiner Einträge im aktiven Team, die neuesten zuerst."
4+weight = 8
5++++
6+
7+{{<shot name="mes-temps" alt="Liste „Meine Zeiten“: eine Zeile pro Eintrag, mit der Farbe der Kategorie, ihrem Namen, dem Datum und der Dauer, dazu ein Stift zum Bearbeiten." lang={lang} legende="Zwanzig Zeilen, dann „Mehr anzeigen“." />}}
8+
9+Dieser Bildschirm zeigt nur meine Einträge im aktiven Team, die neuesten
10+zuerst. Man kommt hierher, um zu prüfen oder zu korrigieren.
11+
12+Ein Eintrag gehört der Person, die ihn erfasst hat, und nur sie kann ihn
13+ändern.
14+
15+Jede Zeile trägt einen Stift, der zur
16+[Bearbeitungsseite](@/ecrans/modifier-temps.de.md) führt. Gibt es nichts zu
17+zeigen, lädt eine eigene Meldung zum Anfangen ein, statt eine leere Seite
18+stehen zu lassen.
added docs/site-documentation/content/ecrans/mes-temps.en.md +16 -0
new file mode 100644
@@ -0,0 +1,16 @@
1++++
2+title = "My time"
3+description = "The list of my entries in the active team, most recent first."
4+weight = 8
5++++
6+
7+{{<shot name="mes-temps" alt="The “My time” list: one row per entry, with the category colour, its name, the date and the duration, plus a pencil for editing." lang={lang} legende="Twenty rows, then “Show more”." />}}
8+
9+This screen shows only my entries, in the active team, most recent first. You
10+come here to check or to correct.
11+
12+An entry belongs to whoever recorded it, and only they can change it.
13+
14+Each row carries a pencil leading to [the edit page](@/ecrans/modifier-temps.en.md).
15+When there is nothing to show, a dedicated message invites you to start rather
16+than leaving a blank page.
new file mode 100644
@@ -0,0 +1,16 @@
1++++
2+title = "My time"
3+description = "The list of my entries in the active team, most recent first."
4+weight = 8
5++++
6+
7+{{<shot name="mes-temps" alt="The “My time” list: one row per entry, with the category colour, its name, the date and the duration, plus a pencil for editing." lang={lang} legende="Twenty rows, then “Show more”." />}}
8+
9+This screen shows only my entries, in the active team, most recent first. You
10+come here to check or to correct.
11+
12+An entry belongs to whoever recorded it, and only they can change it.
13+
14+Each row carries a pencil leading to [the edit page](@/ecrans/modifier-temps.en.md).
15+When there is nothing to show, a dedicated message invites you to start rather
16+than leaving a blank page.
added docs/site-documentation/content/ecrans/mes-temps.md +17 -0
new file mode 100644
@@ -0,0 +1,17 @@
1++++
2+title = "Mes temps"
3+description = "La liste de mes saisies dans l'équipe active, de la plus récente à la plus ancienne."
4+weight = 8
5++++
6+
7+{{<shot name="mes-temps" alt="Liste « Mes temps » : une ligne par saisie, avec la couleur de la catégorie, son nom, la date et la durée, plus un crayon de modification." lang={lang} legende="Vingt lignes, puis « Voir plus »." />}}
8+
9+Cet écran ne montre que mes saisies, dans l'équipe active, les plus récentes en
10+premier. On y va pour vérifier ou corriger.
11+
12+Un temps appartient à la personne qui l'a saisi, et elle seule peut le
13+modifier.
14+
15+Chaque ligne porte un crayon qui mène à [la page de
16+modification](@/ecrans/modifier-temps.md). Quand il n'y a rien à afficher, un
17+message dédié invite à commencer plutôt que de laisser une page blanche.
new file mode 100644
@@ -0,0 +1,17 @@
1++++
2+title = "Mes temps"
3+description = "La liste de mes saisies dans l'équipe active, de la plus récente à la plus ancienne."
4+weight = 8
5++++
6+
7+{{<shot name="mes-temps" alt="Liste « Mes temps » : une ligne par saisie, avec la couleur de la catégorie, son nom, la date et la durée, plus un crayon de modification." lang={lang} legende="Vingt lignes, puis « Voir plus »." />}}
8+
9+Cet écran ne montre que mes saisies, dans l'équipe active, les plus récentes en
10+premier. On y va pour vérifier ou corriger.
11+
12+Un temps appartient à la personne qui l'a saisi, et elle seule peut le
13+modifier.
14+
15+Chaque ligne porte un crayon qui mène à [la page de
16+modification](@/ecrans/modifier-temps.md). Quand il n'y a rien à afficher, un
17+message dédié invite à commencer plutôt que de laisser une page blanche.
added docs/site-documentation/content/ecrans/minuteur.de.md +30 -0
new file mode 100644
@@ -0,0 +1,30 @@
1++++
2+title = "Die Stoppuhr"
3+description = "Eine laufende Messung, überall sichtbar, die man beenden oder wegwerfen kann."
4+weight = 4
5++++
6+
7+{{<shot name="minuteur" alt="Stoppuhr-Bildschirm: aprikosenfarbene Karte „STOPPUHR LÄUFT“, die verstrichene Zeit groß, die Startzeit, und die Schaltflächen Stoppuhr beenden und Stoppuhr abbrechen." lang={lang} legende="Eine einzige riesige Zahl und zwei Auswege." />}}
8+
9+Einmal gestartet, übernimmt die Stoppuhr den ganzen Hinzufügen-Reiter. Der
10+Zähler läuft sekundenweise hoch, die Startzeit steht darunter, und es werden
11+zwei Schaltflächen angeboten: beenden oder abbrechen.
12+
13+## Das Band, damit man es nicht vergisst
14+
15+{{<extrait name="x-bandeau-minuteur" alt="Braunes Band oben auf dem Statistik-Bildschirm, mit Stoppuhr-Symbol, verstrichener Zeit und dem Wort „läuft“." lang={lang} legende="Das Band folgt über alle Bildschirme, und das Anhalten ist eine Geste entfernt." />}}
16+
17+Solange eine Messung läuft, erinnert ein Band oben auf jeder Seite daran. Das
18+Band ist selbst die Stopp-Schaltfläche.
19+Wenn eine Messung offensichtlich übergelaufen ist, sagt die Anwendung das beim Erfassen, statt so zu tun, als wäre nichts.
20+
21+## Beenden heißt bei Schritt zwei ankommen
22+
23+Das Anhalten der Stoppuhr erzeugt nicht sofort einen Eintrag. Die Messung wird
24+beiseitegelegt, die Anwendung bietet die Auswahl der Kategorie an und zeigt
25+dann den Dauer-Schritt mit den gemessenen Minuten bereits ausgefüllt. Nichts
26+wird geschrieben, solange der Eintrag nicht bestätigt ist, und die
27+vorgeschlagene Dauer bleibt änderbar: aus einer Messung von siebenundvierzig
28+Minuten, von denen sieben am Telefon vergingen, dürfen vierzig werden.
29+
30+Abbrechen wirft die Messung weg und schreibt nichts.
new file mode 100644
@@ -0,0 +1,30 @@
1++++
2+title = "Die Stoppuhr"
3+description = "Eine laufende Messung, überall sichtbar, die man beenden oder wegwerfen kann."
4+weight = 4
5++++
6+
7+{{<shot name="minuteur" alt="Stoppuhr-Bildschirm: aprikosenfarbene Karte „STOPPUHR LÄUFT“, die verstrichene Zeit groß, die Startzeit, und die Schaltflächen Stoppuhr beenden und Stoppuhr abbrechen." lang={lang} legende="Eine einzige riesige Zahl und zwei Auswege." />}}
8+
9+Einmal gestartet, übernimmt die Stoppuhr den ganzen Hinzufügen-Reiter. Der
10+Zähler läuft sekundenweise hoch, die Startzeit steht darunter, und es werden
11+zwei Schaltflächen angeboten: beenden oder abbrechen.
12+
13+## Das Band, damit man es nicht vergisst
14+
15+{{<extrait name="x-bandeau-minuteur" alt="Braunes Band oben auf dem Statistik-Bildschirm, mit Stoppuhr-Symbol, verstrichener Zeit und dem Wort „läuft“." lang={lang} legende="Das Band folgt über alle Bildschirme, und das Anhalten ist eine Geste entfernt." />}}
16+
17+Solange eine Messung läuft, erinnert ein Band oben auf jeder Seite daran. Das
18+Band ist selbst die Stopp-Schaltfläche.
19+Wenn eine Messung offensichtlich übergelaufen ist, sagt die Anwendung das beim Erfassen, statt so zu tun, als wäre nichts.
20+
21+## Beenden heißt bei Schritt zwei ankommen
22+
23+Das Anhalten der Stoppuhr erzeugt nicht sofort einen Eintrag. Die Messung wird
24+beiseitegelegt, die Anwendung bietet die Auswahl der Kategorie an und zeigt
25+dann den Dauer-Schritt mit den gemessenen Minuten bereits ausgefüllt. Nichts
26+wird geschrieben, solange der Eintrag nicht bestätigt ist, und die
27+vorgeschlagene Dauer bleibt änderbar: aus einer Messung von siebenundvierzig
28+Minuten, von denen sieben am Telefon vergingen, dürfen vierzig werden.
29+
30+Abbrechen wirft die Messung weg und schreibt nichts.
added docs/site-documentation/content/ecrans/minuteur.en.md +30 -0
new file mode 100644
@@ -0,0 +1,30 @@
1++++
2+title = "The timer"
3+description = "A measurement in progress, visible everywhere, that you can finish or throw away."
4+weight = 4
5++++
6+
7+{{<shot name="minuteur" alt="Timer screen: apricot card reading “TIMER RUNNING”, the elapsed time in large type, the start time, and the buttons Finish the timer and Cancel the timer." lang={lang} legende="A single huge number, and two ways out." />}}
8+
9+Once started, the timer takes over the whole Add tab. The counter climbs by the
10+second, the start time is recalled underneath, and two buttons are offered:
11+finish, or cancel.
12+
13+## The banner, so you do not forget
14+
15+{{<extrait name="x-bandeau-minuteur" alt="Brown banner at the top of the Statistics screen, with a stopwatch icon, the elapsed time and the word “running”." lang={lang} legende="The banner follows you across screens, and stopping it is one gesture away." />}}
16+
17+As long as a measurement is running, a banner recalls it at the top of every
18+page. The banner is itself the stop button.
19+When a measurement has clearly overflowed, the application says so at the moment of recording rather than pretending nothing happened.
20+
21+## Finishing means landing on step two
22+
23+Stopping the timer does not create an entry straight away. The measurement is
24+set aside, the application offers the category list, and then shows the
25+duration step with the measured minutes already filled in. Nothing is written
26+until the entry is confirmed, and the proposed duration stays editable: a
27+measurement of forty-seven minutes, seven of which were spent on the phone, can
28+become forty.
29+
30+Cancelling throws the measurement away and writes nothing.
new file mode 100644
@@ -0,0 +1,30 @@
1++++
2+title = "The timer"
3+description = "A measurement in progress, visible everywhere, that you can finish or throw away."
4+weight = 4
5++++
6+
7+{{<shot name="minuteur" alt="Timer screen: apricot card reading “TIMER RUNNING”, the elapsed time in large type, the start time, and the buttons Finish the timer and Cancel the timer." lang={lang} legende="A single huge number, and two ways out." />}}
8+
9+Once started, the timer takes over the whole Add tab. The counter climbs by the
10+second, the start time is recalled underneath, and two buttons are offered:
11+finish, or cancel.
12+
13+## The banner, so you do not forget
14+
15+{{<extrait name="x-bandeau-minuteur" alt="Brown banner at the top of the Statistics screen, with a stopwatch icon, the elapsed time and the word “running”." lang={lang} legende="The banner follows you across screens, and stopping it is one gesture away." />}}
16+
17+As long as a measurement is running, a banner recalls it at the top of every
18+page. The banner is itself the stop button.
19+When a measurement has clearly overflowed, the application says so at the moment of recording rather than pretending nothing happened.
20+
21+## Finishing means landing on step two
22+
23+Stopping the timer does not create an entry straight away. The measurement is
24+set aside, the application offers the category list, and then shows the
25+duration step with the measured minutes already filled in. Nothing is written
26+until the entry is confirmed, and the proposed duration stays editable: a
27+measurement of forty-seven minutes, seven of which were spent on the phone, can
28+become forty.
29+
30+Cancelling throws the measurement away and writes nothing.
added docs/site-documentation/content/ecrans/minuteur.md +30 -0
new file mode 100644
@@ -0,0 +1,30 @@
1++++
2+title = "Le minuteur"
3+description = "Une mesure en cours, visible partout, qu'on peut finir ou jeter."
4+weight = 4
5++++
6+
7+{{<shot name="minuteur" alt="Écran du minuteur : carte abricot « MINUTEUR EN COURS », durée écoulée en gros, heure de départ, boutons Finir le minuteur et Annuler le minuteur." lang={lang} legende="Un seul chiffre, énorme, et deux issues." />}}
8+
9+Une fois lancé, le minuteur prend tout l'onglet Ajouter. Le compteur monte à la
10+seconde, l'heure de départ est rappelée dessous, et deux boutons sont
11+proposés : finir, ou annuler.
12+
13+## Le bandeau, pour ne pas oublier
14+
15+{{<extrait name="x-bandeau-minuteur" alt="Bandeau brun en haut de l'écran Statistiques, avec une icône de chronomètre, la durée écoulée et la mention « en cours »." lang={lang} legende="Le bandeau suit sur tous les écrans, et l'arrêter est à un geste." />}}
16+
17+Tant qu'une mesure court, un bandeau la rappelle en haut de chaque page. Il est
18+lui-même le bouton d'arrêt.
19+Quand une mesure a manifestement débordé, l'application le signale au moment de l'enregistrer plutôt que de faire semblant de rien.
20+
21+## Finir, c'est arriver à l'étape 2
22+
23+Arrêter le minuteur ne crée pas un temps tout de suite. La mesure est mise de
24+côté et l'application propose de choisir la catégorie, puis présente l'étape de
25+la durée avec les minutes mesurées déjà remplies. Rien n'est enregistré tant
26+que la saisie n'est pas validée, et la durée proposée reste modifiable : une
27+mesure de quarante-sept minutes dont sept ont été passées au téléphone peut
28+devenir quarante.
29+
30+Annuler jette la mesure, sans rien écrire.
new file mode 100644
@@ -0,0 +1,30 @@
1++++
2+title = "Le minuteur"
3+description = "Une mesure en cours, visible partout, qu'on peut finir ou jeter."
4+weight = 4
5++++
6+
7+{{<shot name="minuteur" alt="Écran du minuteur : carte abricot « MINUTEUR EN COURS », durée écoulée en gros, heure de départ, boutons Finir le minuteur et Annuler le minuteur." lang={lang} legende="Un seul chiffre, énorme, et deux issues." />}}
8+
9+Une fois lancé, le minuteur prend tout l'onglet Ajouter. Le compteur monte à la
10+seconde, l'heure de départ est rappelée dessous, et deux boutons sont
11+proposés : finir, ou annuler.
12+
13+## Le bandeau, pour ne pas oublier
14+
15+{{<extrait name="x-bandeau-minuteur" alt="Bandeau brun en haut de l'écran Statistiques, avec une icône de chronomètre, la durée écoulée et la mention « en cours »." lang={lang} legende="Le bandeau suit sur tous les écrans, et l'arrêter est à un geste." />}}
16+
17+Tant qu'une mesure court, un bandeau la rappelle en haut de chaque page. Il est
18+lui-même le bouton d'arrêt.
19+Quand une mesure a manifestement débordé, l'application le signale au moment de l'enregistrer plutôt que de faire semblant de rien.
20+
21+## Finir, c'est arriver à l'étape 2
22+
23+Arrêter le minuteur ne crée pas un temps tout de suite. La mesure est mise de
24+côté et l'application propose de choisir la catégorie, puis présente l'étape de
25+la durée avec les minutes mesurées déjà remplies. Rien n'est enregistré tant
26+que la saisie n'est pas validée, et la durée proposée reste modifiable : une
27+mesure de quarante-sept minutes dont sept ont été passées au téléphone peut
28+devenir quarante.
29+
30+Annuler jette la mesure, sans rien écrire.
added docs/site-documentation/content/ecrans/modifier-temps.de.md +11 -0
new file mode 100644
@@ -0,0 +1,11 @@
1++++
2+title = "Einen Eintrag ändern"
3+description = "Kategorie, Dauer oder Datum korrigieren, oder den Eintrag löschen."
4+weight = 9
5++++
6+
7+{{<shot name="modifier-temps" alt="Bildschirm zum Ändern: Auswahlliste der Kategorie, Feld für die Dauer in Minuten, Datumsfeld, Schaltflächen Speichern und Löschen." lang={lang} legende="Ein Formular, um eine Messung zu berichtigen." />}}
8+
9+Die Zugehörigkeit des Eintrags prüft der Server: dass die Zeit meine ist und dass sie zum aktiven Team gehört.
10+
11+Das Löschen ist sofort und endgültig.
new file mode 100644
@@ -0,0 +1,11 @@
1++++
2+title = "Einen Eintrag ändern"
3+description = "Kategorie, Dauer oder Datum korrigieren, oder den Eintrag löschen."
4+weight = 9
5++++
6+
7+{{<shot name="modifier-temps" alt="Bildschirm zum Ändern: Auswahlliste der Kategorie, Feld für die Dauer in Minuten, Datumsfeld, Schaltflächen Speichern und Löschen." lang={lang} legende="Ein Formular, um eine Messung zu berichtigen." />}}
8+
9+Die Zugehörigkeit des Eintrags prüft der Server: dass die Zeit meine ist und dass sie zum aktiven Team gehört.
10+
11+Das Löschen ist sofort und endgültig.
added docs/site-documentation/content/ecrans/modifier-temps.en.md +11 -0
new file mode 100644
@@ -0,0 +1,11 @@
1++++
2+title = "Editing an entry"
3+description = "Fix a category, a duration, a date, or erase the entry."
4+weight = 9
5++++
6+
7+{{<shot name="modifier-temps" alt="Edit screen: a category dropdown, a duration field in minutes, a date field, a Save button and a Delete button." lang={lang} legende="A form for correcting a measurement." />}}
8+
9+Ownership of the entry is checked by the server: both that the time is mine and that it belongs to the active team.
10+
11+Deletion is immediate and final.
new file mode 100644
@@ -0,0 +1,11 @@
1++++
2+title = "Editing an entry"
3+description = "Fix a category, a duration, a date, or erase the entry."
4+weight = 9
5++++
6+
7+{{<shot name="modifier-temps" alt="Edit screen: a category dropdown, a duration field in minutes, a date field, a Save button and a Delete button." lang={lang} legende="A form for correcting a measurement." />}}
8+
9+Ownership of the entry is checked by the server: both that the time is mine and that it belongs to the active team.
10+
11+Deletion is immediate and final.
added docs/site-documentation/content/ecrans/modifier-temps.md +11 -0
new file mode 100644
@@ -0,0 +1,11 @@
1++++
2+title = "Modifier un temps"
3+description = "Corriger une catégorie, une durée, une date, ou effacer la saisie."
4+weight = 9
5++++
6+
7+{{<shot name="modifier-temps" alt="Écran Modifier le temps : liste déroulante de catégorie, champ de durée en minutes, champ de date, bouton Enregistrer et bouton Supprimer." lang={lang} legende="Formulaire pour rectifier une mesure." />}}
8+
9+L'appartenance de la saisie est vérifiée par le serveur: à la fois que le temps est le mien et qu'il appartient à l'équipe active.
10+
11+La suppression est immédiate et définitive.
new file mode 100644
@@ -0,0 +1,11 @@
1++++
2+title = "Modifier un temps"
3+description = "Corriger une catégorie, une durée, une date, ou effacer la saisie."
4+weight = 9
5++++
6+
7+{{<shot name="modifier-temps" alt="Écran Modifier le temps : liste déroulante de catégorie, champ de durée en minutes, champ de date, bouton Enregistrer et bouton Supprimer." lang={lang} legende="Formulaire pour rectifier une mesure." />}}
8+
9+L'appartenance de la saisie est vérifiée par le serveur: à la fois que le temps est le mien et qu'il appartient à l'équipe active.
10+
11+La suppression est immédiate et définitive.
added docs/site-documentation/content/ecrans/parametres.de.md +54 -0
new file mode 100644
@@ -0,0 +1,54 @@
1++++
2+title = "Die Einstellungen"
3+description = "Team, Einladungen, Sprache, Darstellung und Sitzung, in dieser Reihenfolge."
4+weight = 13
5++++
6+
7+{{<shot name="parametres" alt="Einstellungen: Karte einer erhaltenen Einladung mit Annehmen und Ablehnen, Karte Konto, Verknüpfungen zu Meine Einträge und Kategorien, Feld zum Umbenennen des Teams." lang={lang} legende="Was eine Antwort braucht, steht oben." />}}
8+
9+Dieser Bildschirm versammelt alles, was sonst nirgends hinpasst:
10+- Team-Einladungen
11+- Zeiten und Kategorien ändern (für alle, die so denken)
12+- Meine Teams
13+- Darstellung
14+- Mein Konto
15+
16+## Die Einladungen, ganz oben
17+
18+{{<extrait name="x-invitation" alt="Einladungskarte: „noa lädt dich in das Team Copropriété ein“, mit den Schaltflächen Annehmen und Ablehnen." lang={lang} />}}
19+
20+Eine erhaltene Einladung erscheint als farbige Karte mit zwei Schaltflächen.
21+Auf dem Reiter Einstellungen erscheint zusätzlich ein Zähler, denn eine
22+schlafende Einladung ist ein Mensch, der wartet.
23+
24+Annehmen tritt dem Team bei und wechselt sogleich dorthin: wer eine Einladung
25+annimmt, will hin. Ablehnen sagt niemandem etwas und verhindert nicht, später
26+erneut eingeladen zu werden.
27+
28+## Teams verwalten und Mitglieder einladen
29+
30+Von diesem Bildschirm aus kann jedes Mitglied das Team umbenennen, jemanden
31+über den Benutzernamen einladen, eine offene Einladung zurückziehen, ein neues
32+Team anlegen oder dieses verlassen. Es gibt keine Eigentümerin und keinen
33+Eigentümer eines Teams, also auch niemanden, den man um Erlaubnis fragen muss.
34+
35+Fehler beim Einladen sind ausdrücklich und erscheinen neben dem Feld:
36+unbekanntes Konto, bereits Mitglied, Einladung bereits offen. Das ist die
37+einzige Stelle, an der die Anwendung preisgibt, dass ein Konto existiert, und
38+das ist bewusst so, denn man muss jemanden einladen können.
39+
40+Die Schaltfläche zum Verlassen des Teams erscheint nur, wenn ich mindestens
41+zwei Teams angehöre. Die Regel ist klar: man ist immer irgendwo Mitglied.
42+
43+## Sprache und Darstellung
44+
45+Die Sprache der Oberfläche wird hier gewählt, zwischen Französisch, Englisch
46+und Deutsch. Diese Einstellung gehört zum Konto, nicht zum Browser.
47+
48+Direkt darunter bietet das Anzeigethema das Aussehen Organic, das der
49+Screenshots dieser Dokumentation, sowie ein kontraststarkes Schwarzweiß für
50+alle, die maximale Lesbarkeit brauchen.
51+
52+## Die Sitzung
53+
54+Ganz unten stehen der Passwortwechsel und das Abmelden.
new file mode 100644
@@ -0,0 +1,54 @@
1++++
2+title = "Die Einstellungen"
3+description = "Team, Einladungen, Sprache, Darstellung und Sitzung, in dieser Reihenfolge."
4+weight = 13
5++++
6+
7+{{<shot name="parametres" alt="Einstellungen: Karte einer erhaltenen Einladung mit Annehmen und Ablehnen, Karte Konto, Verknüpfungen zu Meine Einträge und Kategorien, Feld zum Umbenennen des Teams." lang={lang} legende="Was eine Antwort braucht, steht oben." />}}
8+
9+Dieser Bildschirm versammelt alles, was sonst nirgends hinpasst:
10+- Team-Einladungen
11+- Zeiten und Kategorien ändern (für alle, die so denken)
12+- Meine Teams
13+- Darstellung
14+- Mein Konto
15+
16+## Die Einladungen, ganz oben
17+
18+{{<extrait name="x-invitation" alt="Einladungskarte: „noa lädt dich in das Team Copropriété ein“, mit den Schaltflächen Annehmen und Ablehnen." lang={lang} />}}
19+
20+Eine erhaltene Einladung erscheint als farbige Karte mit zwei Schaltflächen.
21+Auf dem Reiter Einstellungen erscheint zusätzlich ein Zähler, denn eine
22+schlafende Einladung ist ein Mensch, der wartet.
23+
24+Annehmen tritt dem Team bei und wechselt sogleich dorthin: wer eine Einladung
25+annimmt, will hin. Ablehnen sagt niemandem etwas und verhindert nicht, später
26+erneut eingeladen zu werden.
27+
28+## Teams verwalten und Mitglieder einladen
29+
30+Von diesem Bildschirm aus kann jedes Mitglied das Team umbenennen, jemanden
31+über den Benutzernamen einladen, eine offene Einladung zurückziehen, ein neues
32+Team anlegen oder dieses verlassen. Es gibt keine Eigentümerin und keinen
33+Eigentümer eines Teams, also auch niemanden, den man um Erlaubnis fragen muss.
34+
35+Fehler beim Einladen sind ausdrücklich und erscheinen neben dem Feld:
36+unbekanntes Konto, bereits Mitglied, Einladung bereits offen. Das ist die
37+einzige Stelle, an der die Anwendung preisgibt, dass ein Konto existiert, und
38+das ist bewusst so, denn man muss jemanden einladen können.
39+
40+Die Schaltfläche zum Verlassen des Teams erscheint nur, wenn ich mindestens
41+zwei Teams angehöre. Die Regel ist klar: man ist immer irgendwo Mitglied.
42+
43+## Sprache und Darstellung
44+
45+Die Sprache der Oberfläche wird hier gewählt, zwischen Französisch, Englisch
46+und Deutsch. Diese Einstellung gehört zum Konto, nicht zum Browser.
47+
48+Direkt darunter bietet das Anzeigethema das Aussehen Organic, das der
49+Screenshots dieser Dokumentation, sowie ein kontraststarkes Schwarzweiß für
50+alle, die maximale Lesbarkeit brauchen.
51+
52+## Die Sitzung
53+
54+Ganz unten stehen der Passwortwechsel und das Abmelden.
added docs/site-documentation/content/ecrans/parametres.en.md +53 -0
new file mode 100644
@@ -0,0 +1,53 @@
1++++
2+title = "The settings"
3+description = "The team, the invitations, the language, the display and the session, in that order."
4+weight = 13
5++++
6+
7+{{<shot name="parametres" alt="Settings screen: a received invitation card with Accept and Decline, an Account card, shortcuts to My entries and Categories, and the team renaming field." lang={lang} legende="Whatever needs an answer sits at the top." />}}
8+
9+This screen gathers everything that does not fit anywhere else:
10+- Team invitations
11+- Editing entries and categories (for the people who think that way)
12+- My teams
13+- Display
14+- My account
15+
16+## Invitations, right at the top
17+
18+{{<extrait name="x-invitation" alt="Invitation card: “noa invites you to join the team Copropriété”, with Accept and Decline buttons." lang={lang} />}}
19+
20+A received invitation appears as a coloured card with two buttons. A counter
21+also appears on the Settings tab, because a sleeping invitation is a person
22+waiting.
23+
24+Accepting joins the team and switches to it immediately: when you accept an
25+invitation, you want to go there. Declining tells nobody anything, and does not
26+prevent being invited again later.
27+
28+## Managing teams and inviting members
29+
30+From this screen, any member can rename the team, invite someone by username,
31+cancel a pending invitation, create a new team, or leave this one. There is no
32+team owner, and therefore nobody whose permission you have to ask.
33+
34+Invitation errors are explicit and appear next to the field: unknown account,
35+already a member, invitation already pending. This is the only place where the
36+application can reveal that an account exists, and that is assumed, since you
37+have to be able to invite somebody.
38+
39+The button to leave the team only appears if I belong to at least two teams.
40+The rule is firm: you are always a member somewhere.
41+
42+## Language and display
43+
44+The interface language is chosen here, between French, English and German. It
45+is a setting of the account, not of the browser.
46+
47+Just below, the display theme offers the Organic look, the one in this
48+documentation's screenshots, and a high-contrast black and white look for
49+anyone who needs maximum legibility.
50+
51+## The session
52+
53+At the very bottom, the password change and the sign-out.
new file mode 100644
@@ -0,0 +1,53 @@
1++++
2+title = "The settings"
3+description = "The team, the invitations, the language, the display and the session, in that order."
4+weight = 13
5++++
6+
7+{{<shot name="parametres" alt="Settings screen: a received invitation card with Accept and Decline, an Account card, shortcuts to My entries and Categories, and the team renaming field." lang={lang} legende="Whatever needs an answer sits at the top." />}}
8+
9+This screen gathers everything that does not fit anywhere else:
10+- Team invitations
11+- Editing entries and categories (for the people who think that way)
12+- My teams
13+- Display
14+- My account
15+
16+## Invitations, right at the top
17+
18+{{<extrait name="x-invitation" alt="Invitation card: “noa invites you to join the team Copropriété”, with Accept and Decline buttons." lang={lang} />}}
19+
20+A received invitation appears as a coloured card with two buttons. A counter
21+also appears on the Settings tab, because a sleeping invitation is a person
22+waiting.
23+
24+Accepting joins the team and switches to it immediately: when you accept an
25+invitation, you want to go there. Declining tells nobody anything, and does not
26+prevent being invited again later.
27+
28+## Managing teams and inviting members
29+
30+From this screen, any member can rename the team, invite someone by username,
31+cancel a pending invitation, create a new team, or leave this one. There is no
32+team owner, and therefore nobody whose permission you have to ask.
33+
34+Invitation errors are explicit and appear next to the field: unknown account,
35+already a member, invitation already pending. This is the only place where the
36+application can reveal that an account exists, and that is assumed, since you
37+have to be able to invite somebody.
38+
39+The button to leave the team only appears if I belong to at least two teams.
40+The rule is firm: you are always a member somewhere.
41+
42+## Language and display
43+
44+The interface language is chosen here, between French, English and German. It
45+is a setting of the account, not of the browser.
46+
47+Just below, the display theme offers the Organic look, the one in this
48+documentation's screenshots, and a high-contrast black and white look for
49+anyone who needs maximum legibility.
50+
51+## The session
52+
53+At the very bottom, the password change and the sign-out.
added docs/site-documentation/content/ecrans/parametres.md +54 -0
new file mode 100644
@@ -0,0 +1,54 @@
1++++
2+title = "Les paramètres"
3+description = "L'équipe, les invitations, la langue, l'affichage et la session, dans cet ordre."
4+weight = 13
5++++
6+
7+{{<shot name="parametres" alt="Écran Paramètres : carte d'invitation reçue avec Accepter et Refuser, carte Compte, raccourcis Mes saisies et Catégories, champ de renommage de l'équipe." lang={lang} legende="Ce qui demande une réponse est en haut." />}}
8+
9+Cet écran regroupe tout ce qui ne rentre pas ailleurs:
10+- Invitations aux équipes
11+- Modifications des temps et catégories (pour les gens qui réfléchissent comme ça)
12+- Mes équipes
13+- Affichage
14+- Mon compte
15+
16+## Les invitations, tout en haut
17+
18+{{<extrait name="x-invitation" alt="Carte d'invitation : « noa t'invite à rejoindre l'équipe Copropriété », boutons Accepter et Refuser." lang={lang} />}}
19+
20+Une invitation reçue s'affiche en carte colorée, avec deux boutons. Un compteur
21+apparaît aussi sur l'onglet Réglages, parce qu'une invitation qui dort est une
22+personne qui attend.
23+
24+Accepter fait rejoindre l'équipe et bascule dessus dans la foulée : quand on
25+accepte une invitation, c'est qu'on veut y aller. Refuser ne dit rien à
26+personne, et n'empêche pas d'être réinvité plus tard.
27+
28+## Gérer les équipes et inviter des membres
29+
30+Depuis cet écran, n'importe quel membre peut renommer l'équipe, inviter
31+quelqu'un par son identifiant, annuler une invitation en attente, créer une
32+nouvelle équipe, ou quitter celle-ci. Il n'y a pas de propriétaire d'équipe, et
33+donc pas de personne à qui demander la permission.
34+
35+Les erreurs d'invitation sont explicites et s'affichent à côté du champ :
36+compte inconnu, déjà membre, invitation déjà en attente. C'est le seul endroit
37+où l'application peut dire qu'un compte existe, et c'est assumé, puisqu'il faut
38+bien pouvoir inviter quelqu'un.
39+
40+Le bouton pour quitter l'équipe n'apparaît que si j'appartiens à au moins deux
41+équipes. L'invariant est net : on est toujours membre de quelque part.
42+
43+## La langue et l'affichage
44+
45+La langue de l'interface se choisit ici, entre le français, l'anglais et
46+l'allemand. Ce réglage est au niveau du compte, pas du navigateur.
47+
48+Juste dessous, le thème d'affichage propose l'apparence Organic, celle des
49+captures de cette documentation, et une apparence à contraste élevé, en noir et
50+blanc, pour qui a besoin de lisibilité maximale.
51+
52+## La session
53+
54+Tout en bas, le changement de mot de passe et la déconnexion.
new file mode 100644
@@ -0,0 +1,54 @@
1++++
2+title = "Les paramètres"
3+description = "L'équipe, les invitations, la langue, l'affichage et la session, dans cet ordre."
4+weight = 13
5++++
6+
7+{{<shot name="parametres" alt="Écran Paramètres : carte d'invitation reçue avec Accepter et Refuser, carte Compte, raccourcis Mes saisies et Catégories, champ de renommage de l'équipe." lang={lang} legende="Ce qui demande une réponse est en haut." />}}
8+
9+Cet écran regroupe tout ce qui ne rentre pas ailleurs:
10+- Invitations aux équipes
11+- Modifications des temps et catégories (pour les gens qui réfléchissent comme ça)
12+- Mes équipes
13+- Affichage
14+- Mon compte
15+
16+## Les invitations, tout en haut
17+
18+{{<extrait name="x-invitation" alt="Carte d'invitation : « noa t'invite à rejoindre l'équipe Copropriété », boutons Accepter et Refuser." lang={lang} />}}
19+
20+Une invitation reçue s'affiche en carte colorée, avec deux boutons. Un compteur
21+apparaît aussi sur l'onglet Réglages, parce qu'une invitation qui dort est une
22+personne qui attend.
23+
24+Accepter fait rejoindre l'équipe et bascule dessus dans la foulée : quand on
25+accepte une invitation, c'est qu'on veut y aller. Refuser ne dit rien à
26+personne, et n'empêche pas d'être réinvité plus tard.
27+
28+## Gérer les équipes et inviter des membres
29+
30+Depuis cet écran, n'importe quel membre peut renommer l'équipe, inviter
31+quelqu'un par son identifiant, annuler une invitation en attente, créer une
32+nouvelle équipe, ou quitter celle-ci. Il n'y a pas de propriétaire d'équipe, et
33+donc pas de personne à qui demander la permission.
34+
35+Les erreurs d'invitation sont explicites et s'affichent à côté du champ :
36+compte inconnu, déjà membre, invitation déjà en attente. C'est le seul endroit
37+où l'application peut dire qu'un compte existe, et c'est assumé, puisqu'il faut
38+bien pouvoir inviter quelqu'un.
39+
40+Le bouton pour quitter l'équipe n'apparaît que si j'appartiens à au moins deux
41+équipes. L'invariant est net : on est toujours membre de quelque part.
42+
43+## La langue et l'affichage
44+
45+La langue de l'interface se choisit ici, entre le français, l'anglais et
46+l'allemand. Ce réglage est au niveau du compte, pas du navigateur.
47+
48+Juste dessous, le thème d'affichage propose l'apparence Organic, celle des
49+captures de cette documentation, et une apparence à contraste élevé, en noir et
50+blanc, pour qui a besoin de lisibilité maximale.
51+
52+## La session
53+
54+Tout en bas, le changement de mot de passe et la déconnexion.
added docs/site-documentation/content/ecrans/stats.de.md +60 -0
new file mode 100644
@@ -0,0 +1,60 @@
1++++
2+title = "Die Statistik"
3+description = "Sechs gestapelte Diagramme, eine Ansicht je Gruppe und die Details auf Fingerdruck."
4+weight = 7
5++++
6+
7+{{<shot name="stats" alt="Statistik-Bildschirm: Link „Meine Einträge“, die Pillen Maison und Temps avec Alix, dann das Wochendiagramm mit einer Säule pro Tag." lang={lang} legende="Die Summe der Periode steht im Titel, nicht in einer Ecke." />}}
8+
9+Das ist der Bildschirm, den man am Sonntagabend zu zweit anschaut.
10+
11+## Sechs Diagramme, vom Feinsten zum Weitesten
12+
13+Das erste Diagramm zeigt die Aktivität der Woche, eine Säule pro Tag, nach
14+Person eingefärbt. Es erzählt den Rhythmus: die schweren Tage, die leeren, wer
15+den Haushalt am Mittwoch getragen hat.
16+
17+Die fünf folgenden Diagramme sind nach demselben Prinzip gebaut: eine Säule pro
18+Person und farbige Abschnitte pro Kategorie. Es gibt den Tag, die Woche, den
19+Monat, das Jahr und dann die gesamte Geschichte. Die Höhe ist relativ zum
20+größten gezeigten Wert, und der größte Anteil steht oben in seiner Säule.
21+
22+{{<extrait name="x-legende" alt="Kategorien-Legende: Administratif, Courses, Cuisine, Enfants, Linge, Ménage, jeweils mit ihrer Farbe." lang={lang} legende="Die Farben sind dieselben wie in den Eingabelisten." />}}
23+
24+Jedes Diagramm wird mit zwei Pfeilen durch die Perioden bewegt.
25+
26+## Die Gruppenansichten
27+
28+{{<extrait name="x-scopes" alt="Zwei Navigationspillen: Maison, ausgewählt, und Temps avec Alix." lang={lang} legende="Eine Pille pro Ansicht, das Karussell gleitet von einer zur nächsten." />}}
29+
30+Wurden Kategorien in einer [Gruppe](@/ecrans/categories.de.md) beiseitegestellt,
31+verlassen sie die Team-Statistik und bekommen eine eigene Ansicht mit denselben
32+sechs Diagrammen.
33+
34+{{<shot name="stats-groupe" alt="Die Ansicht „Temps avec Alix“: dieselben Diagramme, nur mit den Kategorien Balade, Histoires und Jeux." lang={lang} legende="Derselbe Bildschirm für ein Thema, das für sich lebt." />}}
35+
36+Zwischen den Ansichten wechselt man durch Tippen auf eine Pille oder durch
37+Wischen. Ohne JavaScript bleiben die Pillen einfache Anker, und die Navigation
38+funktioniert weiterhin.
39+
40+Warum trennen statt alles zu stapeln? Weil ein umfangreiches Thema alle anderen
41+in einem gemeinsamen Diagramm erdrückt, und weil manche Dinge sich nicht
42+vergleichen lassen. Die Zeit, die man mit einem Kind spielt, steht nicht in
43+Konkurrenz zur Zeit beim Einkaufen.
44+
45+## Das Detail eines Abschnitts
46+
47+{{<shot name="stats-detail" alt="Detailblatt am unteren Rand: Kategorie Enfants, camille, 3 Std. 15, 29 % ihrer Zeit, 6 Einträge." lang={lang} legende="Ein Tippen auf einen Abschnitt zeigt seine Details." />}}
48+
49+Ein Tippen auf einen farbigen Abschnitt öffnet ein Pop-up: welche Kategorie,
50+wer, wie lange, welcher Anteil an der eigenen Zeit in der Periode, und wie
51+viele Einträge.
52+
53+## Wer in den Säulen auftaucht
54+
55+Die aktuellen Mitglieder des Teams und die ehemaligen, die in der Periode Zeit
56+haben. Wer das Team verlassen hat, wird nicht aus der Geschichte gelöscht: was
57+getan wurde, wurde getan.
58+
59+Oben auf dem Bildschirm führt der Link „Meine Einträge“ zur Liste meiner
60+eigenen Zeiten, dort wird korrigiert.
new file mode 100644
@@ -0,0 +1,60 @@
1++++
2+title = "Die Statistik"
3+description = "Sechs gestapelte Diagramme, eine Ansicht je Gruppe und die Details auf Fingerdruck."
4+weight = 7
5++++
6+
7+{{<shot name="stats" alt="Statistik-Bildschirm: Link „Meine Einträge“, die Pillen Maison und Temps avec Alix, dann das Wochendiagramm mit einer Säule pro Tag." lang={lang} legende="Die Summe der Periode steht im Titel, nicht in einer Ecke." />}}
8+
9+Das ist der Bildschirm, den man am Sonntagabend zu zweit anschaut.
10+
11+## Sechs Diagramme, vom Feinsten zum Weitesten
12+
13+Das erste Diagramm zeigt die Aktivität der Woche, eine Säule pro Tag, nach
14+Person eingefärbt. Es erzählt den Rhythmus: die schweren Tage, die leeren, wer
15+den Haushalt am Mittwoch getragen hat.
16+
17+Die fünf folgenden Diagramme sind nach demselben Prinzip gebaut: eine Säule pro
18+Person und farbige Abschnitte pro Kategorie. Es gibt den Tag, die Woche, den
19+Monat, das Jahr und dann die gesamte Geschichte. Die Höhe ist relativ zum
20+größten gezeigten Wert, und der größte Anteil steht oben in seiner Säule.
21+
22+{{<extrait name="x-legende" alt="Kategorien-Legende: Administratif, Courses, Cuisine, Enfants, Linge, Ménage, jeweils mit ihrer Farbe." lang={lang} legende="Die Farben sind dieselben wie in den Eingabelisten." />}}
23+
24+Jedes Diagramm wird mit zwei Pfeilen durch die Perioden bewegt.
25+
26+## Die Gruppenansichten
27+
28+{{<extrait name="x-scopes" alt="Zwei Navigationspillen: Maison, ausgewählt, und Temps avec Alix." lang={lang} legende="Eine Pille pro Ansicht, das Karussell gleitet von einer zur nächsten." />}}
29+
30+Wurden Kategorien in einer [Gruppe](@/ecrans/categories.de.md) beiseitegestellt,
31+verlassen sie die Team-Statistik und bekommen eine eigene Ansicht mit denselben
32+sechs Diagrammen.
33+
34+{{<shot name="stats-groupe" alt="Die Ansicht „Temps avec Alix“: dieselben Diagramme, nur mit den Kategorien Balade, Histoires und Jeux." lang={lang} legende="Derselbe Bildschirm für ein Thema, das für sich lebt." />}}
35+
36+Zwischen den Ansichten wechselt man durch Tippen auf eine Pille oder durch
37+Wischen. Ohne JavaScript bleiben die Pillen einfache Anker, und die Navigation
38+funktioniert weiterhin.
39+
40+Warum trennen statt alles zu stapeln? Weil ein umfangreiches Thema alle anderen
41+in einem gemeinsamen Diagramm erdrückt, und weil manche Dinge sich nicht
42+vergleichen lassen. Die Zeit, die man mit einem Kind spielt, steht nicht in
43+Konkurrenz zur Zeit beim Einkaufen.
44+
45+## Das Detail eines Abschnitts
46+
47+{{<shot name="stats-detail" alt="Detailblatt am unteren Rand: Kategorie Enfants, camille, 3 Std. 15, 29 % ihrer Zeit, 6 Einträge." lang={lang} legende="Ein Tippen auf einen Abschnitt zeigt seine Details." />}}
48+
49+Ein Tippen auf einen farbigen Abschnitt öffnet ein Pop-up: welche Kategorie,
50+wer, wie lange, welcher Anteil an der eigenen Zeit in der Periode, und wie
51+viele Einträge.
52+
53+## Wer in den Säulen auftaucht
54+
55+Die aktuellen Mitglieder des Teams und die ehemaligen, die in der Periode Zeit
56+haben. Wer das Team verlassen hat, wird nicht aus der Geschichte gelöscht: was
57+getan wurde, wurde getan.
58+
59+Oben auf dem Bildschirm führt der Link „Meine Einträge“ zur Liste meiner
60+eigenen Zeiten, dort wird korrigiert.
added docs/site-documentation/content/ecrans/stats.en.md +57 -0
new file mode 100644
@@ -0,0 +1,57 @@
1++++
2+title = "The statistics"
3+description = "Six stacked charts, one panel per group, and the details on touch."
4+weight = 7
5++++
6+
7+{{<shot name="stats" alt="Statistics screen: a “My entries” link, the scope pills Maison and Temps avec Alix, then the weekly activity chart with one column per day." lang={lang} legende="The total for the period sits in the title, not in a corner." />}}
8+
9+This is the screen you look at together on a Sunday evening.
10+
11+## Six charts, from the finest to the widest
12+
13+The first chart gives the activity of the week, one column per day, coloured by
14+person. That one tells the rhythm: the heavy days, the empty ones, who held the
15+household together on Wednesday.
16+
17+The five charts that follow are built on the same principle: one column per
18+person and coloured segments per category. There is the day, the week, the
19+month, the year, then the whole history. Height is relative to the largest
20+column shown, and the biggest share sits at the top of its column.
21+
22+{{<extrait name="x-legende" alt="Category legend: Administratif, Courses, Cuisine, Enfants, Linge, Ménage, each with its colour." lang={lang} legende="The colours are the ones used in the entry lists." />}}
23+
24+Each chart is navigated by period with two arrows.
25+
26+## Group panels
27+
28+{{<extrait name="x-scopes" alt="Two navigation pills: Maison, selected, and Temps avec Alix." lang={lang} legende="One pill per panel, and the carousel slides from one to the next." />}}
29+
30+When categories have been set apart in a [group](@/ecrans/categories.en.md), they
31+leave the team statistics and get their own panel, with the same six charts.
32+
33+{{<shot name="stats-groupe" alt="The “Temps avec Alix” panel: the same charts, with only the Balade, Histoires and Jeux categories." lang={lang} legende="The same screen for a subject that lives apart." />}}
34+
35+You move between panels by touching a pill or by swiping the carousel. Without
36+JavaScript the pills remain plain anchors and navigation still works.
37+
38+Why separate rather than stack everything? Because a bulky subject crushes all
39+the others in a shared chart, and because some things do not compare. The time
40+spent playing with a child is not in competition with the time spent buying
41+groceries.
42+
43+## The detail of a segment
44+
45+{{<shot name="stats-detail" alt="Detail sheet open at the bottom of the screen: category Enfants, camille, 3 h 15, 29 % of their time, 6 entries." lang={lang} legende="Tap a segment and its details appear." />}}
46+
47+Touching a coloured segment opens a pop-up: which category, who, how long, what
48+share of their time over the period, and how many entries.
49+
50+## Who appears in the columns
51+
52+The current members of the team, and former members who have time in the
53+period. Someone who left the team is not erased from the history: what they did
54+was done.
55+
56+At the top of the screen, the “My entries” link leads to the list of my own
57+time, where corrections happen.
new file mode 100644
@@ -0,0 +1,57 @@
1++++
2+title = "The statistics"
3+description = "Six stacked charts, one panel per group, and the details on touch."
4+weight = 7
5++++
6+
7+{{<shot name="stats" alt="Statistics screen: a “My entries” link, the scope pills Maison and Temps avec Alix, then the weekly activity chart with one column per day." lang={lang} legende="The total for the period sits in the title, not in a corner." />}}
8+
9+This is the screen you look at together on a Sunday evening.
10+
11+## Six charts, from the finest to the widest
12+
13+The first chart gives the activity of the week, one column per day, coloured by
14+person. That one tells the rhythm: the heavy days, the empty ones, who held the
15+household together on Wednesday.
16+
17+The five charts that follow are built on the same principle: one column per
18+person and coloured segments per category. There is the day, the week, the
19+month, the year, then the whole history. Height is relative to the largest
20+column shown, and the biggest share sits at the top of its column.
21+
22+{{<extrait name="x-legende" alt="Category legend: Administratif, Courses, Cuisine, Enfants, Linge, Ménage, each with its colour." lang={lang} legende="The colours are the ones used in the entry lists." />}}
23+
24+Each chart is navigated by period with two arrows.
25+
26+## Group panels
27+
28+{{<extrait name="x-scopes" alt="Two navigation pills: Maison, selected, and Temps avec Alix." lang={lang} legende="One pill per panel, and the carousel slides from one to the next." />}}
29+
30+When categories have been set apart in a [group](@/ecrans/categories.en.md), they
31+leave the team statistics and get their own panel, with the same six charts.
32+
33+{{<shot name="stats-groupe" alt="The “Temps avec Alix” panel: the same charts, with only the Balade, Histoires and Jeux categories." lang={lang} legende="The same screen for a subject that lives apart." />}}
34+
35+You move between panels by touching a pill or by swiping the carousel. Without
36+JavaScript the pills remain plain anchors and navigation still works.
37+
38+Why separate rather than stack everything? Because a bulky subject crushes all
39+the others in a shared chart, and because some things do not compare. The time
40+spent playing with a child is not in competition with the time spent buying
41+groceries.
42+
43+## The detail of a segment
44+
45+{{<shot name="stats-detail" alt="Detail sheet open at the bottom of the screen: category Enfants, camille, 3 h 15, 29 % of their time, 6 entries." lang={lang} legende="Tap a segment and its details appear." />}}
46+
47+Touching a coloured segment opens a pop-up: which category, who, how long, what
48+share of their time over the period, and how many entries.
49+
50+## Who appears in the columns
51+
52+The current members of the team, and former members who have time in the
53+period. Someone who left the team is not erased from the history: what they did
54+was done.
55+
56+At the top of the screen, the “My entries” link leads to the list of my own
57+time, where corrections happen.
added docs/site-documentation/content/ecrans/stats.md +60 -0
new file mode 100644
@@ -0,0 +1,60 @@
1++++
2+title = "Les statistiques"
3+description = "Six graphiques empilés, des panneaux par groupe et les détails au toucher."
4+weight = 7
5++++
6+
7+{{<shot name="stats" alt="Écran Statistiques : lien « Mes saisies », pastilles de scopes Maison et Temps avec Alix, puis le graphique de l'activité de la semaine, une colonne par jour." lang={lang} legende="Le total de la période est dans le titre, pas dans un coin." />}}
8+
9+C'est l'écran qu'on regarde à deux, le dimanche soir.
10+
11+## Six graphiques, du plus fin au plus large
12+
13+Le premier graphique donne l'activité de la semaine, une colonne par jour,
14+colorée par personne. C'est celui qui raconte le rythme : les grosses journées,
15+les jours creux, qui a tenu la maison mercredi.
16+
17+Les cinq graphiques qui suivent sont bâtis sur le même principe : une colonne par
18+personne et des segments de couleur par catégorie. On a le jour, la semaine, le mois,
19+l'année, puis tout l'historique. La hauteur est relative au maximum affiché, et
20+la plus grosse part se place en haut de la colonne.
21+
22+{{<extrait name="x-legende" alt="Légende des catégories : Administratif, Courses, Cuisine, Enfants, Linge, Ménage, chacune avec sa couleur." lang={lang} legende="Les couleurs sont les mêmes que dans les listes de saisie." />}}
23+
24+Chaque graphique se navigue par période avec deux flèches.
25+
26+## Les panneaux de groupes
27+
28+{{<extrait name="x-scopes" alt="Deux pastilles de navigation : Maison, sélectionnée, et Temps avec Alix." lang={lang} legende="Une pastille par panneau, le carrousel glisse de l'un à l'autre." />}}
29+
30+Quand des catégories ont été mises à part dans un [groupe](@/ecrans/categories.md),
31+elles quittent les statistiques de l'équipe et reçoivent leur propre panneau,
32+avec les six mêmes graphiques.
33+
34+{{<shot name="stats-groupe" alt="Panneau « Temps avec Alix » : les mêmes graphiques, avec les catégories Balade, Histoires et Jeux uniquement." lang={lang} legende="Le même écran pour un sujet qui vit à part." />}}
35+
36+On passe d'un panneau à l'autre en touchant une pastille ou en faisant glisser
37+le carrousel. Sans JavaScript, les pastilles restent de simples ancres et la
38+navigation fonctionne toujours.
39+
40+Pourquoi séparer plutôt que tout empiler ? Parce qu'un sujet volumineux écrase
41+tous les autres dans un graphique commun, et parce que certaines choses ne se
42+comparent pas. Le temps passé à jouer avec un enfant n'est pas en concurrence
43+avec le temps passé à faire les courses.
44+
45+## Le détail d'un segment
46+
47+{{<shot name="stats-detail" alt="Feuille de détail ouverte au bas de l'écran : catégorie Enfants, camille, 3 h 15, part de son temps 29 %, 6 saisies." lang={lang} legende="Au clic d’un segment on affiche ses détails." />}}
48+
49+Toucher un segment de couleur ouvre une pop up : quelle catégorie,
50+qui, combien de temps, quelle part de son temps sur la période, et combien de
51+saisies.
52+
53+## Qui apparaît dans les colonnes
54+
55+Les membres actuels de l'équipe, et les anciens membres qui ont du temps sur la
56+période. Quelqu'un qui a quitté l'équipe ne s'efface pas de l'histoire : ce
57+qu'il a fait a été fait.
58+
59+En haut de l'écran, le lien « Mes saisies » mène à la liste de mes propres
60+temps, pour corriger ce qui doit l'être.
new file mode 100644
@@ -0,0 +1,60 @@
1++++
2+title = "Les statistiques"
3+description = "Six graphiques empilés, des panneaux par groupe et les détails au toucher."
4+weight = 7
5++++
6+
7+{{<shot name="stats" alt="Écran Statistiques : lien « Mes saisies », pastilles de scopes Maison et Temps avec Alix, puis le graphique de l'activité de la semaine, une colonne par jour." lang={lang} legende="Le total de la période est dans le titre, pas dans un coin." />}}
8+
9+C'est l'écran qu'on regarde à deux, le dimanche soir.
10+
11+## Six graphiques, du plus fin au plus large
12+
13+Le premier graphique donne l'activité de la semaine, une colonne par jour,
14+colorée par personne. C'est celui qui raconte le rythme : les grosses journées,
15+les jours creux, qui a tenu la maison mercredi.
16+
17+Les cinq graphiques qui suivent sont bâtis sur le même principe : une colonne par
18+personne et des segments de couleur par catégorie. On a le jour, la semaine, le mois,
19+l'année, puis tout l'historique. La hauteur est relative au maximum affiché, et
20+la plus grosse part se place en haut de la colonne.
21+
22+{{<extrait name="x-legende" alt="Légende des catégories : Administratif, Courses, Cuisine, Enfants, Linge, Ménage, chacune avec sa couleur." lang={lang} legende="Les couleurs sont les mêmes que dans les listes de saisie." />}}
23+
24+Chaque graphique se navigue par période avec deux flèches.
25+
26+## Les panneaux de groupes
27+
28+{{<extrait name="x-scopes" alt="Deux pastilles de navigation : Maison, sélectionnée, et Temps avec Alix." lang={lang} legende="Une pastille par panneau, le carrousel glisse de l'un à l'autre." />}}
29+
30+Quand des catégories ont été mises à part dans un [groupe](@/ecrans/categories.md),
31+elles quittent les statistiques de l'équipe et reçoivent leur propre panneau,
32+avec les six mêmes graphiques.
33+
34+{{<shot name="stats-groupe" alt="Panneau « Temps avec Alix » : les mêmes graphiques, avec les catégories Balade, Histoires et Jeux uniquement." lang={lang} legende="Le même écran pour un sujet qui vit à part." />}}
35+
36+On passe d'un panneau à l'autre en touchant une pastille ou en faisant glisser
37+le carrousel. Sans JavaScript, les pastilles restent de simples ancres et la
38+navigation fonctionne toujours.
39+
40+Pourquoi séparer plutôt que tout empiler ? Parce qu'un sujet volumineux écrase
41+tous les autres dans un graphique commun, et parce que certaines choses ne se
42+comparent pas. Le temps passé à jouer avec un enfant n'est pas en concurrence
43+avec le temps passé à faire les courses.
44+
45+## Le détail d'un segment
46+
47+{{<shot name="stats-detail" alt="Feuille de détail ouverte au bas de l'écran : catégorie Enfants, camille, 3 h 15, part de son temps 29 %, 6 saisies." lang={lang} legende="Au clic d’un segment on affiche ses détails." />}}
48+
49+Toucher un segment de couleur ouvre une pop up : quelle catégorie,
50+qui, combien de temps, quelle part de son temps sur la période, et combien de
51+saisies.
52+
53+## Qui apparaît dans les colonnes
54+
55+Les membres actuels de l'équipe, et les anciens membres qui ont du temps sur la
56+période. Quelqu'un qui a quitté l'équipe ne s'efface pas de l'histoire : ce
57+qu'il a fait a été fait.
58+
59+En haut de l'écran, le lien « Mes saisies » mène à la liste de mes propres
60+temps, pour corriger ce qui doit l'être.
added docs/site-documentation/content/ecrans/tache-effectuee.de.md +35 -0
new file mode 100644
@@ -0,0 +1,35 @@
1++++
2+title = "Eine Aufgabe als erledigt markieren"
3+weight = 12
4++++
5+
6+{{<shot name="tache-effectuee" alt="Bildschirm „Aufgabe erledigt“: Name der Aufgabe, Schalter „Zeit erfassen“ mit Minutenzähler, dann Schalter „Neu ansetzen“ mit vorgeschlagenem Datum und beobachtetem Rhythmus." lang={lang} legende="Zwei Vorschläge, eine Bestätigung." />}}
7+
8+Zu sagen, dass eine Aufgabe erledigt ist, wirft drei Fragen auf einmal auf.
9+
10+## Erstens: es ist getan
11+
12+Die Aufgabe geht in den erledigten Zustand über, mit dem Namen der Person und
13+dem Datum. Nichts wird gelöscht: jeder Zustandswechsel bleibt erhalten, was
14+einer Aufgabe eine kleine eigene Geschichte gibt.
15+
16+## Zweitens: die verbrachte Zeit erfassen
17+
18+Der Schalter „Zeit erfassen“ bietet an, einen Eintrag in der Kategorie der
19+Aufgabe anzulegen, im Namen der Person, die sie gerade abgeschlossen hat.
20+Das ist freiwillig. Die Zeit kann schon mit der Stoppuhr gemessen worden sein,
21+oder man hat fünf verschiedene Aufgaben derselben Kategorie in einem Rutsch
22+gemessen.
23+
24+Die Abkürzung kann ersparen, es getrennt zu tun.
25+
26+## Drittens: neu ansetzen
27+
28+Der Schalter „Neu ansetzen“ schlägt ein Datum vor, berechnet aus den früheren
29+Abschlüssen dieser Aufgabe. Die Anwendung nimmt den mittleren Abstand zwischen
30+zwei Abschlüssen, wendet eine Untergrenze von einer Woche an und zeigt den
31+beobachteten Rhythmus, zum Beispiel „etwa alle 8 Tage“.
32+
33+Man nimmt den Median statt des Durchschnitts, damit ein Urlaubsmonat nicht den
34+ganzen Rhythmus verschiebt. Und dieser Schritt bleibt freiwillig: der Schalter
35+erlaubt es, ihn abzuschalten.
new file mode 100644
@@ -0,0 +1,35 @@
1++++
2+title = "Eine Aufgabe als erledigt markieren"
3+weight = 12
4++++
5+
6+{{<shot name="tache-effectuee" alt="Bildschirm „Aufgabe erledigt“: Name der Aufgabe, Schalter „Zeit erfassen“ mit Minutenzähler, dann Schalter „Neu ansetzen“ mit vorgeschlagenem Datum und beobachtetem Rhythmus." lang={lang} legende="Zwei Vorschläge, eine Bestätigung." />}}
7+
8+Zu sagen, dass eine Aufgabe erledigt ist, wirft drei Fragen auf einmal auf.
9+
10+## Erstens: es ist getan
11+
12+Die Aufgabe geht in den erledigten Zustand über, mit dem Namen der Person und
13+dem Datum. Nichts wird gelöscht: jeder Zustandswechsel bleibt erhalten, was
14+einer Aufgabe eine kleine eigene Geschichte gibt.
15+
16+## Zweitens: die verbrachte Zeit erfassen
17+
18+Der Schalter „Zeit erfassen“ bietet an, einen Eintrag in der Kategorie der
19+Aufgabe anzulegen, im Namen der Person, die sie gerade abgeschlossen hat.
20+Das ist freiwillig. Die Zeit kann schon mit der Stoppuhr gemessen worden sein,
21+oder man hat fünf verschiedene Aufgaben derselben Kategorie in einem Rutsch
22+gemessen.
23+
24+Die Abkürzung kann ersparen, es getrennt zu tun.
25+
26+## Drittens: neu ansetzen
27+
28+Der Schalter „Neu ansetzen“ schlägt ein Datum vor, berechnet aus den früheren
29+Abschlüssen dieser Aufgabe. Die Anwendung nimmt den mittleren Abstand zwischen
30+zwei Abschlüssen, wendet eine Untergrenze von einer Woche an und zeigt den
31+beobachteten Rhythmus, zum Beispiel „etwa alle 8 Tage“.
32+
33+Man nimmt den Median statt des Durchschnitts, damit ein Urlaubsmonat nicht den
34+ganzen Rhythmus verschiebt. Und dieser Schritt bleibt freiwillig: der Schalter
35+erlaubt es, ihn abzuschalten.
added docs/site-documentation/content/ecrans/tache-effectuee.en.md +34 -0
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Marking a task done"
3+weight = 12
4++++
5+
6+{{<shot name="tache-effectuee" alt="Task done screen: the task name, a “Record time” switch with a minute counter, then a “Reschedule” switch with the proposed date and the observed rhythm." lang={lang} legende="Two proposals, one confirmation." />}}
7+
8+Saying that a task is done raises three questions at once.
9+
10+## One, it is done
11+
12+The task returns to the finished state, with the name of the person and the
13+date. Nothing is erased: every state change is kept, which gives a task a small
14+history of its own.
15+
16+## Two, recording the time spent
17+
18+The “Record time” switch offers to create an entry in the task's category, in
19+the name of whoever just finished it.
20+It is optional. The time may already have been measured with the timer, or five
21+different tasks of the same category may have been measured in one go.
22+
23+The shortcut can save having to do it separately.
24+
25+## Three, rescheduling
26+
27+The “Reschedule” switch proposes a date, computed from the previous
28+completions of this task. The application takes the median gap between two
29+completions, applies a floor of one week, and displays the rhythm it observed,
30+for instance “roughly every 8 days”.
31+
32+The median is used rather than the average, because a month of holidays must
33+not shift the whole rhythm. And this step stays optional: the switch lets you
34+turn it off.
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Marking a task done"
3+weight = 12
4++++
5+
6+{{<shot name="tache-effectuee" alt="Task done screen: the task name, a “Record time” switch with a minute counter, then a “Reschedule” switch with the proposed date and the observed rhythm." lang={lang} legende="Two proposals, one confirmation." />}}
7+
8+Saying that a task is done raises three questions at once.
9+
10+## One, it is done
11+
12+The task returns to the finished state, with the name of the person and the
13+date. Nothing is erased: every state change is kept, which gives a task a small
14+history of its own.
15+
16+## Two, recording the time spent
17+
18+The “Record time” switch offers to create an entry in the task's category, in
19+the name of whoever just finished it.
20+It is optional. The time may already have been measured with the timer, or five
21+different tasks of the same category may have been measured in one go.
22+
23+The shortcut can save having to do it separately.
24+
25+## Three, rescheduling
26+
27+The “Reschedule” switch proposes a date, computed from the previous
28+completions of this task. The application takes the median gap between two
29+completions, applies a floor of one week, and displays the rhythm it observed,
30+for instance “roughly every 8 days”.
31+
32+The median is used rather than the average, because a month of holidays must
33+not shift the whole rhythm. And this step stays optional: the switch lets you
34+turn it off.
added docs/site-documentation/content/ecrans/tache-effectuee.md +34 -0
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Marquer une tâche effectuée"
3+weight = 12
4++++
5+
6+{{<shot name="tache-effectuee" alt="Écran Tâche effectuée : nom de la tâche, interrupteur « Enregistrer un temps » avec un compteur de durée, puis interrupteur « Reprogrammer » avec la date proposée et le rythme constaté." lang={lang} legende="Deux propositions, une validation." />}}
7+
8+Dire qu'une tâche est faite déclenche trois questions d'un coup.
9+
10+## Un, c'est fait
11+
12+La tâche repasse à l'état terminé, avec le nom de la personne et la date. Rien
13+n'est effacé : chaque changement d'état est conservé, ce qui donne à la tâche
14+une petite histoire.
15+
16+## Deux, enregistrer le temps passé
17+
18+L'interrupteur « Enregistrer un temps » propose de créer une saisie dans la
19+catégorie de la tâche, au nom de la personne qui vient de la terminer.
20+C’est facultatif. On peut avoir déjà mesuré le temps via le minuteur, ou mesuré d’un coup
21+cinq tâches différentes de la même catégorie.
22+
23+Le raccourci peut éviter de devoir le faire séparément.
24+
25+## Trois, reprogrammer
26+
27+L'interrupteur « Reprogrammer » propose une date, calculée à partir des
28+complétions précédentes de cette tâche. L'application prend l'écart médian
29+entre deux complétions, applique un plancher d'une semaine, et affiche le
30+rythme qu'elle a constaté, par exemple « tous les 8 jours environ ».
31+
32+On prend la médiane plutôt que la moyenne, parce qu'un mois de vacances ne doit pas
33+décaler tout le rythme. Et cette étape reste facultative: l’interrupteur permet de la
34+désactiver.
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Marquer une tâche effectuée"
3+weight = 12
4++++
5+
6+{{<shot name="tache-effectuee" alt="Écran Tâche effectuée : nom de la tâche, interrupteur « Enregistrer un temps » avec un compteur de durée, puis interrupteur « Reprogrammer » avec la date proposée et le rythme constaté." lang={lang} legende="Deux propositions, une validation." />}}
7+
8+Dire qu'une tâche est faite déclenche trois questions d'un coup.
9+
10+## Un, c'est fait
11+
12+La tâche repasse à l'état terminé, avec le nom de la personne et la date. Rien
13+n'est effacé : chaque changement d'état est conservé, ce qui donne à la tâche
14+une petite histoire.
15+
16+## Deux, enregistrer le temps passé
17+
18+L'interrupteur « Enregistrer un temps » propose de créer une saisie dans la
19+catégorie de la tâche, au nom de la personne qui vient de la terminer.
20+C’est facultatif. On peut avoir déjà mesuré le temps via le minuteur, ou mesuré d’un coup
21+cinq tâches différentes de la même catégorie.
22+
23+Le raccourci peut éviter de devoir le faire séparément.
24+
25+## Trois, reprogrammer
26+
27+L'interrupteur « Reprogrammer » propose une date, calculée à partir des
28+complétions précédentes de cette tâche. L'application prend l'écart médian
29+entre deux complétions, applique un plancher d'une semaine, et affiche le
30+rythme qu'elle a constaté, par exemple « tous les 8 jours environ ».
31+
32+On prend la médiane plutôt que la moyenne, parce qu'un mois de vacances ne doit pas
33+décaler tout le rythme. Et cette étape reste facultative: l’interrupteur permet de la
34+désactiver.
added docs/site-documentation/content/ecrans/tache-formulaire.de.md +34 -0
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Eine Aufgabe anlegen oder ändern"
3+description = "Ein Name, eine Kategorie, ein Datum, und vielleicht ein paar Namen von Menschen."
4+weight = 11
5++++
6+
7+{{<duo a="tache-nouvelle" b="tache-modifier" alt_a="Formular für eine neue Aufgabe: Feld für den Namen, Kategorien als Pillen, Aktivierungsdatum, Liste der Mitglieder zum Zuweisen." alt_b="Dasselbe Formular beim Ändern, mit bereits ausgefülltem Namen und gewählter Kategorie." lang={lang} legende="Dasselbe Formular dient dem Anlegen und dem Korrigieren." />}}
8+
9+Das Formular umfasst vier Fragen, und die Hälfte davon ist freiwillig.
10+
11+## Der Name, die Kategorie, das Datum
12+
13+Die Kategorie wird aus den farbigen Pillen des Teams gewählt, dieselben wie
14+überall sonst, was die Aufgabe an einen Bereich bindet und ihr ihre Farbe in
15+der Liste gibt.
16+
17+Das Datum heißt Aktivierungsdatum, es ist der Tag, ab dem die Aufgabe Sinn ergibt.
18+Bis dieser Tag kommt, wartet die Aufgabe im Block „Demnächst“.
19+
20+## Zuweisung, freiwillig
21+
22+Unten erlaubt die Liste der Teammitglieder, eine oder mehrere Personen zu benennen.
23+Das ist freiwillig, und die anderen können die Aufgabe trotzdem übernehmen.
24+Die Zuweisung dient nur der Anzeige, dem Filter „Meine Aufgaben“ und der Reihenfolge.
25+Sie verleiht und entzieht keinerlei Rechte.
26+
27+## Eine Aufgabe ändern
28+
29+Dasselbe Formular dient dazu, eine bestehende Aufgabe zu korrigieren. Ein
30+Vorbehalt: läuft die Aufgabe gerade, kann nur die Person sie ändern, die sie
31+übernommen hat.
32+
33+Eine Aufgabe wird ebenfalls von hier gelöscht.
34+Das Löschen ist sofort und endgültig.
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "Eine Aufgabe anlegen oder ändern"
3+description = "Ein Name, eine Kategorie, ein Datum, und vielleicht ein paar Namen von Menschen."
4+weight = 11
5++++
6+
7+{{<duo a="tache-nouvelle" b="tache-modifier" alt_a="Formular für eine neue Aufgabe: Feld für den Namen, Kategorien als Pillen, Aktivierungsdatum, Liste der Mitglieder zum Zuweisen." alt_b="Dasselbe Formular beim Ändern, mit bereits ausgefülltem Namen und gewählter Kategorie." lang={lang} legende="Dasselbe Formular dient dem Anlegen und dem Korrigieren." />}}
8+
9+Das Formular umfasst vier Fragen, und die Hälfte davon ist freiwillig.
10+
11+## Der Name, die Kategorie, das Datum
12+
13+Die Kategorie wird aus den farbigen Pillen des Teams gewählt, dieselben wie
14+überall sonst, was die Aufgabe an einen Bereich bindet und ihr ihre Farbe in
15+der Liste gibt.
16+
17+Das Datum heißt Aktivierungsdatum, es ist der Tag, ab dem die Aufgabe Sinn ergibt.
18+Bis dieser Tag kommt, wartet die Aufgabe im Block „Demnächst“.
19+
20+## Zuweisung, freiwillig
21+
22+Unten erlaubt die Liste der Teammitglieder, eine oder mehrere Personen zu benennen.
23+Das ist freiwillig, und die anderen können die Aufgabe trotzdem übernehmen.
24+Die Zuweisung dient nur der Anzeige, dem Filter „Meine Aufgaben“ und der Reihenfolge.
25+Sie verleiht und entzieht keinerlei Rechte.
26+
27+## Eine Aufgabe ändern
28+
29+Dasselbe Formular dient dazu, eine bestehende Aufgabe zu korrigieren. Ein
30+Vorbehalt: läuft die Aufgabe gerade, kann nur die Person sie ändern, die sie
31+übernommen hat.
32+
33+Eine Aufgabe wird ebenfalls von hier gelöscht.
34+Das Löschen ist sofort und endgültig.
added docs/site-documentation/content/ecrans/tache-formulaire.en.md +33 -0
new file mode 100644
@@ -0,0 +1,33 @@
1++++
2+title = "Creating or editing a task"
3+description = "A name, a category, a date, and possibly a few names of people."
4+weight = 11
5++++
6+
7+{{<duo a="tache-nouvelle" b="tache-modifier" alt_a="New task form: task name field, category pills, activation date, and the list of members to assign." alt_b="The same form in editing mode, with the name and category already filled in." lang={lang} legende="The same form serves for creating and for fixing." />}}
8+
9+The form holds four questions and half of them are optional.
10+
11+## The name, the category, the date
12+
13+The category is picked from the team's coloured pills, the same ones as
14+everywhere else, which ties the task to a domain and gives it its colour in the
15+list.
16+
17+The date is called the activation date, it is the day from which the task makes sense.
18+Until that day arrives, the task waits in the “Coming up” block.
19+
20+## Assigning, optionally
21+
22+At the bottom, the list of team members lets you name one or several people.
23+It is optional, and other members can still take the task.
24+Assignment only serves display, the “My tasks” filter, and ordering.
25+It grants and removes no rights whatsoever.
26+
27+## Editing a task
28+
29+The same form serves to fix an existing task. One reservation: if the task is
30+in progress, only the person who took it can change it.
31+
32+A task is also deleted from this screen.
33+Deletion is immediate and final.
new file mode 100644
@@ -0,0 +1,33 @@
1++++
2+title = "Creating or editing a task"
3+description = "A name, a category, a date, and possibly a few names of people."
4+weight = 11
5++++
6+
7+{{<duo a="tache-nouvelle" b="tache-modifier" alt_a="New task form: task name field, category pills, activation date, and the list of members to assign." alt_b="The same form in editing mode, with the name and category already filled in." lang={lang} legende="The same form serves for creating and for fixing." />}}
8+
9+The form holds four questions and half of them are optional.
10+
11+## The name, the category, the date
12+
13+The category is picked from the team's coloured pills, the same ones as
14+everywhere else, which ties the task to a domain and gives it its colour in the
15+list.
16+
17+The date is called the activation date, it is the day from which the task makes sense.
18+Until that day arrives, the task waits in the “Coming up” block.
19+
20+## Assigning, optionally
21+
22+At the bottom, the list of team members lets you name one or several people.
23+It is optional, and other members can still take the task.
24+Assignment only serves display, the “My tasks” filter, and ordering.
25+It grants and removes no rights whatsoever.
26+
27+## Editing a task
28+
29+The same form serves to fix an existing task. One reservation: if the task is
30+in progress, only the person who took it can change it.
31+
32+A task is also deleted from this screen.
33+Deletion is immediate and final.
added docs/site-documentation/content/ecrans/tache-formulaire.md +33 -0
new file mode 100644
@@ -0,0 +1,33 @@
1++++
2+title = "Créer ou modifier une tâche"
3+description = "Un nom, une catégorie, une date, et éventuellement des noms de personnes."
4+weight = 11
5++++
6+
7+{{<duo a="tache-nouvelle" b="tache-modifier" alt_a="Formulaire de nouvelle tâche : champ Nom de la tâche, choix de la catégorie en pastilles, date d'activation, liste des membres à assigner." alt_b="Le même formulaire en modification, avec le nom et la catégorie déjà remplis." lang={lang} legende="Le même formulaire sert à créer et à corriger." />}}
8+
9+Le formulaire tient en quatre questions et la moitié sont facultatives.
10+
11+## Le nom, la catégorie, la date
12+
13+La catégorie se choisit dans les pastilles colorées de l'équipe, les
14+mêmes que partout ailleurs, ce qui rattache la tâche à un domaine et lui donne
15+sa couleur dans la liste.
16+
17+La date est appelée date d'activation, c'est le jour à partir duquel la tâche a du sens.
18+Tant que ce jour n'est pas venu, la tâche patiente dans le bloc « À venir ».
19+
20+## Assignation facultative
21+
22+En bas, la liste des membres de l'équipe permet de désigner une ou plusieurs personnes.
23+C'est facultatif, et les autres membres peuvent quand même prendre la tâche.
24+L'assignation sert juste à l'affichage, au filtre « Mes tâches » et à départager l'ordre d'affichage.
25+Elle ne donne ni ne retire aucun droit.
26+
27+## Modification d’une tâche
28+
29+Le même formulaire sert à corriger une tâche existante. Une réserve : si la
30+tâche est en cours, seule la personne qui l'a prise peut la modifier.
31+
32+Une tâche se supprime aussi depuis cet écran.
33+La suppression est immédiate et définitive.
new file mode 100644
@@ -0,0 +1,33 @@
1++++
2+title = "Créer ou modifier une tâche"
3+description = "Un nom, une catégorie, une date, et éventuellement des noms de personnes."
4+weight = 11
5++++
6+
7+{{<duo a="tache-nouvelle" b="tache-modifier" alt_a="Formulaire de nouvelle tâche : champ Nom de la tâche, choix de la catégorie en pastilles, date d'activation, liste des membres à assigner." alt_b="Le même formulaire en modification, avec le nom et la catégorie déjà remplis." lang={lang} legende="Le même formulaire sert à créer et à corriger." />}}
8+
9+Le formulaire tient en quatre questions et la moitié sont facultatives.
10+
11+## Le nom, la catégorie, la date
12+
13+La catégorie se choisit dans les pastilles colorées de l'équipe, les
14+mêmes que partout ailleurs, ce qui rattache la tâche à un domaine et lui donne
15+sa couleur dans la liste.
16+
17+La date est appelée date d'activation, c'est le jour à partir duquel la tâche a du sens.
18+Tant que ce jour n'est pas venu, la tâche patiente dans le bloc « À venir ».
19+
20+## Assignation facultative
21+
22+En bas, la liste des membres de l'équipe permet de désigner une ou plusieurs personnes.
23+C'est facultatif, et les autres membres peuvent quand même prendre la tâche.
24+L'assignation sert juste à l'affichage, au filtre « Mes tâches » et à départager l'ordre d'affichage.
25+Elle ne donne ni ne retire aucun droit.
26+
27+## Modification d’une tâche
28+
29+Le même formulaire sert à corriger une tâche existante. Une réserve : si la
30+tâche est en cours, seule la personne qui l'a prise peut la modifier.
31+
32+Une tâche se supprime aussi depuis cet écran.
33+La suppression est immédiate et définitive.
added docs/site-documentation/content/ecrans/taches.de.md +35 -0
new file mode 100644
@@ -0,0 +1,35 @@
1++++
2+title = "Die Aufgaben"
3+description = "Was gerade läuft, was zu tun ist, und was bald wiederkommt."
4+weight = 10
5++++
6+
7+{{<shot name="taches" alt="Aufgaben-Bildschirm: Block „Läuft“ mit zwei übernommenen Aufgaben, dann der Block „Zu tun“, jeder Block mit einem Schalter „Meine Aufgaben“." lang={lang} legende="Zwei Blöcke und ein Schalter je Block." />}}
8+
9+Eine Aufgabe ist etwas zu Erledigendes, an eine Kategorie gebunden und auf ein
10+Datum gelegt. Der Bildschirm ordnet sie in drei Zeiten: was läuft, was zu tun
11+ist, und was später kommt, unten zusammengeklappt.
12+
13+## Eine Aufgabe übernehmen
14+
15+{{<extrait name="x-todo-carte" alt="Karte einer laufenden Aufgabe: farbiger Punkt der Kategorie, Name der Aufgabe, der Hinweis „übernommen von sacha“ und das Datum." lang={lang} />}}
16+
17+Eine Aufgabe zu übernehmen setzt sie auf „läuft“ und zeigt, wer sie übernommen hat.
18+Solange sie läuft, kann nur die Person sie ändern, die sie übernommen hat.
19+
20+Die Absicht ist, den Klassiker des Zusammenlebens zu vermeiden: zwei Menschen
21+erledigen denselben Einkauf, beide überzeugt, die andere Person kümmere sich
22+nicht darum. Eine Aufgabe zu übernehmen heißt, sie anzukündigen.
23+
24+Man kann wieder loslassen, was man übernommen hat. Niemand sitzt fest, und wer
25+ein Team verlässt, gibt das dort Gehaltene automatisch frei.
26+
27+## Zuweisen, ohne zu befehlen
28+
29+Eine Aufgabe kann einen oder mehrere Namen tragen.
30+Das ist ein Hinweis, keine Einschränkung: jedes Mitglied kann sie trotzdem übernehmen und abschließen.
31+Das folgt aus der fehlenden Hierarchie in der Anwendung.
32+
33+Jeder Block hat seine Schaltfläche „Meine Aufgaben“, die auf das filtert, was
34+mich betrifft. Der Filter steht in der Adresse der Seite, eine Ansicht lässt
35+sich also als Lesezeichen speichern.
new file mode 100644
@@ -0,0 +1,35 @@
1++++
2+title = "Die Aufgaben"
3+description = "Was gerade läuft, was zu tun ist, und was bald wiederkommt."
4+weight = 10
5++++
6+
7+{{<shot name="taches" alt="Aufgaben-Bildschirm: Block „Läuft“ mit zwei übernommenen Aufgaben, dann der Block „Zu tun“, jeder Block mit einem Schalter „Meine Aufgaben“." lang={lang} legende="Zwei Blöcke und ein Schalter je Block." />}}
8+
9+Eine Aufgabe ist etwas zu Erledigendes, an eine Kategorie gebunden und auf ein
10+Datum gelegt. Der Bildschirm ordnet sie in drei Zeiten: was läuft, was zu tun
11+ist, und was später kommt, unten zusammengeklappt.
12+
13+## Eine Aufgabe übernehmen
14+
15+{{<extrait name="x-todo-carte" alt="Karte einer laufenden Aufgabe: farbiger Punkt der Kategorie, Name der Aufgabe, der Hinweis „übernommen von sacha“ und das Datum." lang={lang} />}}
16+
17+Eine Aufgabe zu übernehmen setzt sie auf „läuft“ und zeigt, wer sie übernommen hat.
18+Solange sie läuft, kann nur die Person sie ändern, die sie übernommen hat.
19+
20+Die Absicht ist, den Klassiker des Zusammenlebens zu vermeiden: zwei Menschen
21+erledigen denselben Einkauf, beide überzeugt, die andere Person kümmere sich
22+nicht darum. Eine Aufgabe zu übernehmen heißt, sie anzukündigen.
23+
24+Man kann wieder loslassen, was man übernommen hat. Niemand sitzt fest, und wer
25+ein Team verlässt, gibt das dort Gehaltene automatisch frei.
26+
27+## Zuweisen, ohne zu befehlen
28+
29+Eine Aufgabe kann einen oder mehrere Namen tragen.
30+Das ist ein Hinweis, keine Einschränkung: jedes Mitglied kann sie trotzdem übernehmen und abschließen.
31+Das folgt aus der fehlenden Hierarchie in der Anwendung.
32+
33+Jeder Block hat seine Schaltfläche „Meine Aufgaben“, die auf das filtert, was
34+mich betrifft. Der Filter steht in der Adresse der Seite, eine Ansicht lässt
35+sich also als Lesezeichen speichern.
added docs/site-documentation/content/ecrans/taches.en.md +34 -0
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "The tasks"
3+description = "What is in progress, what is to do, what comes back soon."
4+weight = 10
5++++
6+
7+{{<shot name="taches" alt="Tasks screen: an “In progress” block with two taken tasks, then a “To do” block, each block having a “My tasks” switch." lang={lang} legende="Two blocks, and one switch per block." />}}
8+
9+A task is something to do, attached to a category and placed on a date. The
10+screen sorts them in three movements: what is in progress, what is to do, and
11+what arrives later, folded away at the bottom.
12+
13+## Taking a task
14+
15+{{<extrait name="x-todo-carte" alt="Card of a task in progress: category colour dot, task name, the words “taken by sacha” and the date." lang={lang} />}}
16+
17+Taking a task moves it to in progress and shows who took it.
18+While it is in progress, only the person who took it can modify it.
19+
20+The intent is to avoid the classic of shared life: two people doing the same
21+errand, each convinced the other was not taking care of it. Taking a task is
22+announcing it.
23+
24+You can release what you took. Nobody is trapped, and leaving a team
25+automatically releases what you were holding there.
26+
27+## Assigning without commanding
28+
29+A task can carry one or several names.
30+That is an indication, not a restriction: any member can still take it and finish it.
31+This follows from the absence of hierarchy in the application.
32+
33+Each block has its own “My tasks” button, filtering down to what concerns me.
34+The filter is written into the page address, so a view can be bookmarked.
new file mode 100644
@@ -0,0 +1,34 @@
1++++
2+title = "The tasks"
3+description = "What is in progress, what is to do, what comes back soon."
4+weight = 10
5++++
6+
7+{{<shot name="taches" alt="Tasks screen: an “In progress” block with two taken tasks, then a “To do” block, each block having a “My tasks” switch." lang={lang} legende="Two blocks, and one switch per block." />}}
8+
9+A task is something to do, attached to a category and placed on a date. The
10+screen sorts them in three movements: what is in progress, what is to do, and
11+what arrives later, folded away at the bottom.
12+
13+## Taking a task
14+
15+{{<extrait name="x-todo-carte" alt="Card of a task in progress: category colour dot, task name, the words “taken by sacha” and the date." lang={lang} />}}
16+
17+Taking a task moves it to in progress and shows who took it.
18+While it is in progress, only the person who took it can modify it.
19+
20+The intent is to avoid the classic of shared life: two people doing the same
21+errand, each convinced the other was not taking care of it. Taking a task is
22+announcing it.
23+
24+You can release what you took. Nobody is trapped, and leaving a team
25+automatically releases what you were holding there.
26+
27+## Assigning without commanding
28+
29+A task can carry one or several names.
30+That is an indication, not a restriction: any member can still take it and finish it.
31+This follows from the absence of hierarchy in the application.
32+
33+Each block has its own “My tasks” button, filtering down to what concerns me.
34+The filter is written into the page address, so a view can be bookmarked.
added docs/site-documentation/content/ecrans/taches.md +35 -0
new file mode 100644
@@ -0,0 +1,35 @@
1++++
2+title = "Les tâches"
3+description = "Ce qui est en cours, ce qui est à faire, ce qui revient bientôt."
4+weight = 10
5++++
6+
7+{{<shot name="taches" alt="Écran Tâches : bloc « En cours » avec deux tâches prises, puis bloc « À faire », chaque bloc ayant un interrupteur « Mes tâches »." lang={lang} legende="Deux blocs, et un interrupteur par bloc." />}}
8+
9+Une tâche est une chose à faire, rattachée à une catégorie et posée sur une
10+date. L'écran les range en trois temps : ce qui est en cours, ce qui est à
11+faire, et ce qui arrive plus tard, replié en bas.
12+
13+## Prendre une tâche
14+
15+{{<extrait name="x-todo-carte" alt="Carte d'une tâche en cours : rond de couleur de la catégorie, nom de la tâche, mention « pris par sacha » et la date." lang={lang} />}}
16+
17+Prendre une tâche la fait passer en cours et affiche qui l'a prise.
18+Tant qu'elle est en cours, elle n'est modifiable que par la personne qui l'a prise.
19+
20+L'intention est d'éviter le grand classique de la vie commune : deux personnes
21+qui font la même course, chacune persuadée que l'autre ne s'en occupait pas.
22+Prendre une tâche, c'est l’annoncer.
23+
24+On peut relâcher ce qu'on a pris. Personne n'est coincé, et quitter une équipe
25+relâche automatiquement ce qu'on y tenait.
26+
27+## Assigner sans commander
28+
29+Une tâche peut porter le nom d'une ou plusieurs personnes.
30+C'est une indication, pas une limitation : n'importe quel membre peut quand même la prendre et la terminer.
31+Ce choix découle de l'absence de hiérarchie dans l'application.
32+
33+Chaque bloc a son bouton « Mes tâches », qui filtre sur ce qui me
34+concerne. Le filtre s'inscrit dans l'adresse de la page : on peut donc mettre
35+sa vue en favori.
new file mode 100644
@@ -0,0 +1,35 @@
1++++
2+title = "Les tâches"
3+description = "Ce qui est en cours, ce qui est à faire, ce qui revient bientôt."
4+weight = 10
5++++
6+
7+{{<shot name="taches" alt="Écran Tâches : bloc « En cours » avec deux tâches prises, puis bloc « À faire », chaque bloc ayant un interrupteur « Mes tâches »." lang={lang} legende="Deux blocs, et un interrupteur par bloc." />}}
8+
9+Une tâche est une chose à faire, rattachée à une catégorie et posée sur une
10+date. L'écran les range en trois temps : ce qui est en cours, ce qui est à
11+faire, et ce qui arrive plus tard, replié en bas.
12+
13+## Prendre une tâche
14+
15+{{<extrait name="x-todo-carte" alt="Carte d'une tâche en cours : rond de couleur de la catégorie, nom de la tâche, mention « pris par sacha » et la date." lang={lang} />}}
16+
17+Prendre une tâche la fait passer en cours et affiche qui l'a prise.
18+Tant qu'elle est en cours, elle n'est modifiable que par la personne qui l'a prise.
19+
20+L'intention est d'éviter le grand classique de la vie commune : deux personnes
21+qui font la même course, chacune persuadée que l'autre ne s'en occupait pas.
22+Prendre une tâche, c'est l’annoncer.
23+
24+On peut relâcher ce qu'on a pris. Personne n'est coincé, et quitter une équipe
25+relâche automatiquement ce qu'on y tenait.
26+
27+## Assigner sans commander
28+
29+Une tâche peut porter le nom d'une ou plusieurs personnes.
30+C'est une indication, pas une limitation : n'importe quel membre peut quand même la prendre et la terminer.
31+Ce choix découle de l'absence de hiérarchie dans l'application.
32+
33+Chaque bloc a son bouton « Mes tâches », qui filtre sur ce qui me
34+concerne. Le filtre s'inscrit dans l'adresse de la page : on peut donc mettre
35+sa vue en favori.
added docs/site-documentation/content/histoires/_index.de.md +15 -0
new file mode 100644
@@ -0,0 +1,15 @@
1++++
2+title = "Drei Geschichten"
3+description = "In die Haut von jemandem schlüpfen, der die Anwendung wirklich benutzt."
4+weight = 2
5+sort_by = "weight"
6++++
7+
8+Eine Liste von Bildschirmen sagt nicht, wozu eine Anwendung gut ist. Deshalb
9+hier drei Berichte in der Ich-Form, geschrieben, wie man von seiner Woche
10+erzählt. Jeder stützt sich auf einen anderen Mechanismus: Kategoriengruppen,
11+mehrere Teams, Aufgaben.
12+
13+In allen dreien spricht dieselbe Person, Camille, deren Demonstrationskonto für
14+sämtliche Screenshots dieser Website gedient hat: ein Haushalt mit zwei
15+Erwachsenen und einem Baby, und regelmäßige Mithilfe im Nachbarschaftsverein.
new file mode 100644
@@ -0,0 +1,15 @@
1++++
2+title = "Drei Geschichten"
3+description = "In die Haut von jemandem schlüpfen, der die Anwendung wirklich benutzt."
4+weight = 2
5+sort_by = "weight"
6++++
7+
8+Eine Liste von Bildschirmen sagt nicht, wozu eine Anwendung gut ist. Deshalb
9+hier drei Berichte in der Ich-Form, geschrieben, wie man von seiner Woche
10+erzählt. Jeder stützt sich auf einen anderen Mechanismus: Kategoriengruppen,
11+mehrere Teams, Aufgaben.
12+
13+In allen dreien spricht dieselbe Person, Camille, deren Demonstrationskonto für
14+sämtliche Screenshots dieser Website gedient hat: ein Haushalt mit zwei
15+Erwachsenen und einem Baby, und regelmäßige Mithilfe im Nachbarschaftsverein.
added docs/site-documentation/content/histoires/_index.en.md +15 -0
new file mode 100644
@@ -0,0 +1,15 @@
1++++
2+title = "Three stories"
3+description = "Standing in the shoes of someone who actually uses it."
4+weight = 2
5+sort_by = "weight"
6++++
7+
8+A list of screens does not tell you what an application is for. So here are
9+three first-person accounts, written the way you would tell someone about your
10+week. Each one leans on a different mechanism: category groups, multiple teams,
11+tasks.
12+
13+The same person speaks in all three, Camille, whose demonstration account was
14+used for every screenshot on this site: a household of two adults and a baby,
15+and a regular hand given to the neighbourhood association.
new file mode 100644
@@ -0,0 +1,15 @@
1++++
2+title = "Three stories"
3+description = "Standing in the shoes of someone who actually uses it."
4+weight = 2
5+sort_by = "weight"
6++++
7+
8+A list of screens does not tell you what an application is for. So here are
9+three first-person accounts, written the way you would tell someone about your
10+week. Each one leans on a different mechanism: category groups, multiple teams,
11+tasks.
12+
13+The same person speaks in all three, Camille, whose demonstration account was
14+used for every screenshot on this site: a household of two adults and a baby,
15+and a regular hand given to the neighbourhood association.
added docs/site-documentation/content/histoires/_index.md +16 -0
new file mode 100644
@@ -0,0 +1,16 @@
1++++
2+title = "Trois histoires"
3+description = "Se mettre dans la peau de quelqu'un qui s'en sert, pour de vrai."
4+weight = 2
5+sort_by = "weight"
6++++
7+
8+Une liste d'écrans ne dit pas à quoi sert une application. Voici donc trois
9+récits à la première personne, écrits comme on raconterait sa semaine. Chacun
10+s'appuie sur une mécanique différente : les groupes de catégories, les équipes
11+multiples, les tâches.
12+
13+C'est la même personne qui parle dans les trois, Camille, dont le compte de
14+démonstration a servi à prendre toutes les captures de ce site : un foyer de
15+deux adultes et un bébé, et un coup de main régulier à l'association du
16+quartier.
new file mode 100644
@@ -0,0 +1,16 @@
1++++
2+title = "Trois histoires"
3+description = "Se mettre dans la peau de quelqu'un qui s'en sert, pour de vrai."
4+weight = 2
5+sort_by = "weight"
6++++
7+
8+Une liste d'écrans ne dit pas à quoi sert une application. Voici donc trois
9+récits à la première personne, écrits comme on raconterait sa semaine. Chacun
10+s'appuie sur une mécanique différente : les groupes de catégories, les équipes
11+multiples, les tâches.
12+
13+C'est la même personne qui parle dans les trois, Camille, dont le compte de
14+démonstration a servi à prendre toutes les captures de ce site : un foyer de
15+deux adultes et un bébé, et un coup de main régulier à l'association du
16+quartier.
added docs/site-documentation/content/histoires/deux-equipes.de.md +79 -0
new file mode 100644
@@ -0,0 +1,79 @@
1++++
2+title = "Ein Telefon, zwei Leben"
3+description = "Der Haushalt auf der einen Seite, der Nachbarschaftsverein auf der anderen, und eine Einladung, die eintrifft."
4+weight = 2
5++++
6+
7+Letzten Monat hat Noa mich vor der Bäckerei angesprochen. Der
8+Nachbarschaftsverein richtete den Flohmarkt aus, am Getränkestand fehlten
9+Hände, und ich sagte ja, wie man ja sagt, ohne nachzudenken.
10+
11+Zwei Tage später wartete in Ex Ego eine Einladung auf mich: eine Karte oben in
12+den Einstellungen, zwei Schaltflächen, und ein kleiner Zähler auf dem Reiter
13+Einstellungen, solange ich nicht geantwortet hatte. Mehr nicht. Ich nahm an,
14+und die Anwendung wechselte gleich zum Verein, was mich zuerst überraschte und
15+mir dann einleuchtete: wer eine Einladung annimmt, will hinschauen.
16+
17+## Was ein Team wirklich trennt
18+
19+Was ich vorher nicht verstanden hatte, ist, wie dicht die beiden Welten
20+voneinander getrennt sind. Der Verein hat seine eigenen Kategorien, Sitzungen,
21+Getränkestand, Kommunikation, und mein Haushalt hat seine. Auf einer Seite
22+gezählte Zeit existiert auf der anderen nicht. Die Statistiken vermischen sich
23+nie. Selbst die Farben gehören jeweils einem Team.
24+
25+Anders gesagt: ich bin keinem geteilten Ordner beigetreten, sondern einer
26+anderen Gruppe von Menschen, die etwas anderes zählt. Das Einzige, was beide
27+verbindet, ist mein Konto.
28+
29+{{<shot name="equipes" alt="Das Blatt „Team wechseln“ über dem Hinzufügen-Bildschirm: Maison, zwei Mitglieder, angehakt, und Asso du quartier, drei Mitglieder." lang={lang} legende="Die Pille in der Kopfzeile öffnet die Liste meiner Teams." />}}
30+
31+Gewechselt wird durch Tippen auf die grüne Pille oben links, die dauerhaft das
32+aktive Team zeigt. Ich schaue reflexhaft vor jeder Eingabe hin, denn der
33+einzige wirkliche Fehler, der hier möglich wäre, wäre meinen Abwasch beim
34+Verein zu zählen.
35+
36+Und weil das aktive Team vom Gerät und nicht vom Konto gemerkt wird, kann mein
37+Telefon beim Haushalt bleiben, während der Rechner im Wohnzimmer beim Verein
38+bleibt. In Wahrheit wechsle ich fast nie.
39+
40+## Niemand ist Chefin oder Chef des Teams
41+
42+Als ich dazukam, erwartete ich, Noa um Dinge bitten zu müssen, schließlich gab
43+es das Team schon vor mir. Nichts dergleichen. Am Tag des Flohmarkts fehlte
44+eine Kategorie für den Aufbau der Stände: ich habe sie angelegt. Ich habe auch
45+das Team umbenannt, das noch schlicht „asso“ hieß, ohne jemanden um Erlaubnis
46+zu fragen.
47+
48+Das fühlte sich seltsam an, als betrete man eine fremde Wohnung und rücke ein
49+Möbelstück. Dann verstand ich, dass es das einzig ehrliche Modell für ein
50+Kollektiv von Freiwilligen ist. Am Getränkestand gibt es keine Chefin und
51+keinen Chef. Ein Werkzeug, das eine erfindet, hilft niemandem.
52+
53+Das Einzige, was ich nicht anfassen kann, sind die von anderen erfassten
54+Zeiten. Alle korrigieren ihre eigenen, und das ist richtig so: es ist die
55+einzige Grenze, die zählt.
56+
57+## Was wir gesehen haben
58+
59+{{<shot name="stats-asso" alt="Statistik des Teams Asso du quartier: Säulen für noa, camille und sacha, mit den Kategorien Buvette, Communication und Réunions." lang={lang} legende="Eine Vereinswoche, zu dritt." />}}
60+
61+Nach dem Flohmarkt haben wir uns den Bildschirm zu dritt angeschaut, auf einem
62+Telefon auf einem Campingtisch. Das Gespräch drehte sich nicht darum, wer am
63+meisten gemacht hatte. Es drehte sich um den Getränkestand, der irrsinnig viel
64+Zeit gefressen hatte, für einen Ertrag, den nie jemand gemessen hatte.
65+
66+Wir haben beschlossen, ihn nächstes Jahr zu mieten. Das ist mein liebster
67+Gebrauch dieses Werkzeugs: es entscheidet nichts, es legt einen gemeinsamen
68+Gegenstand in die Mitte des Tisches, und es verhindert, dass die Diskussion mit
69+„ich habe das Gefühl“ anfängt.
70+
71+Seitdem hat Noa mir ein drittes Team angeboten, für die Eigentümergemeinschaft.
72+
73+{{<extrait name="x-invitation" alt="Erhaltene Einladung: „noa lädt dich in das Team Copropriété ein“, mit den Schaltflächen Annehmen und Ablehnen." lang={lang} legende="Diese wartet noch auf meine Antwort." />}}
74+
75+Ich habe noch nicht geantwortet. Die Karte wartet oben in meinen Einstellungen,
76+und der kleine Zähler auf dem Reiter erinnert mich jeden Tag daran, ohne weiter
77+zu drängen. Ablehnen würde Noa nichts sagen, und nichts hielte mich davon ab,
78+es mir in sechs Monaten anders zu überlegen: man müsste mich nur erneut
79+einladen.
new file mode 100644
@@ -0,0 +1,79 @@
1++++
2+title = "Ein Telefon, zwei Leben"
3+description = "Der Haushalt auf der einen Seite, der Nachbarschaftsverein auf der anderen, und eine Einladung, die eintrifft."
4+weight = 2
5++++
6+
7+Letzten Monat hat Noa mich vor der Bäckerei angesprochen. Der
8+Nachbarschaftsverein richtete den Flohmarkt aus, am Getränkestand fehlten
9+Hände, und ich sagte ja, wie man ja sagt, ohne nachzudenken.
10+
11+Zwei Tage später wartete in Ex Ego eine Einladung auf mich: eine Karte oben in
12+den Einstellungen, zwei Schaltflächen, und ein kleiner Zähler auf dem Reiter
13+Einstellungen, solange ich nicht geantwortet hatte. Mehr nicht. Ich nahm an,
14+und die Anwendung wechselte gleich zum Verein, was mich zuerst überraschte und
15+mir dann einleuchtete: wer eine Einladung annimmt, will hinschauen.
16+
17+## Was ein Team wirklich trennt
18+
19+Was ich vorher nicht verstanden hatte, ist, wie dicht die beiden Welten
20+voneinander getrennt sind. Der Verein hat seine eigenen Kategorien, Sitzungen,
21+Getränkestand, Kommunikation, und mein Haushalt hat seine. Auf einer Seite
22+gezählte Zeit existiert auf der anderen nicht. Die Statistiken vermischen sich
23+nie. Selbst die Farben gehören jeweils einem Team.
24+
25+Anders gesagt: ich bin keinem geteilten Ordner beigetreten, sondern einer
26+anderen Gruppe von Menschen, die etwas anderes zählt. Das Einzige, was beide
27+verbindet, ist mein Konto.
28+
29+{{<shot name="equipes" alt="Das Blatt „Team wechseln“ über dem Hinzufügen-Bildschirm: Maison, zwei Mitglieder, angehakt, und Asso du quartier, drei Mitglieder." lang={lang} legende="Die Pille in der Kopfzeile öffnet die Liste meiner Teams." />}}
30+
31+Gewechselt wird durch Tippen auf die grüne Pille oben links, die dauerhaft das
32+aktive Team zeigt. Ich schaue reflexhaft vor jeder Eingabe hin, denn der
33+einzige wirkliche Fehler, der hier möglich wäre, wäre meinen Abwasch beim
34+Verein zu zählen.
35+
36+Und weil das aktive Team vom Gerät und nicht vom Konto gemerkt wird, kann mein
37+Telefon beim Haushalt bleiben, während der Rechner im Wohnzimmer beim Verein
38+bleibt. In Wahrheit wechsle ich fast nie.
39+
40+## Niemand ist Chefin oder Chef des Teams
41+
42+Als ich dazukam, erwartete ich, Noa um Dinge bitten zu müssen, schließlich gab
43+es das Team schon vor mir. Nichts dergleichen. Am Tag des Flohmarkts fehlte
44+eine Kategorie für den Aufbau der Stände: ich habe sie angelegt. Ich habe auch
45+das Team umbenannt, das noch schlicht „asso“ hieß, ohne jemanden um Erlaubnis
46+zu fragen.
47+
48+Das fühlte sich seltsam an, als betrete man eine fremde Wohnung und rücke ein
49+Möbelstück. Dann verstand ich, dass es das einzig ehrliche Modell für ein
50+Kollektiv von Freiwilligen ist. Am Getränkestand gibt es keine Chefin und
51+keinen Chef. Ein Werkzeug, das eine erfindet, hilft niemandem.
52+
53+Das Einzige, was ich nicht anfassen kann, sind die von anderen erfassten
54+Zeiten. Alle korrigieren ihre eigenen, und das ist richtig so: es ist die
55+einzige Grenze, die zählt.
56+
57+## Was wir gesehen haben
58+
59+{{<shot name="stats-asso" alt="Statistik des Teams Asso du quartier: Säulen für noa, camille und sacha, mit den Kategorien Buvette, Communication und Réunions." lang={lang} legende="Eine Vereinswoche, zu dritt." />}}
60+
61+Nach dem Flohmarkt haben wir uns den Bildschirm zu dritt angeschaut, auf einem
62+Telefon auf einem Campingtisch. Das Gespräch drehte sich nicht darum, wer am
63+meisten gemacht hatte. Es drehte sich um den Getränkestand, der irrsinnig viel
64+Zeit gefressen hatte, für einen Ertrag, den nie jemand gemessen hatte.
65+
66+Wir haben beschlossen, ihn nächstes Jahr zu mieten. Das ist mein liebster
67+Gebrauch dieses Werkzeugs: es entscheidet nichts, es legt einen gemeinsamen
68+Gegenstand in die Mitte des Tisches, und es verhindert, dass die Diskussion mit
69+„ich habe das Gefühl“ anfängt.
70+
71+Seitdem hat Noa mir ein drittes Team angeboten, für die Eigentümergemeinschaft.
72+
73+{{<extrait name="x-invitation" alt="Erhaltene Einladung: „noa lädt dich in das Team Copropriété ein“, mit den Schaltflächen Annehmen und Ablehnen." lang={lang} legende="Diese wartet noch auf meine Antwort." />}}
74+
75+Ich habe noch nicht geantwortet. Die Karte wartet oben in meinen Einstellungen,
76+und der kleine Zähler auf dem Reiter erinnert mich jeden Tag daran, ohne weiter
77+zu drängen. Ablehnen würde Noa nichts sagen, und nichts hielte mich davon ab,
78+es mir in sechs Monaten anders zu überlegen: man müsste mich nur erneut
79+einladen.
added docs/site-documentation/content/histoires/deux-equipes.en.md +73 -0
new file mode 100644
@@ -0,0 +1,73 @@
1++++
2+title = "One phone, two lives"
3+description = "The household on one side, the neighbourhood association on the other, and an invitation that arrives."
4+weight = 2
5++++
6+
7+Last month Noa caught me outside the bakery. The neighbourhood association was
8+running the flea market, the drinks stand was short of hands, and I said yes
9+the way people say yes, without thinking.
10+
11+Two days later an invitation was waiting for me in Ex Ego: a card at the top of
12+the settings, two buttons, and a small badge on the Settings tab until I
13+answered. Nothing more. I accepted, and the application switched to the
14+association straight away, which surprised me before it struck me as obvious:
15+when you accept an invitation, it is because you want to go and look.
16+
17+## What a team really separates
18+
19+What I had not understood before is how watertight the two worlds are. The
20+association has its own categories, Meetings, Drinks stand, Communication, and
21+my household has its own. Time counted on one side does not exist on the other.
22+The statistics never mix. Even the colours belong to each team.
23+
24+In other words, I did not join a shared folder, I joined another group of
25+people counting something else. The only thing in common is my account.
26+
27+{{<shot name="equipes" alt="The “Change team” sheet open over the Add screen: Maison, two members, ticked, and Asso du quartier, three members." lang={lang} legende="The header pill opens the list of my teams." />}}
28+
29+You switch by touching the green pill at the top left, the one permanently
30+showing the active team. I look at it reflexively before every entry, because
31+the only real mistake available here would be to count my dishes in the
32+association.
33+
34+And since the active team is remembered by the device rather than by the
35+account, my phone can stay on the household while the living room computer
36+stays on the association. In practice I hardly ever switch.
37+
38+## Nobody is the boss of the team
39+
40+When I arrived, I expected to have to ask Noa for things, since the team
41+existed before me. There is nothing of the sort. On the day of the flea market
42+a category was missing for setting up the stalls: I created it. I also renamed
43+the team, which was still called “asso” for short, without asking anyone's
44+permission.
45+
46+It felt odd, like walking into someone's home and moving a piece of furniture.
47+Then I understood it was the only honest model for a group of volunteers. There
48+is no boss at the drinks stand. A tool that invents one helps nobody.
49+
50+The one thing I cannot touch is the time entered by other people. Everyone
51+corrects their own, and that is right: it is the only boundary that matters.
52+
53+## What we saw
54+
55+{{<shot name="stats-asso" alt="Statistics of the Asso du quartier team: columns for noa, camille and sacha, with the Buvette, Communication and Réunions categories." lang={lang} legende="A week of association work, shared between three." />}}
56+
57+After the flea market, the three of us looked at the screen together, on a
58+phone lying on a camping table. The conversation was not about who had done the
59+most. It was about the drinks stand, which had eaten an enormous amount of time
60+for a profit nobody had ever measured.
61+
62+We decided to rent one next year. That is my favourite use of this tool: it
63+settles nothing, it puts a shared object in the middle of the table, and it
64+keeps the discussion from starting with “I feel like”.
65+
66+Since then, Noa has offered me a third team, for the building committee.
67+
68+{{<extrait name="x-invitation" alt="Received invitation card: “noa invites you to join the team Copropriété”, with Accept and Decline buttons." lang={lang} legende="That one is still waiting for my answer." />}}
69+
70+I have not replied yet. The card waits at the top of my settings, and the small
71+badge on the tab reminds me every day without insisting any further. Declining
72+would tell Noa nothing, and nothing would stop me from changing my mind in six
73+months: someone would just have to invite me again.
new file mode 100644
@@ -0,0 +1,73 @@
1++++
2+title = "One phone, two lives"
3+description = "The household on one side, the neighbourhood association on the other, and an invitation that arrives."
4+weight = 2
5++++
6+
7+Last month Noa caught me outside the bakery. The neighbourhood association was
8+running the flea market, the drinks stand was short of hands, and I said yes
9+the way people say yes, without thinking.
10+
11+Two days later an invitation was waiting for me in Ex Ego: a card at the top of
12+the settings, two buttons, and a small badge on the Settings tab until I
13+answered. Nothing more. I accepted, and the application switched to the
14+association straight away, which surprised me before it struck me as obvious:
15+when you accept an invitation, it is because you want to go and look.
16+
17+## What a team really separates
18+
19+What I had not understood before is how watertight the two worlds are. The
20+association has its own categories, Meetings, Drinks stand, Communication, and
21+my household has its own. Time counted on one side does not exist on the other.
22+The statistics never mix. Even the colours belong to each team.
23+
24+In other words, I did not join a shared folder, I joined another group of
25+people counting something else. The only thing in common is my account.
26+
27+{{<shot name="equipes" alt="The “Change team” sheet open over the Add screen: Maison, two members, ticked, and Asso du quartier, three members." lang={lang} legende="The header pill opens the list of my teams." />}}
28+
29+You switch by touching the green pill at the top left, the one permanently
30+showing the active team. I look at it reflexively before every entry, because
31+the only real mistake available here would be to count my dishes in the
32+association.
33+
34+And since the active team is remembered by the device rather than by the
35+account, my phone can stay on the household while the living room computer
36+stays on the association. In practice I hardly ever switch.
37+
38+## Nobody is the boss of the team
39+
40+When I arrived, I expected to have to ask Noa for things, since the team
41+existed before me. There is nothing of the sort. On the day of the flea market
42+a category was missing for setting up the stalls: I created it. I also renamed
43+the team, which was still called “asso” for short, without asking anyone's
44+permission.
45+
46+It felt odd, like walking into someone's home and moving a piece of furniture.
47+Then I understood it was the only honest model for a group of volunteers. There
48+is no boss at the drinks stand. A tool that invents one helps nobody.
49+
50+The one thing I cannot touch is the time entered by other people. Everyone
51+corrects their own, and that is right: it is the only boundary that matters.
52+
53+## What we saw
54+
55+{{<shot name="stats-asso" alt="Statistics of the Asso du quartier team: columns for noa, camille and sacha, with the Buvette, Communication and Réunions categories." lang={lang} legende="A week of association work, shared between three." />}}
56+
57+After the flea market, the three of us looked at the screen together, on a
58+phone lying on a camping table. The conversation was not about who had done the
59+most. It was about the drinks stand, which had eaten an enormous amount of time
60+for a profit nobody had ever measured.
61+
62+We decided to rent one next year. That is my favourite use of this tool: it
63+settles nothing, it puts a shared object in the middle of the table, and it
64+keeps the discussion from starting with “I feel like”.
65+
66+Since then, Noa has offered me a third team, for the building committee.
67+
68+{{<extrait name="x-invitation" alt="Received invitation card: “noa invites you to join the team Copropriété”, with Accept and Decline buttons." lang={lang} legende="That one is still waiting for my answer." />}}
69+
70+I have not replied yet. The card waits at the top of my settings, and the small
71+badge on the tab reminds me every day without insisting any further. Declining
72+would tell Noa nothing, and nothing would stop me from changing my mind in six
73+months: someone would just have to invite me again.
added docs/site-documentation/content/histoires/deux-equipes.md +77 -0
new file mode 100644
@@ -0,0 +1,77 @@
1++++
2+title = "Le même téléphone, deux vies"
3+description = "La maison d'un côté, l'association de quartier de l'autre, et une invitation qui arrive."
4+weight = 2
5++++
6+
7+Le mois dernier, Noa m'a parlé à la sortie de la boulangerie. L'association
8+du quartier organisait la brocante, il manquait des bras à la buvette, et j'ai
9+dit oui comme on dit oui, sans réfléchir.
10+
11+Deux jours plus tard, une invitation m'attendait dans Ex Ego : une carte en
12+haut des réglages, deux boutons, et une petite pastille sur
13+l'onglet Réglages tant que je n'avais pas répondu. Rien de plus. J'ai accepté,
14+et l'application a basculé sur l'association dans la foulée, ce qui m'a
15+d'abord étonné avant de me paraître évident : quand on accepte une
16+invitation, c'est qu'on veut aller voir.
17+
18+## Ce qu'une équipe sépare vraiment
19+
20+Ce que je n'avais pas compris avant, c'est à quel point les deux mondes sont
21+étanches. L'association a ses catégories à elle, Réunions, Buvette,
22+Communication, et ma maison a les siennes. Un temps compté d'un côté n'existe
23+pas de l'autre. Les statistiques ne se mélangent jamais. Même les couleurs sont
24+propres à chaque équipe.
25+
26+Autrement dit, je n'ai pas rejoint un dossier partagé, j'ai rejoint un autre
27+groupe de gens qui comptent autre chose. Le seul point commun est mon compte.
28+
29+{{<shot name="equipes" alt="Feuille « Changer d'équipe » ouverte par-dessus l'écran Ajouter : Maison, deux membres, cochée, et Asso du quartier, trois membres." lang={lang} legende="La pastille de l'en-tête ouvre la liste de mes équipes." />}}
30+
31+On bascule en touchant la pastille verte en haut à gauche, celle qui affiche en
32+permanence l'équipe active. Je la regarde par réflexe avant chaque saisie,
33+parce que la seule vraie bêtise possible ici serait de compter ma vaisselle
34+dans l'association.
35+
36+Et comme l'équipe active est retenue par l'appareil et non par le compte, mon
37+téléphone peut rester sur la maison pendant que l'ordinateur du salon reste sur
38+l'association. Je ne bascule presque jamais, en réalité.
39+
40+## Personne n'est le patron de l'équipe
41+
42+En arrivant, je m'attendais à devoir demander des choses à Noa, puisque
43+l'équipe existait avant moi. Il n'y a rien de tel. Le jour de la brocante, il
44+manquait une catégorie pour le montage des stands : je l'ai créée. J'ai aussi
45+renommé l'équipe, qui s'appelait encore « asso » tout court, sans demander
46+l'autorisation à personne.
47+
48+Ça m'a fait un drôle d'effet, comme d'entrer chez quelqu'un et de déplacer un
49+meuble. Puis j'ai compris que c'était le seul modèle honnête pour un collectif
50+de bénévoles. Il n'y a pas de chef à la buvette. Un outil qui en invente un
51+n'aide personne.
52+
53+La seule chose que je ne peux pas toucher, ce sont les temps saisis par les
54+autres. Chacun corrige les siens, et c'est très bien : c'est la seule
55+frontière qui compte.
56+
57+## Ce qu'on y a vu
58+
59+{{<shot name="stats-asso" alt="Statistiques de l'équipe Asso du quartier : les colonnes de noa, camille et sacha, avec les catégories Buvette, Communication et Réunions." lang={lang} legende="Une semaine d'association, à trois." />}}
60+
61+Après la brocante, on a regardé l'écran ensemble, à trois, sur le téléphone
62+posé sur une table de camping. La conversation n'a pas porté sur qui en avait
63+fait le plus. Elle a porté sur la buvette, qui avait mangé un temps fou pour un
64+bénéfice que personne n'avait jamais mesuré.
65+
66+Nous avons décidé de la louer l'an prochain. C'est mon usage préféré de cet
67+outil : il ne tranche rien, il pose un objet commun au milieu de la table, et
68+il évite que la discussion commence par « j'ai l'impression que ».
69+
70+Depuis, Noa m'a proposé une troisième équipe, pour la copropriété.
71+
72+{{<extrait name="x-invitation" alt="Carte d'invitation reçue : « noa t'invite à rejoindre l'équipe Copropriété », avec les boutons Accepter et Refuser." lang={lang} legende="Celle-ci attend toujours ma réponse." />}}
73+
74+Je n'ai pas encore répondu. La carte patiente en haut de mes réglages, et la
75+petite pastille sur l'onglet me le rappelle chaque jour, sans insister
76+davantage. Refuser ne dirait rien à Noa, et rien ne m'empêcherait de changer
77+d'avis dans six mois : il suffirait qu'on m'invite à nouveau.
new file mode 100644
@@ -0,0 +1,77 @@
1++++
2+title = "Le même téléphone, deux vies"
3+description = "La maison d'un côté, l'association de quartier de l'autre, et une invitation qui arrive."
4+weight = 2
5++++
6+
7+Le mois dernier, Noa m'a parlé à la sortie de la boulangerie. L'association
8+du quartier organisait la brocante, il manquait des bras à la buvette, et j'ai
9+dit oui comme on dit oui, sans réfléchir.
10+
11+Deux jours plus tard, une invitation m'attendait dans Ex Ego : une carte en
12+haut des réglages, deux boutons, et une petite pastille sur
13+l'onglet Réglages tant que je n'avais pas répondu. Rien de plus. J'ai accepté,
14+et l'application a basculé sur l'association dans la foulée, ce qui m'a
15+d'abord étonné avant de me paraître évident : quand on accepte une
16+invitation, c'est qu'on veut aller voir.
17+
18+## Ce qu'une équipe sépare vraiment
19+
20+Ce que je n'avais pas compris avant, c'est à quel point les deux mondes sont
21+étanches. L'association a ses catégories à elle, Réunions, Buvette,
22+Communication, et ma maison a les siennes. Un temps compté d'un côté n'existe
23+pas de l'autre. Les statistiques ne se mélangent jamais. Même les couleurs sont
24+propres à chaque équipe.
25+
26+Autrement dit, je n'ai pas rejoint un dossier partagé, j'ai rejoint un autre
27+groupe de gens qui comptent autre chose. Le seul point commun est mon compte.
28+
29+{{<shot name="equipes" alt="Feuille « Changer d'équipe » ouverte par-dessus l'écran Ajouter : Maison, deux membres, cochée, et Asso du quartier, trois membres." lang={lang} legende="La pastille de l'en-tête ouvre la liste de mes équipes." />}}
30+
31+On bascule en touchant la pastille verte en haut à gauche, celle qui affiche en
32+permanence l'équipe active. Je la regarde par réflexe avant chaque saisie,
33+parce que la seule vraie bêtise possible ici serait de compter ma vaisselle
34+dans l'association.
35+
36+Et comme l'équipe active est retenue par l'appareil et non par le compte, mon
37+téléphone peut rester sur la maison pendant que l'ordinateur du salon reste sur
38+l'association. Je ne bascule presque jamais, en réalité.
39+
40+## Personne n'est le patron de l'équipe
41+
42+En arrivant, je m'attendais à devoir demander des choses à Noa, puisque
43+l'équipe existait avant moi. Il n'y a rien de tel. Le jour de la brocante, il
44+manquait une catégorie pour le montage des stands : je l'ai créée. J'ai aussi
45+renommé l'équipe, qui s'appelait encore « asso » tout court, sans demander
46+l'autorisation à personne.
47+
48+Ça m'a fait un drôle d'effet, comme d'entrer chez quelqu'un et de déplacer un
49+meuble. Puis j'ai compris que c'était le seul modèle honnête pour un collectif
50+de bénévoles. Il n'y a pas de chef à la buvette. Un outil qui en invente un
51+n'aide personne.
52+
53+La seule chose que je ne peux pas toucher, ce sont les temps saisis par les
54+autres. Chacun corrige les siens, et c'est très bien : c'est la seule
55+frontière qui compte.
56+
57+## Ce qu'on y a vu
58+
59+{{<shot name="stats-asso" alt="Statistiques de l'équipe Asso du quartier : les colonnes de noa, camille et sacha, avec les catégories Buvette, Communication et Réunions." lang={lang} legende="Une semaine d'association, à trois." />}}
60+
61+Après la brocante, on a regardé l'écran ensemble, à trois, sur le téléphone
62+posé sur une table de camping. La conversation n'a pas porté sur qui en avait
63+fait le plus. Elle a porté sur la buvette, qui avait mangé un temps fou pour un
64+bénéfice que personne n'avait jamais mesuré.
65+
66+Nous avons décidé de la louer l'an prochain. C'est mon usage préféré de cet
67+outil : il ne tranche rien, il pose un objet commun au milieu de la table, et
68+il évite que la discussion commence par « j'ai l'impression que ».
69+
70+Depuis, Noa m'a proposé une troisième équipe, pour la copropriété.
71+
72+{{<extrait name="x-invitation" alt="Carte d'invitation reçue : « noa t'invite à rejoindre l'équipe Copropriété », avec les boutons Accepter et Refuser." lang={lang} legende="Celle-ci attend toujours ma réponse." />}}
73+
74+Je n'ai pas encore répondu. La carte patiente en haut de mes réglages, et la
75+petite pastille sur l'onglet me le rappelle chaque jour, sans insister
76+davantage. Refuser ne dirait rien à Noa, et rien ne m'empêcherait de changer
77+d'avis dans six mois : il suffirait qu'on m'invite à nouveau.
added docs/site-documentation/content/histoires/la-liste-qui-ne-crie-pas.de.md +90 -0
new file mode 100644
@@ -0,0 +1,90 @@
1++++
2+title = "Die Liste, die nicht schreit"
3+description = "Aufgaben im Haushalt, übernommen, freigegeben, abgeschlossen und im beobachteten Rhythmus neu angesetzt."
4+weight = 3
5++++
6+
7+Wir haben vorher vieles versucht. Das Whiteboard in der Küche, das nach dem
8+ersten Monat niemand mehr ansah. Die App für geteilte Listen, deren
9+Erinnerungen immer im falschen Moment klingelten. Das Heft, verloren.
10+
11+Das eigentliche Problem war keines davon. Es war, dieselbe Sache zweimal zu
12+tun, oder sie gar nicht zu tun, während beide vom Gegenteil überzeugt waren.
13+
14+## Übernehmen heißt, es laut zu sagen
15+
16+{{<shot name="taches" alt="Aufgaben-Bildschirm: Block Läuft mit „Nettoyer le frigo“, übernommen von sacha, und „Ranger la chambre d'Alix“, übernommen von camille, dann der Block Zu tun." lang={lang} legende="Oben was läuft, darunter was zu tun ist, und wer was hält." />}}
17+
18+In Ex Ego liegt eine Aufgabe im Block „Zu tun“, bis jemand sie übernimmt. In
19+diesem Moment steigt sie mit dem Namen der Person nach „Läuft“ auf, und das
20+ist der ganze Mechanismus.
21+
22+Heute Morgen hat Sacha „Kühlschrank putzen“ übernommen. Ich sehe es auf
23+meinem Telefon. Ich muss nicht mehr daran denken, und vor allem fange ich nicht
24+mittags damit an, im Glauben, etwas Gutes zu tun.
25+
26+Die Sperre ist echt: solange eine Aufgabe läuft, kann nur die Person sie
27+ändern, die sie übernommen hat. Das ist keine Höflichkeit einer ausgegrauten
28+Schaltfläche, das ist die Datenbank, die sich weigert. Zwei Telefone drücken
29+gleichzeitig, und nur eines gewinnt.
30+
31+Es ist auch keine Verpflichtung fürs Leben. Eine Schaltfläche „Freigeben“
32+stellt die Aufgabe wieder zur Verfügung, ohne Begründung. Ich habe „Alix'
33+Zimmer aufräumen“ letzte Woche zweimal freigegeben. Niemand ist daran
34+gestorben.
35+
36+## Namen sind keine Befehle
37+
38+{{<extrait name="x-todo-carte" alt="Karte einer laufenden Aufgabe: farbiger Punkt der Kategorie, Name der Aufgabe, der Hinweis „übernommen von sacha“ und das Datum." lang={lang} />}}
39+
40+Man kann den Namen einer Person auf eine Aufgabe schreiben. Das Formular warnt
41+sofort, dass das freiwillig ist und die anderen sie trotzdem übernehmen können.
42+
43+Daran liegt mir viel. Eine Zuweisung heißt hier „das betrifft dich besonders“, zum Beispiel weil du den Termin beim Kinderarzt hast. Sie heißt nie „ich
44+befehle es dir“. Die Anwendung hat keine Möglichkeit, einen Befehl zu
45+erteilen, was uns diese Diskussion erspart.
46+
47+Jeder Block hat seinen kleinen Schalter „Meine Aufgaben“, der nur zeigt, was
48+mich betrifft. Ich benutze ihn am Samstagmorgen, wenn ich wissen will, womit
49+ich anfange, ohne mich vom Rest ablenken zu lassen.
50+
51+## Abschließen, und die Frage des Rhythmus
52+
53+Das ist der Teil, der mir wirklich Freude macht. Eine Aufgabe als erledigt zu
54+markieren öffnet ein Blatt, das zwei Fragen auf einmal stellt.
55+
56+{{<shot name="tache-effectuee" alt="Bildschirm „Aufgabe erledigt“ für „Sortir les poubelles“: Schalter Zeit erfassen mit Minutenzähler, Schalter Neu ansetzen mit vorgeschlagenem Datum und dem Hinweis „beobachteter Rhythmus: etwa alle 8 Tage“." lang={lang} legende="Zwei Vorschläge, und das Recht, beide abzulehnen." />}}
57+
58+Die erste: ist das einen Eintrag wert? Ein Schalter, ein Minutenzähler, und der
59+Eintrag geht in die Kategorie der Aufgabe, auf meinen Namen. Den Müll
60+rauszubringen verdient keine Zeile. Den Kühlschrank zu putzen schon, denn einen
61+Monat später zeigt sich, dass die Hausarbeit nicht so gleich verteilt war, wie
62+wir dachten.
63+
64+Die zweite: kommt das wieder? Die Anwendung schlägt ein Datum vor, und vor
65+allem erklärt sie ihre Rechnung. „Beobachteter Rhythmus: etwa alle 8 Tage.“
66+Sie nimmt den mittleren Abstand zwischen den vorigen Malen und nicht den
67+Durchschnitt, was sie gegen die zwei Urlaubswochen immun macht, in denen
68+niemand etwas getan hat.
69+
70+Dieser Satz ändert alles, weil man ihm widersprechen kann. Man kann auf das
71+Datum schauen, finden, dass acht Tage im Winter zu kurz sind, und es
72+korrigieren. Eine Anwendung, die allein entschieden hätte, hätte in der Hälfte
73+der Fälle falsch gelegen, ohne es je zu sagen.
74+
75+Das Neuansetzen fabriziert keine neue Aufgabe: dieselbe Zeile rutscht mit neuem
76+Datum zurück nach „Zu tun“. Ihre Geschichte bleibt daran hängen, und genau
77+diese Geschichte macht den nächsten Vorschlag treffender.
78+
79+## Was sich wirklich geändert hat
80+
81+Wir haben keine Zeit gespart. Das war nie das Ziel, und ich misstraue
82+Werkzeugen, die es versprechen.
83+
84+Gewonnen haben wir eine Liste, die nicht schreit. Kein Rot, keine
85+Benachrichtigungen, keine Verspätung, die wie ein Vorwurf ausgestellt wird.
86+Eine Aufgabe von vor neun Tagen sagt ruhig „seit dem 7. August“, und niemand
87+fühlt sich beim Öffnen des Bildschirms angeklagt.
88+
89+Es ist die erste geteilte Liste, die wir seit mehr als drei Monaten
90+durchhalten.
new file mode 100644
@@ -0,0 +1,90 @@
1++++
2+title = "Die Liste, die nicht schreit"
3+description = "Aufgaben im Haushalt, übernommen, freigegeben, abgeschlossen und im beobachteten Rhythmus neu angesetzt."
4+weight = 3
5++++
6+
7+Wir haben vorher vieles versucht. Das Whiteboard in der Küche, das nach dem
8+ersten Monat niemand mehr ansah. Die App für geteilte Listen, deren
9+Erinnerungen immer im falschen Moment klingelten. Das Heft, verloren.
10+
11+Das eigentliche Problem war keines davon. Es war, dieselbe Sache zweimal zu
12+tun, oder sie gar nicht zu tun, während beide vom Gegenteil überzeugt waren.
13+
14+## Übernehmen heißt, es laut zu sagen
15+
16+{{<shot name="taches" alt="Aufgaben-Bildschirm: Block Läuft mit „Nettoyer le frigo“, übernommen von sacha, und „Ranger la chambre d'Alix“, übernommen von camille, dann der Block Zu tun." lang={lang} legende="Oben was läuft, darunter was zu tun ist, und wer was hält." />}}
17+
18+In Ex Ego liegt eine Aufgabe im Block „Zu tun“, bis jemand sie übernimmt. In
19+diesem Moment steigt sie mit dem Namen der Person nach „Läuft“ auf, und das
20+ist der ganze Mechanismus.
21+
22+Heute Morgen hat Sacha „Kühlschrank putzen“ übernommen. Ich sehe es auf
23+meinem Telefon. Ich muss nicht mehr daran denken, und vor allem fange ich nicht
24+mittags damit an, im Glauben, etwas Gutes zu tun.
25+
26+Die Sperre ist echt: solange eine Aufgabe läuft, kann nur die Person sie
27+ändern, die sie übernommen hat. Das ist keine Höflichkeit einer ausgegrauten
28+Schaltfläche, das ist die Datenbank, die sich weigert. Zwei Telefone drücken
29+gleichzeitig, und nur eines gewinnt.
30+
31+Es ist auch keine Verpflichtung fürs Leben. Eine Schaltfläche „Freigeben“
32+stellt die Aufgabe wieder zur Verfügung, ohne Begründung. Ich habe „Alix'
33+Zimmer aufräumen“ letzte Woche zweimal freigegeben. Niemand ist daran
34+gestorben.
35+
36+## Namen sind keine Befehle
37+
38+{{<extrait name="x-todo-carte" alt="Karte einer laufenden Aufgabe: farbiger Punkt der Kategorie, Name der Aufgabe, der Hinweis „übernommen von sacha“ und das Datum." lang={lang} />}}
39+
40+Man kann den Namen einer Person auf eine Aufgabe schreiben. Das Formular warnt
41+sofort, dass das freiwillig ist und die anderen sie trotzdem übernehmen können.
42+
43+Daran liegt mir viel. Eine Zuweisung heißt hier „das betrifft dich besonders“, zum Beispiel weil du den Termin beim Kinderarzt hast. Sie heißt nie „ich
44+befehle es dir“. Die Anwendung hat keine Möglichkeit, einen Befehl zu
45+erteilen, was uns diese Diskussion erspart.
46+
47+Jeder Block hat seinen kleinen Schalter „Meine Aufgaben“, der nur zeigt, was
48+mich betrifft. Ich benutze ihn am Samstagmorgen, wenn ich wissen will, womit
49+ich anfange, ohne mich vom Rest ablenken zu lassen.
50+
51+## Abschließen, und die Frage des Rhythmus
52+
53+Das ist der Teil, der mir wirklich Freude macht. Eine Aufgabe als erledigt zu
54+markieren öffnet ein Blatt, das zwei Fragen auf einmal stellt.
55+
56+{{<shot name="tache-effectuee" alt="Bildschirm „Aufgabe erledigt“ für „Sortir les poubelles“: Schalter Zeit erfassen mit Minutenzähler, Schalter Neu ansetzen mit vorgeschlagenem Datum und dem Hinweis „beobachteter Rhythmus: etwa alle 8 Tage“." lang={lang} legende="Zwei Vorschläge, und das Recht, beide abzulehnen." />}}
57+
58+Die erste: ist das einen Eintrag wert? Ein Schalter, ein Minutenzähler, und der
59+Eintrag geht in die Kategorie der Aufgabe, auf meinen Namen. Den Müll
60+rauszubringen verdient keine Zeile. Den Kühlschrank zu putzen schon, denn einen
61+Monat später zeigt sich, dass die Hausarbeit nicht so gleich verteilt war, wie
62+wir dachten.
63+
64+Die zweite: kommt das wieder? Die Anwendung schlägt ein Datum vor, und vor
65+allem erklärt sie ihre Rechnung. „Beobachteter Rhythmus: etwa alle 8 Tage.“
66+Sie nimmt den mittleren Abstand zwischen den vorigen Malen und nicht den
67+Durchschnitt, was sie gegen die zwei Urlaubswochen immun macht, in denen
68+niemand etwas getan hat.
69+
70+Dieser Satz ändert alles, weil man ihm widersprechen kann. Man kann auf das
71+Datum schauen, finden, dass acht Tage im Winter zu kurz sind, und es
72+korrigieren. Eine Anwendung, die allein entschieden hätte, hätte in der Hälfte
73+der Fälle falsch gelegen, ohne es je zu sagen.
74+
75+Das Neuansetzen fabriziert keine neue Aufgabe: dieselbe Zeile rutscht mit neuem
76+Datum zurück nach „Zu tun“. Ihre Geschichte bleibt daran hängen, und genau
77+diese Geschichte macht den nächsten Vorschlag treffender.
78+
79+## Was sich wirklich geändert hat
80+
81+Wir haben keine Zeit gespart. Das war nie das Ziel, und ich misstraue
82+Werkzeugen, die es versprechen.
83+
84+Gewonnen haben wir eine Liste, die nicht schreit. Kein Rot, keine
85+Benachrichtigungen, keine Verspätung, die wie ein Vorwurf ausgestellt wird.
86+Eine Aufgabe von vor neun Tagen sagt ruhig „seit dem 7. August“, und niemand
87+fühlt sich beim Öffnen des Bildschirms angeklagt.
88+
89+Es ist die erste geteilte Liste, die wir seit mehr als drei Monaten
90+durchhalten.
added docs/site-documentation/content/histoires/la-liste-qui-ne-crie-pas.en.md +85 -0
new file mode 100644
@@ -0,0 +1,85 @@
1++++
2+title = "The list that does not shout"
3+description = "Household tasks, taken, released, finished, and rescheduled at the observed rhythm."
4+weight = 3
5++++
6+
7+We tried a lot of things before. The whiteboard in the kitchen, which nobody
8+looked at after the first month. The shared list application, with reminders
9+that always rang at the wrong moment. The notebook, lost.
10+
11+The real problem was none of those. It was doing the same thing twice, or
12+neither of us doing it while both were convinced of the opposite.
13+
14+## Taking is saying it out loud
15+
16+{{<shot name="taches" alt="Tasks screen: In progress block with “Nettoyer le frigo” taken by sacha and “Ranger la chambre d'Alix” taken by camille, then the To do block." lang={lang} legende="In progress at the top, to do below, and who is holding what." />}}
17+
18+In Ex Ego, a task sits in the “To do” block until somebody takes it. At that
19+moment it moves up into “In progress” with the name of the person, and that
20+is the whole mechanism.
21+
22+This morning Sacha took “Clean the fridge”. I can see it on my phone. I no
23+longer have to think about it, and above all I am not going to start doing it
24+at noon believing I am helping.
25+
26+The lock is real: while a task is in progress, only the person who took it can
27+change it. It is not a politeness enforced by a greyed-out button, it is the
28+database refusing. Two phones pressing at the same instant, and only one wins.
29+
30+It is not a lifelong commitment either. A “Release” button puts the task back
31+up for grabs, with no explanation required. I released “Tidy Alix's room”
32+twice last week. Nobody died.
33+
34+## Names are not orders
35+
36+{{<extrait name="x-todo-carte" alt="Card of a task in progress: category colour dot, task name, the words “taken by sacha” and the date." lang={lang} />}}
37+
38+You can write someone's name on a task. The form immediately warns that it is
39+optional, and that others can still take it.
40+
41+I care about this a lot. An assignment here means “this concerns you
42+particularly”, for instance because you are the one with the paediatrician
43+appointment. It never means “I am ordering you to”. The application has no
44+way of giving an order, which saves us from having that discussion.
45+
46+Each block has its little “My tasks” switch, showing only what concerns me. I
47+use it on Saturday mornings, when I want to know where to start without being
48+distracted by the rest.
49+
50+## Finishing, and the question of rhythm
51+
52+This is the part I actually enjoy. Marking a task done opens a sheet that asks
53+two questions at once.
54+
55+{{<shot name="tache-effectuee" alt="Task done screen for “Sortir les poubelles”: a Record time switch with a minute counter, a Reschedule switch with the proposed date and the note “observed rhythm: roughly every 8 days”." lang={lang} legende="Two proposals, and the right to say no to both." />}}
56+
57+The first: is it worth an entry? One switch, one minute counter, and the entry
58+goes into the task's category, in my name. Taking the bin out does not deserve
59+a line. Cleaning the fridge does, because a month later it shows that the
60+housework was not as evenly shared as we thought.
61+
62+The second: does it come back? The application proposes a date, and above all
63+it explains its reasoning. “Observed rhythm: roughly every 8 days.” It looks
64+at the median gap between the previous times rather than the average, which
65+makes it immune to the fortnight of holidays when nobody did anything.
66+
67+That sentence changes everything, because it can be argued with. You can look
68+at the date, decide that eight days is too short in winter, and correct it. An
69+application that had decided on its own would have been wrong half the time,
70+without ever saying so.
71+
72+Rescheduling does not manufacture a new task: the same row goes back down into
73+“To do” with a new date. Its history stays attached, and it is that history
74+that will make the next proposal sharper.
75+
76+## What actually changed
77+
78+We did not save time. That was never the goal and I am wary of tools that
79+promise it.
80+
81+What we gained is a list that does not shout. No red, no notifications, no
82+overdue markers held up as a reproach. A task dated nine days ago says “since
83+7 August”, calmly, and nobody feels accused when opening the screen.
84+
85+It is the first shared list we have kept for more than three months.
new file mode 100644
@@ -0,0 +1,85 @@
1++++
2+title = "The list that does not shout"
3+description = "Household tasks, taken, released, finished, and rescheduled at the observed rhythm."
4+weight = 3
5++++
6+
7+We tried a lot of things before. The whiteboard in the kitchen, which nobody
8+looked at after the first month. The shared list application, with reminders
9+that always rang at the wrong moment. The notebook, lost.
10+
11+The real problem was none of those. It was doing the same thing twice, or
12+neither of us doing it while both were convinced of the opposite.
13+
14+## Taking is saying it out loud
15+
16+{{<shot name="taches" alt="Tasks screen: In progress block with “Nettoyer le frigo” taken by sacha and “Ranger la chambre d'Alix” taken by camille, then the To do block." lang={lang} legende="In progress at the top, to do below, and who is holding what." />}}
17+
18+In Ex Ego, a task sits in the “To do” block until somebody takes it. At that
19+moment it moves up into “In progress” with the name of the person, and that
20+is the whole mechanism.
21+
22+This morning Sacha took “Clean the fridge”. I can see it on my phone. I no
23+longer have to think about it, and above all I am not going to start doing it
24+at noon believing I am helping.
25+
26+The lock is real: while a task is in progress, only the person who took it can
27+change it. It is not a politeness enforced by a greyed-out button, it is the
28+database refusing. Two phones pressing at the same instant, and only one wins.
29+
30+It is not a lifelong commitment either. A “Release” button puts the task back
31+up for grabs, with no explanation required. I released “Tidy Alix's room”
32+twice last week. Nobody died.
33+
34+## Names are not orders
35+
36+{{<extrait name="x-todo-carte" alt="Card of a task in progress: category colour dot, task name, the words “taken by sacha” and the date." lang={lang} />}}
37+
38+You can write someone's name on a task. The form immediately warns that it is
39+optional, and that others can still take it.
40+
41+I care about this a lot. An assignment here means “this concerns you
42+particularly”, for instance because you are the one with the paediatrician
43+appointment. It never means “I am ordering you to”. The application has no
44+way of giving an order, which saves us from having that discussion.
45+
46+Each block has its little “My tasks” switch, showing only what concerns me. I
47+use it on Saturday mornings, when I want to know where to start without being
48+distracted by the rest.
49+
50+## Finishing, and the question of rhythm
51+
52+This is the part I actually enjoy. Marking a task done opens a sheet that asks
53+two questions at once.
54+
55+{{<shot name="tache-effectuee" alt="Task done screen for “Sortir les poubelles”: a Record time switch with a minute counter, a Reschedule switch with the proposed date and the note “observed rhythm: roughly every 8 days”." lang={lang} legende="Two proposals, and the right to say no to both." />}}
56+
57+The first: is it worth an entry? One switch, one minute counter, and the entry
58+goes into the task's category, in my name. Taking the bin out does not deserve
59+a line. Cleaning the fridge does, because a month later it shows that the
60+housework was not as evenly shared as we thought.
61+
62+The second: does it come back? The application proposes a date, and above all
63+it explains its reasoning. “Observed rhythm: roughly every 8 days.” It looks
64+at the median gap between the previous times rather than the average, which
65+makes it immune to the fortnight of holidays when nobody did anything.
66+
67+That sentence changes everything, because it can be argued with. You can look
68+at the date, decide that eight days is too short in winter, and correct it. An
69+application that had decided on its own would have been wrong half the time,
70+without ever saying so.
71+
72+Rescheduling does not manufacture a new task: the same row goes back down into
73+“To do” with a new date. Its history stays attached, and it is that history
74+that will make the next proposal sharper.
75+
76+## What actually changed
77+
78+We did not save time. That was never the goal and I am wary of tools that
79+promise it.
80+
81+What we gained is a list that does not shout. No red, no notifications, no
82+overdue markers held up as a reproach. A task dated nine days ago says “since
83+7 August”, calmly, and nobody feels accused when opening the screen.
84+
85+It is the first shared list we have kept for more than three months.
added docs/site-documentation/content/histoires/la-liste-qui-ne-crie-pas.md +90 -0
new file mode 100644
@@ -0,0 +1,90 @@
1++++
2+title = "La liste qui ne crie pas"
3+description = "Les tâches du foyer, prises, relâchées, terminées, et reprogrammées au rythme constaté."
4+weight = 3
5++++
6+
7+Nous avons essayé beaucoup de choses avant. Le tableau blanc de la cuisine, que
8+personne ne regardait passé le premier mois. L'application de listes partagées,
9+avec ses rappels qui sonnaient toujours au mauvais moment. Le carnet, perdu.
10+
11+Le vrai problème n'était aucun de ceux-là. C'était de faire deux fois la même
12+chose, ou de ne la faire ni l'un ni l'autre en étant chacun persuadé du
13+contraire.
14+
15+## Prendre, c'est le dire à voix haute
16+
17+{{<shot name="taches" alt="Écran Tâches : bloc En cours avec « Nettoyer le frigo » pris par sacha et « Ranger la chambre d'Alix » pris par camille, puis le bloc À faire." lang={lang} legende="En cours en haut, à faire en dessous, et qui tient quoi." />}}
18+
19+Dans Ex Ego, une tâche traîne dans le bloc « À faire » jusqu'à ce que quelqu'un
20+la prenne. À ce moment-là, elle monte dans « En cours » avec le nom de la
21+personne, et c'est tout le mécanisme.
22+
23+Ce matin, Sacha a pris « Nettoyer le frigo ». Je le vois sur mon téléphone. Je
24+n'ai plus à y penser, et surtout je ne vais pas m'y mettre à midi en croyant
25+rendre service.
26+
27+Le verrou est réel : tant qu'une tâche est en cours, seule la personne qui l'a
28+prise peut la modifier. Ce n'est pas une politesse gérée par un bouton grisé,
29+c'est la base de données qui refuse. Deux téléphones qui appuient en même
30+temps, et un seul gagne.
31+
32+Ce n'est pas non plus un engagement à vie. Un bouton « Relâcher » remet la
33+tâche à disposition, sans commentaire à fournir. J'ai relâché « Ranger la
34+chambre d'Alix » deux fois la semaine dernière. Personne n'en est mort.
35+
36+## Les noms ne sont pas des ordres
37+
38+{{<extrait name="x-todo-carte" alt="Carte d'une tâche en cours : point de couleur de la catégorie, nom de la tâche, mention « pris par sacha » et la date." lang={lang} />}}
39+
40+On peut écrire le nom de quelqu'un sur une tâche. Le formulaire prévient
41+aussitôt que c'est facultatif, et que les autres peuvent quand même la prendre.
42+
43+J'y tiens beaucoup. Une assignation, ici, veut dire « ça te concerne
44+particulièrement », par exemple parce que c'est toi qui as le rendez-vous chez
45+le pédiatre. Elle ne veut jamais dire « je te l'ordonne ». L'application n'a
46+aucun moyen de donner un ordre, ce qui évite d'avoir la discussion.
47+
48+Chaque bloc a son petit interrupteur « Mes tâches », qui ne montre que ce qui
49+me concerne. Je m'en sers le samedi matin, quand je veux savoir par quoi
50+commencer sans me laisser distraire par le reste.
51+
52+## Terminer, et la question du rythme
53+
54+Le vrai plaisir est là. Marquer une tâche faite ouvre une feuille qui pose deux
55+questions d'un coup.
56+
57+{{<shot name="tache-effectuee" alt="Écran Tâche effectuée pour « Sortir les poubelles » : interrupteur Enregistrer un temps avec un compteur de minutes, interrupteur Reprogrammer avec la date proposée et la mention « Rythme constaté : tous les 8 jours environ »." lang={lang} legende="Deux propositions, et le droit de dire non aux deux." />}}
58+
59+La première : est-ce que ça vaut un temps ? Un interrupteur, un compteur de
60+minutes, et la saisie part dans la catégorie de la tâche, à mon nom. Sortir la
61+poubelle ne mérite pas une ligne. Nettoyer le frigo, oui, parce que ça permet
62+de voir, un mois plus tard, que le ménage n'était pas si équitable qu'on le
63+croyait.
64+
65+La seconde : est-ce que ça revient ? L'application propose une date, et surtout
66+elle explique son calcul. « Rythme constaté : tous les 8 jours environ. » Elle
67+regarde l'écart médian entre les fois précédentes, et pas la moyenne, ce qui la
68+rend insensible aux quinze jours de vacances où personne n'a rien fait.
69+
70+Cette phrase change tout, parce qu'elle est contestable. On peut regarder la
71+date, se dire que huit jours c'est trop court en hiver, et la corriger. Une
72+application qui aurait décidé toute seule aurait eu tort une fois sur deux,
73+sans jamais le dire.
74+
75+Reprogrammer ne fabrique pas une nouvelle tâche : c'est la même ligne qui
76+redescend dans « À faire » avec une nouvelle date. Son histoire reste
77+accrochée, et c'est cette histoire qui rendra la prochaine proposition plus
78+juste.
79+
80+## Ce qui a vraiment changé
81+
82+Nous n'avons pas gagné du temps. Ce n'était pas le but et je me méfie des
83+outils qui le promettent.
84+
85+Ce que nous avons gagné, c'est une liste qui ne crie pas. Pas de rouge, pas de
86+notification, pas de retard affiché comme un reproche. Une tâche datée d'il y a
87+neuf jours affiche « depuis le 7 août », posément, et personne ne se sent
88+accusé en ouvrant l'écran.
89+
90+C'est la première liste partagée que nous tenons depuis plus de trois mois.
new file mode 100644
@@ -0,0 +1,90 @@
1++++
2+title = "La liste qui ne crie pas"
3+description = "Les tâches du foyer, prises, relâchées, terminées, et reprogrammées au rythme constaté."
4+weight = 3
5++++
6+
7+Nous avons essayé beaucoup de choses avant. Le tableau blanc de la cuisine, que
8+personne ne regardait passé le premier mois. L'application de listes partagées,
9+avec ses rappels qui sonnaient toujours au mauvais moment. Le carnet, perdu.
10+
11+Le vrai problème n'était aucun de ceux-là. C'était de faire deux fois la même
12+chose, ou de ne la faire ni l'un ni l'autre en étant chacun persuadé du
13+contraire.
14+
15+## Prendre, c'est le dire à voix haute
16+
17+{{<shot name="taches" alt="Écran Tâches : bloc En cours avec « Nettoyer le frigo » pris par sacha et « Ranger la chambre d'Alix » pris par camille, puis le bloc À faire." lang={lang} legende="En cours en haut, à faire en dessous, et qui tient quoi." />}}
18+
19+Dans Ex Ego, une tâche traîne dans le bloc « À faire » jusqu'à ce que quelqu'un
20+la prenne. À ce moment-là, elle monte dans « En cours » avec le nom de la
21+personne, et c'est tout le mécanisme.
22+
23+Ce matin, Sacha a pris « Nettoyer le frigo ». Je le vois sur mon téléphone. Je
24+n'ai plus à y penser, et surtout je ne vais pas m'y mettre à midi en croyant
25+rendre service.
26+
27+Le verrou est réel : tant qu'une tâche est en cours, seule la personne qui l'a
28+prise peut la modifier. Ce n'est pas une politesse gérée par un bouton grisé,
29+c'est la base de données qui refuse. Deux téléphones qui appuient en même
30+temps, et un seul gagne.
31+
32+Ce n'est pas non plus un engagement à vie. Un bouton « Relâcher » remet la
33+tâche à disposition, sans commentaire à fournir. J'ai relâché « Ranger la
34+chambre d'Alix » deux fois la semaine dernière. Personne n'en est mort.
35+
36+## Les noms ne sont pas des ordres
37+
38+{{<extrait name="x-todo-carte" alt="Carte d'une tâche en cours : point de couleur de la catégorie, nom de la tâche, mention « pris par sacha » et la date." lang={lang} />}}
39+
40+On peut écrire le nom de quelqu'un sur une tâche. Le formulaire prévient
41+aussitôt que c'est facultatif, et que les autres peuvent quand même la prendre.
42+
43+J'y tiens beaucoup. Une assignation, ici, veut dire « ça te concerne
44+particulièrement », par exemple parce que c'est toi qui as le rendez-vous chez
45+le pédiatre. Elle ne veut jamais dire « je te l'ordonne ». L'application n'a
46+aucun moyen de donner un ordre, ce qui évite d'avoir la discussion.
47+
48+Chaque bloc a son petit interrupteur « Mes tâches », qui ne montre que ce qui
49+me concerne. Je m'en sers le samedi matin, quand je veux savoir par quoi
50+commencer sans me laisser distraire par le reste.
51+
52+## Terminer, et la question du rythme
53+
54+Le vrai plaisir est là. Marquer une tâche faite ouvre une feuille qui pose deux
55+questions d'un coup.
56+
57+{{<shot name="tache-effectuee" alt="Écran Tâche effectuée pour « Sortir les poubelles » : interrupteur Enregistrer un temps avec un compteur de minutes, interrupteur Reprogrammer avec la date proposée et la mention « Rythme constaté : tous les 8 jours environ »." lang={lang} legende="Deux propositions, et le droit de dire non aux deux." />}}
58+
59+La première : est-ce que ça vaut un temps ? Un interrupteur, un compteur de
60+minutes, et la saisie part dans la catégorie de la tâche, à mon nom. Sortir la
61+poubelle ne mérite pas une ligne. Nettoyer le frigo, oui, parce que ça permet
62+de voir, un mois plus tard, que le ménage n'était pas si équitable qu'on le
63+croyait.
64+
65+La seconde : est-ce que ça revient ? L'application propose une date, et surtout
66+elle explique son calcul. « Rythme constaté : tous les 8 jours environ. » Elle
67+regarde l'écart médian entre les fois précédentes, et pas la moyenne, ce qui la
68+rend insensible aux quinze jours de vacances où personne n'a rien fait.
69+
70+Cette phrase change tout, parce qu'elle est contestable. On peut regarder la
71+date, se dire que huit jours c'est trop court en hiver, et la corriger. Une
72+application qui aurait décidé toute seule aurait eu tort une fois sur deux,
73+sans jamais le dire.
74+
75+Reprogrammer ne fabrique pas une nouvelle tâche : c'est la même ligne qui
76+redescend dans « À faire » avec une nouvelle date. Son histoire reste
77+accrochée, et c'est cette histoire qui rendra la prochaine proposition plus
78+juste.
79+
80+## Ce qui a vraiment changé
81+
82+Nous n'avons pas gagné du temps. Ce n'était pas le but et je me méfie des
83+outils qui le promettent.
84+
85+Ce que nous avons gagné, c'est une liste qui ne crie pas. Pas de rouge, pas de
86+notification, pas de retard affiché comme un reproche. Une tâche datée d'il y a
87+neuf jours affiche « depuis le 7 août », posément, et personne ne se sent
88+accusé en ouvrant l'écran.
89+
90+C'est la première liste partagée que nous tenons depuis plus de trois mois.
added docs/site-documentation/content/histoires/le-temps-avec-alix.de.md +86 -0
new file mode 100644
@@ -0,0 +1,86 @@
1++++
2+title = "Zeit, die anders zählt"
3+description = "Camille will wissen, wie viel Zeit wirklich mit dem Baby vergeht, und entdeckt die Gruppen."
4+weight = 1
5++++
6+
7+Alix ist acht Monate alt. Seit der Geburt sehen meine Tage aus wie eine Kette
8+von Handgriffen, für deren Betrachtung nie Zeit bleibt: das Fläschchen, die
9+Windel, der Mittagsschlaf, die Waschmaschine, das Essen, die Windel, der
10+Mittagsschlaf.
11+
12+Eines Abends stellt Sacha eine ganz einfache Frage. „Wie viel Zeit verbringen
13+wir eigentlich mit Alix?“ Nicht mit der Versorgung: mit dem Kind. Eine
14+Geschichte vorlesen. Auf dem Boden Klötze stapeln. In den Park gehen, ohne
15+anderen Zweck als dort zu sein.
16+
17+Wir hatten keine Ahnung. Das Gefühl schon: ständig mit diesem Baby zu sein und
18+nie bei ihm.
19+
20+## Erster Versuch, erstes Scheitern
21+
22+Die Zeit des Haushalts zählten wir schon in Ex Ego, mit den erwartbaren
23+Kategorien: Kochen, Einkaufen, Wäsche, Putzen, Papierkram, und einer Kategorie
24+Kinder, die alles Übrige aufsammelte.
25+
26+Ich legte drei weitere Kategorien an, Spielen, Geschichten und Spaziergang, und
27+füllte sie eine Woche lang. Der Blick am Sonntagabend war enttäuschend.
28+
29+Das Problem waren nicht die Zahlen, es war das Diagramm. Alix' Zeit reihte sich
30+neben Putzen und Einkaufen ein, in denselben Säulen, mit demselben Status.
31+Dabei haben die beiden nichts miteinander zu tun. Hausarbeit wird verteilt; man
32+schaut, wer zu viel macht, und gleicht aus. Die Zeit, in der man seinem Kind
33+eine Geschichte vorliest, wird nicht verteilt, nicht optimiert und niemandem
34+vorgehalten. Sie ins selbe Diagramm zu stellen machte sie zu einer Pflicht
35+unter Pflichten.
36+
37+Und rein mengenmäßig erdrückte sie alles. Fünfzehn Stunden Anwesenheit pro
38+Woche in einer Säule, in der die Wäsche zwei wiegt, und die Wäsche wird
39+unsichtbar.
40+
41+## Beiseitestellen
42+
43+Im Hinzufügen-Reiter führt der Link „Kategorien verwalten“ zu einem
44+Bildschirm, den ich nie bis unten gescrollt hatte. Dort gibt es einen Abschnitt
45+Gruppen, mit einem Satz, der warnt, dass man ihn selten braucht.
46+
47+{{<extrait name="x-groupe-carte" alt="Karte der Gruppe „Temps avec Alix“: drei Kategorien, Balade, Histoires und Jeux, jeweils mit einem Kreuz zum Entfernen aus der Gruppe." lang={lang} legende="Drei Kategorien, ein Gruppenname, mehr nicht." />}}
48+
49+Ich wählte Spielen, tippte „Temps avec Alix“ ins Feld und bestätigte. Dann
50+die beiden anderen, die das Feld mir schon vorschlug. Es gab keinen
51+Anlege-Bildschirm, keine Konfiguration, kein Häkchen. Die Gruppe begann zu
52+existieren, weil drei Kategorien ihren Namen trugen.
53+
54+## Was sich am folgenden Sonntag geändert hat
55+
56+Die Statistik des Teams Maison wurde wieder das, was sie war: Kochen,
57+Einkaufen, Wäsche, Putzen, Papierkram. Die Verteilung der Hausarbeit, lesbar,
58+ohne das Baby, das allen Platz einnahm.
59+
60+{{<shot name="stats" alt="Statistik des Teams Maison: oben die Pillen Maison und Temps avec Alix, dann die Wochendiagramme mit den Kategorien des Haushalts." lang={lang} legende="Die Ansicht Maison, wieder lesbar." />}}
61+
62+Und direkt daneben eine zweite Pille. Eine ganze Ansicht, mit genau denselben
63+Diagrammen, die nur von Alix spricht.
64+
65+{{<shot name="stats-groupe" alt="Die Ansicht „Temps avec Alix“: fünfzehn Stunden und eine Viertelstunde in der Woche, verteilt auf Balade, Histoires und Jeux, je eine Säule für camille und sacha." lang={lang} legende="Fünfzehn Stunden fünfzehn. Wir hätten es nicht erraten." />}}
66+
67+Fünfzehn Stunden und eine Viertelstunde. Ich hatte weniger erwartet, und ein
68+Ungleichgewicht zu meinen Gunsten, da ich tagsüber zu Hause bin. Es war
69+umgekehrt: Sacha ging abends nach dem Heimkommen schnurstracks zur Spielmatte,
70+während ich eine Maschine anstellte. Niemand lag falsch, aber wir wussten es
71+nicht.
72+
73+Wir haben nichts Spektakuläres beschlossen. Ich habe nur aufgehört, zwischen
74+sechs und sieben Wäsche zu falten.
75+
76+## Was ich über das Werkzeug verstanden habe
77+
78+Eine Gruppe versteckt keine Daten und erfindet keine besondere Art von
79+Kategorie. Sie beantwortet eine Frage der Lesbarkeit: diese Stunden lassen sich
80+nicht mit den anderen vergleichen, also teilen sie sich nicht dasselbe
81+Diagramm.
82+
83+Der Test, ob man eine Gruppe braucht, passt in einen Satz. Will ich wissen, ob
84+diese Zeit fair zwischen uns verteilt ist, oder will ich schlicht wissen, dass
85+es sie gibt? Hausarbeit ist die erste Frage und bleibt im Team. Die Zeit mit
86+Alix ist die zweite und lebt für sich.
new file mode 100644
@@ -0,0 +1,86 @@
1++++
2+title = "Zeit, die anders zählt"
3+description = "Camille will wissen, wie viel Zeit wirklich mit dem Baby vergeht, und entdeckt die Gruppen."
4+weight = 1
5++++
6+
7+Alix ist acht Monate alt. Seit der Geburt sehen meine Tage aus wie eine Kette
8+von Handgriffen, für deren Betrachtung nie Zeit bleibt: das Fläschchen, die
9+Windel, der Mittagsschlaf, die Waschmaschine, das Essen, die Windel, der
10+Mittagsschlaf.
11+
12+Eines Abends stellt Sacha eine ganz einfache Frage. „Wie viel Zeit verbringen
13+wir eigentlich mit Alix?“ Nicht mit der Versorgung: mit dem Kind. Eine
14+Geschichte vorlesen. Auf dem Boden Klötze stapeln. In den Park gehen, ohne
15+anderen Zweck als dort zu sein.
16+
17+Wir hatten keine Ahnung. Das Gefühl schon: ständig mit diesem Baby zu sein und
18+nie bei ihm.
19+
20+## Erster Versuch, erstes Scheitern
21+
22+Die Zeit des Haushalts zählten wir schon in Ex Ego, mit den erwartbaren
23+Kategorien: Kochen, Einkaufen, Wäsche, Putzen, Papierkram, und einer Kategorie
24+Kinder, die alles Übrige aufsammelte.
25+
26+Ich legte drei weitere Kategorien an, Spielen, Geschichten und Spaziergang, und
27+füllte sie eine Woche lang. Der Blick am Sonntagabend war enttäuschend.
28+
29+Das Problem waren nicht die Zahlen, es war das Diagramm. Alix' Zeit reihte sich
30+neben Putzen und Einkaufen ein, in denselben Säulen, mit demselben Status.
31+Dabei haben die beiden nichts miteinander zu tun. Hausarbeit wird verteilt; man
32+schaut, wer zu viel macht, und gleicht aus. Die Zeit, in der man seinem Kind
33+eine Geschichte vorliest, wird nicht verteilt, nicht optimiert und niemandem
34+vorgehalten. Sie ins selbe Diagramm zu stellen machte sie zu einer Pflicht
35+unter Pflichten.
36+
37+Und rein mengenmäßig erdrückte sie alles. Fünfzehn Stunden Anwesenheit pro
38+Woche in einer Säule, in der die Wäsche zwei wiegt, und die Wäsche wird
39+unsichtbar.
40+
41+## Beiseitestellen
42+
43+Im Hinzufügen-Reiter führt der Link „Kategorien verwalten“ zu einem
44+Bildschirm, den ich nie bis unten gescrollt hatte. Dort gibt es einen Abschnitt
45+Gruppen, mit einem Satz, der warnt, dass man ihn selten braucht.
46+
47+{{<extrait name="x-groupe-carte" alt="Karte der Gruppe „Temps avec Alix“: drei Kategorien, Balade, Histoires und Jeux, jeweils mit einem Kreuz zum Entfernen aus der Gruppe." lang={lang} legende="Drei Kategorien, ein Gruppenname, mehr nicht." />}}
48+
49+Ich wählte Spielen, tippte „Temps avec Alix“ ins Feld und bestätigte. Dann
50+die beiden anderen, die das Feld mir schon vorschlug. Es gab keinen
51+Anlege-Bildschirm, keine Konfiguration, kein Häkchen. Die Gruppe begann zu
52+existieren, weil drei Kategorien ihren Namen trugen.
53+
54+## Was sich am folgenden Sonntag geändert hat
55+
56+Die Statistik des Teams Maison wurde wieder das, was sie war: Kochen,
57+Einkaufen, Wäsche, Putzen, Papierkram. Die Verteilung der Hausarbeit, lesbar,
58+ohne das Baby, das allen Platz einnahm.
59+
60+{{<shot name="stats" alt="Statistik des Teams Maison: oben die Pillen Maison und Temps avec Alix, dann die Wochendiagramme mit den Kategorien des Haushalts." lang={lang} legende="Die Ansicht Maison, wieder lesbar." />}}
61+
62+Und direkt daneben eine zweite Pille. Eine ganze Ansicht, mit genau denselben
63+Diagrammen, die nur von Alix spricht.
64+
65+{{<shot name="stats-groupe" alt="Die Ansicht „Temps avec Alix“: fünfzehn Stunden und eine Viertelstunde in der Woche, verteilt auf Balade, Histoires und Jeux, je eine Säule für camille und sacha." lang={lang} legende="Fünfzehn Stunden fünfzehn. Wir hätten es nicht erraten." />}}
66+
67+Fünfzehn Stunden und eine Viertelstunde. Ich hatte weniger erwartet, und ein
68+Ungleichgewicht zu meinen Gunsten, da ich tagsüber zu Hause bin. Es war
69+umgekehrt: Sacha ging abends nach dem Heimkommen schnurstracks zur Spielmatte,
70+während ich eine Maschine anstellte. Niemand lag falsch, aber wir wussten es
71+nicht.
72+
73+Wir haben nichts Spektakuläres beschlossen. Ich habe nur aufgehört, zwischen
74+sechs und sieben Wäsche zu falten.
75+
76+## Was ich über das Werkzeug verstanden habe
77+
78+Eine Gruppe versteckt keine Daten und erfindet keine besondere Art von
79+Kategorie. Sie beantwortet eine Frage der Lesbarkeit: diese Stunden lassen sich
80+nicht mit den anderen vergleichen, also teilen sie sich nicht dasselbe
81+Diagramm.
82+
83+Der Test, ob man eine Gruppe braucht, passt in einen Satz. Will ich wissen, ob
84+diese Zeit fair zwischen uns verteilt ist, oder will ich schlicht wissen, dass
85+es sie gibt? Hausarbeit ist die erste Frage und bleibt im Team. Die Zeit mit
86+Alix ist die zweite und lebt für sich.
added docs/site-documentation/content/histoires/le-temps-avec-alix.en.md +81 -0
new file mode 100644
@@ -0,0 +1,81 @@
1++++
2+title = "Time that does not count the same way"
3+description = "Camille wants to know how much time is really spent with the baby, and discovers groups."
4+weight = 1
5++++
6+
7+Alix is eight months old. Since the birth, my days look like a chain of
8+gestures I never get to look at: the bottle, the nappy, the nap, the washing
9+machine, the meal, the nappy, the nap.
10+
11+One evening Sacha asks a very simple question. “How much time do we actually
12+spend with Alix?” Not looking after: with. Reading a story. Sitting on the
13+floor stacking blocks. Taking the pram to the park with no other purpose than
14+being there.
15+
16+We had no idea. The feeling, yes: being with this baby all the time and never
17+being with them.
18+
19+## First attempt, first failure
20+
21+We were already counting the household's time in Ex Ego, with the categories
22+you would expect: Cooking, Groceries, Laundry, Cleaning, Paperwork, and a
23+Children category that swept up everything else.
24+
25+I started by creating three more categories, Play, Stories and Walks, and by
26+feeding them for a week. Sunday evening's reading was disappointing.
27+
28+The problem was not the numbers, it was the chart. Alix's time lined up next to
29+the cleaning and the groceries, in the same columns, with the same status. Yet
30+the two have nothing to do with each other. Housework gets shared out; you look
31+at who does too much and you rebalance. Time spent reading a story to your
32+child is not shared out, not optimised, and never held against anyone. Putting
33+it in the same chart turned it into one chore among chores.
34+
35+And in sheer volume, it crushed everything. Fifteen hours of presence a week in
36+a column where laundry weighs two, and the laundry becomes invisible.
37+
38+## Setting it apart
39+
40+In the Add tab, the “Manage categories” link leads to a screen I had never
41+scrolled to the bottom of. There is a Groups section there, with a sentence
42+warning that it is rarely necessary.
43+
44+{{<extrait name="x-groupe-carte" alt="Card of the “Temps avec Alix” group: three categories, Balade, Histoires and Jeux, each with a cross to remove it from the group." lang={lang} legende="Three categories, one group name, and that is all." />}}
45+
46+I picked Play, typed “Temps avec Alix” in the field, and confirmed. Then the
47+other two, which the field was already suggesting. There was no creation
48+screen, no configuration, no checkbox. The group started existing because three
49+categories carried its name.
50+
51+## What changed the following Sunday
52+
53+The statistics of the Maison team went back to being what they were: cooking,
54+groceries, laundry, cleaning, paperwork. The sharing of chores, readable, with
55+no baby taking up all the room.
56+
57+{{<shot name="stats" alt="Statistics of the Maison team: the Maison and Temps avec Alix pills at the top, then the weekly charts with the household categories." lang={lang} legende="The Maison panel, readable again." />}}
58+
59+And right beside it, a second pill. A whole panel, with exactly the same
60+charts, that talks about nothing but Alix.
61+
62+{{<shot name="stats-groupe" alt="The “Temps avec Alix” panel: fifteen and a quarter hours over the week, split between Balade, Histoires and Jeux, one column for camille and one for sacha." lang={lang} legende="Fifteen hours and a quarter. We would never have guessed." />}}
63+
64+Fifteen hours and a quarter. I expected less, and I expected an imbalance in my
65+favour, since I am the one at home during the day. It was the opposite: Sacha,
66+coming home in the evening, went straight to the play mat, while I started a
67+load of washing. Nobody was wrong, but we did not know.
68+
69+We decided nothing spectacular. I simply stopped folding laundry between six
70+and seven.
71+
72+## What I understood about the tool
73+
74+A group does not hide data and does not invent a special kind of category. It
75+answers a question about reading: these hours do not compare to the others, so
76+they do not share the same chart.
77+
78+The test for whether you need a group fits in one sentence. Do I want to know
79+whether this time is fairly shared between us, or do I simply want to know that
80+it exists? Housework is the first question and stays in the team. Time with
81+Alix is the second, and lives apart.
new file mode 100644
@@ -0,0 +1,81 @@
1++++
2+title = "Time that does not count the same way"
3+description = "Camille wants to know how much time is really spent with the baby, and discovers groups."
4+weight = 1
5++++
6+
7+Alix is eight months old. Since the birth, my days look like a chain of
8+gestures I never get to look at: the bottle, the nappy, the nap, the washing
9+machine, the meal, the nappy, the nap.
10+
11+One evening Sacha asks a very simple question. “How much time do we actually
12+spend with Alix?” Not looking after: with. Reading a story. Sitting on the
13+floor stacking blocks. Taking the pram to the park with no other purpose than
14+being there.
15+
16+We had no idea. The feeling, yes: being with this baby all the time and never
17+being with them.
18+
19+## First attempt, first failure
20+
21+We were already counting the household's time in Ex Ego, with the categories
22+you would expect: Cooking, Groceries, Laundry, Cleaning, Paperwork, and a
23+Children category that swept up everything else.
24+
25+I started by creating three more categories, Play, Stories and Walks, and by
26+feeding them for a week. Sunday evening's reading was disappointing.
27+
28+The problem was not the numbers, it was the chart. Alix's time lined up next to
29+the cleaning and the groceries, in the same columns, with the same status. Yet
30+the two have nothing to do with each other. Housework gets shared out; you look
31+at who does too much and you rebalance. Time spent reading a story to your
32+child is not shared out, not optimised, and never held against anyone. Putting
33+it in the same chart turned it into one chore among chores.
34+
35+And in sheer volume, it crushed everything. Fifteen hours of presence a week in
36+a column where laundry weighs two, and the laundry becomes invisible.
37+
38+## Setting it apart
39+
40+In the Add tab, the “Manage categories” link leads to a screen I had never
41+scrolled to the bottom of. There is a Groups section there, with a sentence
42+warning that it is rarely necessary.
43+
44+{{<extrait name="x-groupe-carte" alt="Card of the “Temps avec Alix” group: three categories, Balade, Histoires and Jeux, each with a cross to remove it from the group." lang={lang} legende="Three categories, one group name, and that is all." />}}
45+
46+I picked Play, typed “Temps avec Alix” in the field, and confirmed. Then the
47+other two, which the field was already suggesting. There was no creation
48+screen, no configuration, no checkbox. The group started existing because three
49+categories carried its name.
50+
51+## What changed the following Sunday
52+
53+The statistics of the Maison team went back to being what they were: cooking,
54+groceries, laundry, cleaning, paperwork. The sharing of chores, readable, with
55+no baby taking up all the room.
56+
57+{{<shot name="stats" alt="Statistics of the Maison team: the Maison and Temps avec Alix pills at the top, then the weekly charts with the household categories." lang={lang} legende="The Maison panel, readable again." />}}
58+
59+And right beside it, a second pill. A whole panel, with exactly the same
60+charts, that talks about nothing but Alix.
61+
62+{{<shot name="stats-groupe" alt="The “Temps avec Alix” panel: fifteen and a quarter hours over the week, split between Balade, Histoires and Jeux, one column for camille and one for sacha." lang={lang} legende="Fifteen hours and a quarter. We would never have guessed." />}}
63+
64+Fifteen hours and a quarter. I expected less, and I expected an imbalance in my
65+favour, since I am the one at home during the day. It was the opposite: Sacha,
66+coming home in the evening, went straight to the play mat, while I started a
67+load of washing. Nobody was wrong, but we did not know.
68+
69+We decided nothing spectacular. I simply stopped folding laundry between six
70+and seven.
71+
72+## What I understood about the tool
73+
74+A group does not hide data and does not invent a special kind of category. It
75+answers a question about reading: these hours do not compare to the others, so
76+they do not share the same chart.
77+
78+The test for whether you need a group fits in one sentence. Do I want to know
79+whether this time is fairly shared between us, or do I simply want to know that
80+it exists? Housework is the first question and stays in the team. Time with
81+Alix is the second, and lives apart.
added docs/site-documentation/content/histoires/le-temps-avec-alix.md +83 -0
new file mode 100644
@@ -0,0 +1,83 @@
1++++
2+title = "Le temps qui ne compte pas pareil"
3+description = "Camille cherche à savoir combien de temps se passe vraiment avec le bébé, et découvre les groupes."
4+weight = 1
5++++
6+
7+Alix a huit mois. Depuis sa naissance, mes journées ressemblent à une suite de
8+gestes qui s'enchaînent sans que j'aie le temps de les regarder : le biberon,
9+la couche, la sieste, la machine à laver, le repas, la couche, la sieste.
10+
11+Un soir, Sacha me pose une question toute simple. « On passe combien de temps
12+avec Alix, en vrai ? » Pas à s'en occuper : avec. Lui lire une histoire. Jouer
13+par terre à empiler des cubes. L'emmener au parc sans autre but que d'y être.
14+
15+Nous n'avions aucune idée de la réponse. Le sentiment, oui : celui d'être tout
16+le temps avec ce bébé et de ne jamais être avec lui.
17+
18+## Première tentative, et premier échec
19+
20+Nous comptions déjà le temps de la maison dans Ex Ego, avec les catégories
21+qu'on imagine : Cuisine, Courses, Linge, Ménage, Administratif, et une
22+catégorie Enfants qui ramassait tout le reste.
23+
24+J'ai commencé par créer trois catégories de plus, Jeux, Histoires et Balade, et
25+par les alimenter pendant une semaine. La lecture du dimanche soir a été
26+décevante.
27+
28+Le problème n'était pas les chiffres, il était dans le graphique. Le temps
29+d'Alix se rangeait à côté du ménage et des courses, dans les mêmes colonnes,
30+avec le même statut. Or ces deux choses n'ont rien à voir. Le ménage, on le
31+répartit ; on regarde qui en fait trop, on rééquilibre. Le temps passé à lire
32+une histoire à son enfant ne se répartit pas, ne s'optimise pas et ne se
33+reproche à personne. Le mettre dans le même graphique, c'était le transformer
34+en corvée parmi les corvées.
35+
36+Et matériellement, il écrasait tout. Quinze heures de présence par semaine dans
37+une colonne où le linge en pèse deux, et le linge devient invisible.
38+
39+## Mettre à part
40+
41+Dans l'onglet Ajouter, le lien « Gérer les catégories » mène à un écran que je
42+n'avais jamais fait défiler jusqu'en bas. Il y a une section Groupes, avec une
43+phrase qui prévient que c'est rarement nécessaire.
44+
45+{{<extrait name="x-groupe-carte" alt="Carte du groupe « Temps avec Alix » : trois catégories, Balade, Histoires et Jeux, chacune avec une croix pour la retirer du groupe." lang={lang} legende="Trois catégories, un nom de groupe, et c'est tout." />}}
46+
47+J'ai choisi Jeux, j'ai tapé « Temps avec Alix » dans le champ, et j'ai validé.
48+Puis les deux autres, que le champ me proposait déjà par autocomplétion. Il n'y
49+a pas eu d'écran de création, pas de configuration, pas de case à cocher. Le
50+groupe s'est mis à exister parce que trois catégories portaient son nom.
51+
52+## Ce que ça a changé, le dimanche suivant
53+
54+Les statistiques de l'équipe Maison sont redevenues ce qu'elles étaient : la
55+cuisine, les courses, le linge, le ménage, les papiers. Le partage des corvées,
56+lisible, sans le bébé qui prenait toute la place.
57+
58+{{<shot name="stats" alt="Statistiques de l'équipe Maison : les pastilles Maison et Temps avec Alix en haut, puis les graphiques de la semaine avec les catégories du foyer." lang={lang} legende="Le panneau Maison, redevenu lisible." />}}
59+
60+Et juste à côté, une deuxième pastille. Un panneau entier, avec exactement les
61+mêmes graphiques, mais qui ne parle que d'Alix.
62+
63+{{<shot name="stats-groupe" alt="Panneau « Temps avec Alix » : quinze heures et quart sur la semaine, réparties entre Balade, Histoires et Jeux, colonne camille et colonne sacha." lang={lang} legende="Quinze heures et quart. Nous ne l'aurions pas deviné." />}}
64+
65+Quinze heures et quart. Je m'attendais à moins, et à un déséquilibre en ma
66+faveur, puisque je suis à la maison la journée. C'était le contraire : Sacha,
67+en rentrant le soir, filait droit au tapis de jeu, quand moi je lançais une
68+machine.
69+Personne n'avait tort, mais nous ne le savions pas.
70+
71+Nous n'avons rien décidé de spectaculaire. J'ai juste arrêté de plier le linge
72+entre dix-huit et dix-neuf heures.
73+
74+## Ce que j'ai compris de l'outil
75+
76+Un groupe ne cache pas des données et n'invente pas de catégorie spéciale. Il
77+répond à une question de lecture : ces heures-là ne se comparent pas aux
78+autres, alors elles ne partagent pas le même graphique.
79+
80+Le test, pour savoir s'il faut créer un groupe, tient en une phrase. Est-ce que
81+je veux savoir si ce temps est bien réparti entre nous, ou est-ce que je veux
82+simplement savoir s'il existe ? Le ménage relève de la première question et
83+reste dans l'équipe. Le temps avec Alix relève de la seconde, et vit à part.
new file mode 100644
@@ -0,0 +1,83 @@
1++++
2+title = "Le temps qui ne compte pas pareil"
3+description = "Camille cherche à savoir combien de temps se passe vraiment avec le bébé, et découvre les groupes."
4+weight = 1
5++++
6+
7+Alix a huit mois. Depuis sa naissance, mes journées ressemblent à une suite de
8+gestes qui s'enchaînent sans que j'aie le temps de les regarder : le biberon,
9+la couche, la sieste, la machine à laver, le repas, la couche, la sieste.
10+
11+Un soir, Sacha me pose une question toute simple. « On passe combien de temps
12+avec Alix, en vrai ? » Pas à s'en occuper : avec. Lui lire une histoire. Jouer
13+par terre à empiler des cubes. L'emmener au parc sans autre but que d'y être.
14+
15+Nous n'avions aucune idée de la réponse. Le sentiment, oui : celui d'être tout
16+le temps avec ce bébé et de ne jamais être avec lui.
17+
18+## Première tentative, et premier échec
19+
20+Nous comptions déjà le temps de la maison dans Ex Ego, avec les catégories
21+qu'on imagine : Cuisine, Courses, Linge, Ménage, Administratif, et une
22+catégorie Enfants qui ramassait tout le reste.
23+
24+J'ai commencé par créer trois catégories de plus, Jeux, Histoires et Balade, et
25+par les alimenter pendant une semaine. La lecture du dimanche soir a été
26+décevante.
27+
28+Le problème n'était pas les chiffres, il était dans le graphique. Le temps
29+d'Alix se rangeait à côté du ménage et des courses, dans les mêmes colonnes,
30+avec le même statut. Or ces deux choses n'ont rien à voir. Le ménage, on le
31+répartit ; on regarde qui en fait trop, on rééquilibre. Le temps passé à lire
32+une histoire à son enfant ne se répartit pas, ne s'optimise pas et ne se
33+reproche à personne. Le mettre dans le même graphique, c'était le transformer
34+en corvée parmi les corvées.
35+
36+Et matériellement, il écrasait tout. Quinze heures de présence par semaine dans
37+une colonne où le linge en pèse deux, et le linge devient invisible.
38+
39+## Mettre à part
40+
41+Dans l'onglet Ajouter, le lien « Gérer les catégories » mène à un écran que je
42+n'avais jamais fait défiler jusqu'en bas. Il y a une section Groupes, avec une
43+phrase qui prévient que c'est rarement nécessaire.
44+
45+{{<extrait name="x-groupe-carte" alt="Carte du groupe « Temps avec Alix » : trois catégories, Balade, Histoires et Jeux, chacune avec une croix pour la retirer du groupe." lang={lang} legende="Trois catégories, un nom de groupe, et c'est tout." />}}
46+
47+J'ai choisi Jeux, j'ai tapé « Temps avec Alix » dans le champ, et j'ai validé.
48+Puis les deux autres, que le champ me proposait déjà par autocomplétion. Il n'y
49+a pas eu d'écran de création, pas de configuration, pas de case à cocher. Le
50+groupe s'est mis à exister parce que trois catégories portaient son nom.
51+
52+## Ce que ça a changé, le dimanche suivant
53+
54+Les statistiques de l'équipe Maison sont redevenues ce qu'elles étaient : la
55+cuisine, les courses, le linge, le ménage, les papiers. Le partage des corvées,
56+lisible, sans le bébé qui prenait toute la place.
57+
58+{{<shot name="stats" alt="Statistiques de l'équipe Maison : les pastilles Maison et Temps avec Alix en haut, puis les graphiques de la semaine avec les catégories du foyer." lang={lang} legende="Le panneau Maison, redevenu lisible." />}}
59+
60+Et juste à côté, une deuxième pastille. Un panneau entier, avec exactement les
61+mêmes graphiques, mais qui ne parle que d'Alix.
62+
63+{{<shot name="stats-groupe" alt="Panneau « Temps avec Alix » : quinze heures et quart sur la semaine, réparties entre Balade, Histoires et Jeux, colonne camille et colonne sacha." lang={lang} legende="Quinze heures et quart. Nous ne l'aurions pas deviné." />}}
64+
65+Quinze heures et quart. Je m'attendais à moins, et à un déséquilibre en ma
66+faveur, puisque je suis à la maison la journée. C'était le contraire : Sacha,
67+en rentrant le soir, filait droit au tapis de jeu, quand moi je lançais une
68+machine.
69+Personne n'avait tort, mais nous ne le savions pas.
70+
71+Nous n'avons rien décidé de spectaculaire. J'ai juste arrêté de plier le linge
72+entre dix-huit et dix-neuf heures.
73+
74+## Ce que j'ai compris de l'outil
75+
76+Un groupe ne cache pas des données et n'invente pas de catégorie spéciale. Il
77+répond à une question de lecture : ces heures-là ne se comparent pas aux
78+autres, alors elles ne partagent pas le même graphique.
79+
80+Le test, pour savoir s'il faut créer un groupe, tient en une phrase. Est-ce que
81+je veux savoir si ce temps est bien réparti entre nous, ou est-ce que je veux
82+simplement savoir s'il existe ? Le ménage relève de la première question et
83+reste dans l'équipe. Le temps avec Alix relève de la seconde, et vit à part.
added docs/site-documentation/img.sh +19 -0
new file mode 100755
@@ -0,0 +1,19 @@
1+#!/bin/sh
2+# Encode en JPEG XL chaque PNG capturé par shots.mjs, à côté de lui.
3+# Le PNG reste le repli servi aux navigateurs sans JXL (aujourd'hui la
4+# majorité), le JXL est proposé en premier par le <picture> des shortcodes.
5+#
6+# Sans lossy : ce sont des captures d'interface, le texte doit rester net.
7+# -d 0 = mathématiquement sans perte, -e 8 = effort de compression élevé.
8+set -eu
9+cd "$(dirname "$0")/static/img"
10+n=0
11+for png in */*.png; do
12+ jxl="${png%.png}.jxl"
13+ if [ ! -f "$jxl" ] || [ "$png" -nt "$jxl" ]; then
14+ cjxl -d 0 -e 8 --quiet "$png" "$jxl"
15+ n=$((n + 1))
16+ fi
17+done
18+echo "$n fichiers JPEG XL encodés"
19+du -sh .
new file mode 100755
@@ -0,0 +1,19 @@
1+#!/bin/sh
2+# Encode en JPEG XL chaque PNG capturé par shots.mjs, à côté de lui.
3+# Le PNG reste le repli servi aux navigateurs sans JXL (aujourd'hui la
4+# majorité), le JXL est proposé en premier par le <picture> des shortcodes.
5+#
6+# Sans lossy : ce sont des captures d'interface, le texte doit rester net.
7+# -d 0 = mathématiquement sans perte, -e 8 = effort de compression élevé.
8+set -eu
9+cd "$(dirname "$0")/static/img"
10+n=0
11+for png in */*.png; do
12+ jxl="${png%.png}.jxl"
13+ if [ ! -f "$jxl" ] || [ "$png" -nt "$jxl" ]; then
14+ cjxl -d 0 -e 8 --quiet "$png" "$jxl"
15+ n=$((n + 1))
16+ fi
17+done
18+echo "$n fichiers JPEG XL encodés"
19+du -sh .
added docs/site-documentation/shots.mjs +285 -0
new file mode 100644
@@ -0,0 +1,285 @@
1+// Captures d'écran du site de documentation — Chrome headless via
2+// puppeteer-core, calqué sur docs/slides/demo/capture.mjs.
3+//
4+// Particularité : la documentation est trilingue, donc chaque écran est
5+// capturé trois fois, une par langue de l'utilisateur (la langue est un
6+// réglage de compte, pas du navigateur). Sortie dans static/img/<lang>/.
7+// Les pages anonymes (connexion, erreurs) sont toujours rendues dans la
8+// langue par défaut de l'instance : elles ne sont capturées qu'une fois et
9+// recopiées dans les trois dossiers.
10+//
11+// Prérequis : un serveur exego sur la base DEV, seedée par
12+// docs/slides/demo/seed.mjs, et les dépendances node d'a11y/.
13+//
14+// Usage :
15+// cd docs/site-documentation
16+// CHROME=/chemin/vers/chrome TT_USER=camille TT_PASS=… node shots.mjs
17+//
18+// Puis `./img.sh` encode les JPEG XL à côté des PNG.
19+
20+import { execSync } from 'node:child_process';
21+import { copyFileSync, mkdirSync, writeFileSync } from 'node:fs';
22+import { createRequire } from 'node:module';
23+import path from 'node:path';
24+import { fileURLToPath } from 'node:url';
25+
26+const require = createRequire(new URL('../../a11y/package.json', import.meta.url));
27+const puppeteer = require('puppeteer-core');
28+
29+const BASE = process.env.TT_URL ?? 'http://localhost:8090';
30+const USER = process.env.TT_USER;
31+const PASS = process.env.TT_PASS;
32+if (!USER || !PASS) {
33+ console.error('TT_USER et TT_PASS sont requis (compte de démo, jamais un compte réel).');
34+ process.exit(2);
35+}
36+const CHROME =
37+ process.env.CHROME ??
38+ execSync('command -v google-chrome-stable || command -v google-chrome || command -v chromium')
39+ .toString()
40+ .trim();
41+
42+const HERE = path.dirname(fileURLToPath(import.meta.url));
43+const IMG = path.join(HERE, 'static', 'img');
44+const LANGS = ['fr', 'en', 'de'];
45+for (const l of LANGS) mkdirSync(path.join(IMG, l), { recursive: true });
46+
47+// Semaine ISO précédente : toujours pleine, donc plus parlante que la semaine
48+// courante à peine entamée.
49+function isoWeekOf(date) {
50+ const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
51+ d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
52+ const jan1 = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
53+ const week = Math.ceil(((d - jan1) / 86_400_000 + 1) / 7);
54+ return `${d.getUTCFullYear()}-W${String(week).padStart(2, '0')}`;
55+}
56+const prevWeek = isoWeekOf(new Date(Date.now() - 7 * 86_400_000));
57+
58+const browser = await puppeteer.launch({
59+ executablePath: CHROME,
60+ headless: 'new',
61+ args: ['--no-sandbox', '--disable-dev-shm-usage'],
62+});
63+const viewport = { width: 390, height: 844, isMobile: true, hasTouch: true, deviceScaleFactor: 2 };
64+
65+// Les animations CSS sont figées à mi-course en headless : on les neutralise.
66+const FREEZE = '* { animation: none !important; transition: none !important; }';
67+
68+let written = 0;
69+async function full(pg, lang, name) {
70+ await pg.addStyleTag({ content: FREEZE });
71+ writeFileSync(path.join(IMG, lang, `${name}.png`), await pg.screenshot());
72+ written++;
73+}
74+
75+const wait = (ms) => new Promise((r) => setTimeout(r, ms));
76+
77+// Extrait recadré autour d'un élément, avec une marge (en pixels CSS).
78+// L'élément est d'abord ramené au centre de l'écran : sous la ligne de
79+// flottaison, la zone de découpe tomberait hors du rendu et sortirait vide.
80+async function crop(pg, lang, name, selector, pad = 8) {
81+ await pg.addStyleTag({ content: FREEZE });
82+ const el = await pg.$(selector);
83+ if (!el) {
84+ console.warn(`⚠ ${lang}/${name} : sélecteur « ${selector} » introuvable, extrait sauté`);
85+ return;
86+ }
87+ await el.evaluate((e) => e.scrollIntoView({ block: 'center', behavior: 'instant' }));
88+ await wait(120);
89+ const b = await el.boundingBox();
90+ if (!b) {
91+ console.warn(`⚠ ${lang}/${name} : élément invisible, extrait sauté`);
92+ return;
93+ }
94+ const clip = {
95+ x: Math.max(0, b.x - pad),
96+ y: Math.max(0, b.y - pad),
97+ width: Math.min(viewport.width, b.width + pad * 2),
98+ height: Math.min(viewport.height - Math.max(0, b.y - pad), b.height + pad * 2),
99+ };
100+ writeFileSync(path.join(IMG, lang, `${name}.png`), await pg.screenshot({ clip }));
101+ written++;
102+}
103+
104+// Le défilement par ancre (feuilles de détail, panneaux de groupe) est animé :
105+// sans pause, la capture attrape le carrousel entre deux panneaux.
106+async function go(pg, url) {
107+ await pg.goto(`${BASE}${url}`, { waitUntil: 'networkidle0' });
108+ if (url.includes('#')) await wait(700);
109+}
110+
111+// --- Écrans anonymes : une seule prise, recopiée dans les trois langues ----
112+{
113+ const anon = await browser.createBrowserContext();
114+ const pg = await anon.newPage();
115+ await pg.setViewport(viewport);
116+ await go(pg, '/login');
117+ await full(pg, LANGS[0], 'connexion');
118+ await go(pg, '/cette-page-nexiste-pas');
119+ await full(pg, LANGS[0], 'erreur-404');
120+ await anon.close();
121+ for (const l of LANGS.slice(1)) {
122+ for (const n of ['connexion', 'erreur-404']) {
123+ copyFileSync(path.join(IMG, LANGS[0], `${n}.png`), path.join(IMG, l, `${n}.png`));
124+ }
125+ }
126+}
127+
128+// --- Connexion ------------------------------------------------------------
129+const page = await browser.newPage();
130+await page.setViewport(viewport);
131+await go(page, '/login');
132+await page.type('input[name="username"]', USER);
133+await page.type('input[name="password"]', PASS);
134+await Promise.all([
135+ page.waitForNavigation({ waitUntil: 'networkidle0' }),
136+ page.click('button[type="submit"]'),
137+]);
138+if (page.url().includes('/login')) {
139+ console.error('Connexion échouée — vérifie TT_USER / TT_PASS.');
140+ await browser.close();
141+ process.exit(2);
142+}
143+
144+// Bascule de langue du compte (POST /parametres/langue).
145+async function setLang(lang) {
146+ await go(page, '/parametres');
147+ const ok = await page.evaluate((l) => {
148+ const input = document.querySelector(`form[action="/parametres/langue"] input[value="${l}"]`);
149+ if (!input) return false;
150+ input.form.querySelector('button[type="submit"]').click();
151+ return true;
152+ }, lang);
153+ if (!ok) throw new Error(`bascule de langue impossible vers ${lang}`);
154+ await page.waitForNavigation({ waitUntil: 'networkidle0' });
155+}
156+
157+// Bascule d'équipe par la feuille « Changer d'équipe ».
158+async function switchTeam(fragment) {
159+ await go(page, '/temps/nouveau#equipes');
160+ const ok = await page.evaluate((f) => {
161+ const btn = [...document.querySelectorAll('#equipes .team-choice')].find((b) =>
162+ b.textContent.includes(f),
163+ );
164+ if (!btn) return false;
165+ btn.click();
166+ return true;
167+ }, fragment);
168+ if (!ok) throw new Error(`équipe « ${fragment} » introuvable dans la feuille`);
169+ await page.waitForNavigation({ waitUntil: 'networkidle0' });
170+}
171+
172+// Identifiants dynamiques (catégorie, saisie, tâches, segment de stats).
173+async function discover() {
174+ return page.evaluate(async (statsUrl) => {
175+ const txt = (u) => fetch(u).then((r) => r.text());
176+ const step1 = await txt('/temps/nouveau?mode=manuel');
177+ const todos = await txt('/taches');
178+ const stats = await txt(statsUrl);
179+ const times = await txt('/temps');
180+ const before = (html, needle) => html.slice(0, html.indexOf(needle));
181+ const lastCat = (html) => html.match(/categorie=([0-9a-f-]{36})(?![\s\S]*categorie=)/)?.[1];
182+ return {
183+ // « Cuisine » : la catégorie la plus parlante de l'équipe Maison.
184+ categorie: lastCat(before(step1, 'Cuisine')) ?? step1.match(/categorie=([0-9a-f-]{36})/)?.[1],
185+ // Tâche avec un historique de complétions : la reprogrammation proposée
186+ // par l'écran « effectuée » a de quoi être crédible.
187+ todoDone: todos
188+ .slice(todos.indexOf('Sortir les poubelles'))
189+ .match(/\/taches\/([0-9a-f-]{36})\/terminer/)?.[1],
190+ todoEdit: todos
191+ .slice(todos.indexOf('Trier les papiers'))
192+ .match(/\/taches\/([0-9a-f-]{36})\/modifier/)?.[1],
193+ entree: times.match(/\/temps\/([0-9a-f-]{36})\/modifier/)?.[1],
194+ segment: stats.match(/href="#(d-sem-\d+-\d+)"/)?.[1],
195+ groupe: stats.match(/scope-pill" href="#(p-[1-9]\d*)"/)?.[1],
196+ };
197+ }, `/stats?semaine=${prevWeek}`);
198+}
199+
200+for (const lang of LANGS) {
201+ await setLang(lang);
202+ const ids = await discover();
203+ console.log(`— ${lang} :`, ids);
204+
205+ // Écrans pleins (équipe active : Maison).
206+ const screens = [
207+ ['ajouter-choix', '/temps/nouveau'],
208+ ['ajouter-categorie', '/temps/nouveau?mode=manuel'],
209+ ids.categorie && ['ajouter-duree', `/temps/nouveau?categorie=${ids.categorie}`],
210+ ['stats', `/stats?semaine=${prevWeek}`],
211+ ids.groupe && ['stats-groupe', `/stats?semaine=${prevWeek}#${ids.groupe}`],
212+ ids.segment && ['stats-detail', `/stats?semaine=${prevWeek}#${ids.segment}`],
213+ ['mes-temps', '/temps'],
214+ ids.entree && ['modifier-temps', `/temps/${ids.entree}/modifier`],
215+ ['taches', '/taches'],
216+ ['tache-nouvelle', '/taches/nouvelle'],
217+ ids.todoEdit && ['tache-modifier', `/taches/${ids.todoEdit}/modifier`],
218+ ids.todoDone && ['tache-effectuee', `/taches/${ids.todoDone}/terminer`],
219+ ['parametres', '/parametres'],
220+ ['categories', '/parametres/categories'],
221+ ['equipes', '/temps/nouveau#equipes'],
222+ ].filter(Boolean);
223+ for (const [name, url] of screens) {
224+ await go(page, url);
225+ await full(page, lang, name);
226+ }
227+
228+ // Extraits recadrés, pris sur l'écran où l'élément vit.
229+ await go(page, `/stats?semaine=${prevWeek}`);
230+ await crop(page, lang, 'x-entete', '.app-header', 0);
231+ await crop(page, lang, 'x-scopes', '.scope-pills', 6);
232+ await crop(page, lang, 'x-legende', '.legend:not(.legend-people)', 10);
233+ await crop(page, lang, 'x-tabbar', '.tabbar', 0);
234+
235+ await go(page, '/temps/nouveau?mode=manuel');
236+ await crop(page, lang, 'x-categorie-pill', '.category-pick > a', 10);
237+
238+ if (ids.categorie) {
239+ await go(page, `/temps/nouveau?categorie=${ids.categorie}`);
240+ await crop(page, lang, 'x-stepper', '.stepper', 10);
241+ }
242+
243+ await go(page, '/taches');
244+ await crop(page, lang, 'x-todo-carte', '.todo-card', 10);
245+
246+ await go(page, '/parametres/categories');
247+ await crop(page, lang, 'x-groupe-carte', '.group-card', 10);
248+
249+ await go(page, '/parametres');
250+ await crop(page, lang, 'x-invitation', '.invite-card', 10);
251+
252+ // Minuteur : on le démarre, on capture, on l'abandonne.
253+ await go(page, '/temps/nouveau');
254+ const started = await page.evaluate(() => {
255+ const b = document.querySelector('.choice-timer');
256+ if (!b) return false;
257+ b.click();
258+ return true;
259+ });
260+ if (started) {
261+ await page.waitForNavigation({ waitUntil: 'networkidle0' });
262+ await go(page, '/temps/nouveau');
263+ await full(page, lang, 'minuteur');
264+ await go(page, '/stats');
265+ await crop(page, lang, 'x-bandeau-minuteur', '.timer-banner', 8);
266+ await go(page, '/temps/nouveau');
267+ await page.evaluate(() => {
268+ document.querySelector('form[action="/timer/abandonner"] button')?.click();
269+ });
270+ await page.waitForNavigation({ waitUntil: 'networkidle0' }).catch(() => {});
271+ } else {
272+ console.warn(`⚠ ${lang} : bouton minuteur introuvable`);
273+ }
274+
275+ // Stats de l'autre équipe (histoire « équipes »), puis retour à Maison.
276+ await switchTeam('Asso');
277+ await go(page, `/stats?semaine=${prevWeek}`);
278+ await full(page, lang, 'stats-asso');
279+ await switchTeam('Maison');
280+}
281+
282+// Le compte de démo repart en français.
283+await setLang('fr');
284+await browser.close();
285+console.log(`${written} fichiers écrits dans static/img/<langue>/`);
new file mode 100644
@@ -0,0 +1,285 @@
1+// Captures d'écran du site de documentation — Chrome headless via
2+// puppeteer-core, calqué sur docs/slides/demo/capture.mjs.
3+//
4+// Particularité : la documentation est trilingue, donc chaque écran est
5+// capturé trois fois, une par langue de l'utilisateur (la langue est un
6+// réglage de compte, pas du navigateur). Sortie dans static/img/<lang>/.
7+// Les pages anonymes (connexion, erreurs) sont toujours rendues dans la
8+// langue par défaut de l'instance : elles ne sont capturées qu'une fois et
9+// recopiées dans les trois dossiers.
10+//
11+// Prérequis : un serveur exego sur la base DEV, seedée par
12+// docs/slides/demo/seed.mjs, et les dépendances node d'a11y/.
13+//
14+// Usage :
15+// cd docs/site-documentation
16+// CHROME=/chemin/vers/chrome TT_USER=camille TT_PASS=… node shots.mjs
17+//
18+// Puis `./img.sh` encode les JPEG XL à côté des PNG.
19+
20+import { execSync } from 'node:child_process';
21+import { copyFileSync, mkdirSync, writeFileSync } from 'node:fs';
22+import { createRequire } from 'node:module';
23+import path from 'node:path';
24+import { fileURLToPath } from 'node:url';
25+
26+const require = createRequire(new URL('../../a11y/package.json', import.meta.url));
27+const puppeteer = require('puppeteer-core');
28+
29+const BASE = process.env.TT_URL ?? 'http://localhost:8090';
30+const USER = process.env.TT_USER;
31+const PASS = process.env.TT_PASS;
32+if (!USER || !PASS) {
33+ console.error('TT_USER et TT_PASS sont requis (compte de démo, jamais un compte réel).');
34+ process.exit(2);
35+}
36+const CHROME =
37+ process.env.CHROME ??
38+ execSync('command -v google-chrome-stable || command -v google-chrome || command -v chromium')
39+ .toString()
40+ .trim();
41+
42+const HERE = path.dirname(fileURLToPath(import.meta.url));
43+const IMG = path.join(HERE, 'static', 'img');
44+const LANGS = ['fr', 'en', 'de'];
45+for (const l of LANGS) mkdirSync(path.join(IMG, l), { recursive: true });
46+
47+// Semaine ISO précédente : toujours pleine, donc plus parlante que la semaine
48+// courante à peine entamée.
49+function isoWeekOf(date) {
50+ const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
51+ d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
52+ const jan1 = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
53+ const week = Math.ceil(((d - jan1) / 86_400_000 + 1) / 7);
54+ return `${d.getUTCFullYear()}-W${String(week).padStart(2, '0')}`;
55+}
56+const prevWeek = isoWeekOf(new Date(Date.now() - 7 * 86_400_000));
57+
58+const browser = await puppeteer.launch({
59+ executablePath: CHROME,
60+ headless: 'new',
61+ args: ['--no-sandbox', '--disable-dev-shm-usage'],
62+});
63+const viewport = { width: 390, height: 844, isMobile: true, hasTouch: true, deviceScaleFactor: 2 };
64+
65+// Les animations CSS sont figées à mi-course en headless : on les neutralise.
66+const FREEZE = '* { animation: none !important; transition: none !important; }';
67+
68+let written = 0;
69+async function full(pg, lang, name) {
70+ await pg.addStyleTag({ content: FREEZE });
71+ writeFileSync(path.join(IMG, lang, `${name}.png`), await pg.screenshot());
72+ written++;
73+}
74+
75+const wait = (ms) => new Promise((r) => setTimeout(r, ms));
76+
77+// Extrait recadré autour d'un élément, avec une marge (en pixels CSS).
78+// L'élément est d'abord ramené au centre de l'écran : sous la ligne de
79+// flottaison, la zone de découpe tomberait hors du rendu et sortirait vide.
80+async function crop(pg, lang, name, selector, pad = 8) {
81+ await pg.addStyleTag({ content: FREEZE });
82+ const el = await pg.$(selector);
83+ if (!el) {
84+ console.warn(`⚠ ${lang}/${name} : sélecteur « ${selector} » introuvable, extrait sauté`);
85+ return;
86+ }
87+ await el.evaluate((e) => e.scrollIntoView({ block: 'center', behavior: 'instant' }));
88+ await wait(120);
89+ const b = await el.boundingBox();
90+ if (!b) {
91+ console.warn(`⚠ ${lang}/${name} : élément invisible, extrait sauté`);
92+ return;
93+ }
94+ const clip = {
95+ x: Math.max(0, b.x - pad),
96+ y: Math.max(0, b.y - pad),
97+ width: Math.min(viewport.width, b.width + pad * 2),
98+ height: Math.min(viewport.height - Math.max(0, b.y - pad), b.height + pad * 2),
99+ };
100+ writeFileSync(path.join(IMG, lang, `${name}.png`), await pg.screenshot({ clip }));
101+ written++;
102+}
103+
104+// Le défilement par ancre (feuilles de détail, panneaux de groupe) est animé :
105+// sans pause, la capture attrape le carrousel entre deux panneaux.
106+async function go(pg, url) {
107+ await pg.goto(`${BASE}${url}`, { waitUntil: 'networkidle0' });
108+ if (url.includes('#')) await wait(700);
109+}
110+
111+// --- Écrans anonymes : une seule prise, recopiée dans les trois langues ----
112+{
113+ const anon = await browser.createBrowserContext();
114+ const pg = await anon.newPage();
115+ await pg.setViewport(viewport);
116+ await go(pg, '/login');
117+ await full(pg, LANGS[0], 'connexion');
118+ await go(pg, '/cette-page-nexiste-pas');
119+ await full(pg, LANGS[0], 'erreur-404');
120+ await anon.close();
121+ for (const l of LANGS.slice(1)) {
122+ for (const n of ['connexion', 'erreur-404']) {
123+ copyFileSync(path.join(IMG, LANGS[0], `${n}.png`), path.join(IMG, l, `${n}.png`));
124+ }
125+ }
126+}
127+
128+// --- Connexion ------------------------------------------------------------
129+const page = await browser.newPage();
130+await page.setViewport(viewport);
131+await go(page, '/login');
132+await page.type('input[name="username"]', USER);
133+await page.type('input[name="password"]', PASS);
134+await Promise.all([
135+ page.waitForNavigation({ waitUntil: 'networkidle0' }),
136+ page.click('button[type="submit"]'),
137+]);
138+if (page.url().includes('/login')) {
139+ console.error('Connexion échouée — vérifie TT_USER / TT_PASS.');
140+ await browser.close();
141+ process.exit(2);
142+}
143+
144+// Bascule de langue du compte (POST /parametres/langue).
145+async function setLang(lang) {
146+ await go(page, '/parametres');
147+ const ok = await page.evaluate((l) => {
148+ const input = document.querySelector(`form[action="/parametres/langue"] input[value="${l}"]`);
149+ if (!input) return false;
150+ input.form.querySelector('button[type="submit"]').click();
151+ return true;
152+ }, lang);
153+ if (!ok) throw new Error(`bascule de langue impossible vers ${lang}`);
154+ await page.waitForNavigation({ waitUntil: 'networkidle0' });
155+}
156+
157+// Bascule d'équipe par la feuille « Changer d'équipe ».
158+async function switchTeam(fragment) {
159+ await go(page, '/temps/nouveau#equipes');
160+ const ok = await page.evaluate((f) => {
161+ const btn = [...document.querySelectorAll('#equipes .team-choice')].find((b) =>
162+ b.textContent.includes(f),
163+ );
164+ if (!btn) return false;
165+ btn.click();
166+ return true;
167+ }, fragment);
168+ if (!ok) throw new Error(`équipe « ${fragment} » introuvable dans la feuille`);
169+ await page.waitForNavigation({ waitUntil: 'networkidle0' });
170+}
171+
172+// Identifiants dynamiques (catégorie, saisie, tâches, segment de stats).
173+async function discover() {
174+ return page.evaluate(async (statsUrl) => {
175+ const txt = (u) => fetch(u).then((r) => r.text());
176+ const step1 = await txt('/temps/nouveau?mode=manuel');
177+ const todos = await txt('/taches');
178+ const stats = await txt(statsUrl);
179+ const times = await txt('/temps');
180+ const before = (html, needle) => html.slice(0, html.indexOf(needle));
181+ const lastCat = (html) => html.match(/categorie=([0-9a-f-]{36})(?![\s\S]*categorie=)/)?.[1];
182+ return {
183+ // « Cuisine » : la catégorie la plus parlante de l'équipe Maison.
184+ categorie: lastCat(before(step1, 'Cuisine')) ?? step1.match(/categorie=([0-9a-f-]{36})/)?.[1],
185+ // Tâche avec un historique de complétions : la reprogrammation proposée
186+ // par l'écran « effectuée » a de quoi être crédible.
187+ todoDone: todos
188+ .slice(todos.indexOf('Sortir les poubelles'))
189+ .match(/\/taches\/([0-9a-f-]{36})\/terminer/)?.[1],
190+ todoEdit: todos
191+ .slice(todos.indexOf('Trier les papiers'))
192+ .match(/\/taches\/([0-9a-f-]{36})\/modifier/)?.[1],
193+ entree: times.match(/\/temps\/([0-9a-f-]{36})\/modifier/)?.[1],
194+ segment: stats.match(/href="#(d-sem-\d+-\d+)"/)?.[1],
195+ groupe: stats.match(/scope-pill" href="#(p-[1-9]\d*)"/)?.[1],
196+ };
197+ }, `/stats?semaine=${prevWeek}`);
198+}
199+
200+for (const lang of LANGS) {
201+ await setLang(lang);
202+ const ids = await discover();
203+ console.log(`— ${lang} :`, ids);
204+
205+ // Écrans pleins (équipe active : Maison).
206+ const screens = [
207+ ['ajouter-choix', '/temps/nouveau'],
208+ ['ajouter-categorie', '/temps/nouveau?mode=manuel'],
209+ ids.categorie && ['ajouter-duree', `/temps/nouveau?categorie=${ids.categorie}`],
210+ ['stats', `/stats?semaine=${prevWeek}`],
211+ ids.groupe && ['stats-groupe', `/stats?semaine=${prevWeek}#${ids.groupe}`],
212+ ids.segment && ['stats-detail', `/stats?semaine=${prevWeek}#${ids.segment}`],
213+ ['mes-temps', '/temps'],
214+ ids.entree && ['modifier-temps', `/temps/${ids.entree}/modifier`],
215+ ['taches', '/taches'],
216+ ['tache-nouvelle', '/taches/nouvelle'],
217+ ids.todoEdit && ['tache-modifier', `/taches/${ids.todoEdit}/modifier`],
218+ ids.todoDone && ['tache-effectuee', `/taches/${ids.todoDone}/terminer`],
219+ ['parametres', '/parametres'],
220+ ['categories', '/parametres/categories'],
221+ ['equipes', '/temps/nouveau#equipes'],
222+ ].filter(Boolean);
223+ for (const [name, url] of screens) {
224+ await go(page, url);
225+ await full(page, lang, name);
226+ }
227+
228+ // Extraits recadrés, pris sur l'écran où l'élément vit.
229+ await go(page, `/stats?semaine=${prevWeek}`);
230+ await crop(page, lang, 'x-entete', '.app-header', 0);
231+ await crop(page, lang, 'x-scopes', '.scope-pills', 6);
232+ await crop(page, lang, 'x-legende', '.legend:not(.legend-people)', 10);
233+ await crop(page, lang, 'x-tabbar', '.tabbar', 0);
234+
235+ await go(page, '/temps/nouveau?mode=manuel');
236+ await crop(page, lang, 'x-categorie-pill', '.category-pick > a', 10);
237+
238+ if (ids.categorie) {
239+ await go(page, `/temps/nouveau?categorie=${ids.categorie}`);
240+ await crop(page, lang, 'x-stepper', '.stepper', 10);
241+ }
242+
243+ await go(page, '/taches');
244+ await crop(page, lang, 'x-todo-carte', '.todo-card', 10);
245+
246+ await go(page, '/parametres/categories');
247+ await crop(page, lang, 'x-groupe-carte', '.group-card', 10);
248+
249+ await go(page, '/parametres');
250+ await crop(page, lang, 'x-invitation', '.invite-card', 10);
251+
252+ // Minuteur : on le démarre, on capture, on l'abandonne.
253+ await go(page, '/temps/nouveau');
254+ const started = await page.evaluate(() => {
255+ const b = document.querySelector('.choice-timer');
256+ if (!b) return false;
257+ b.click();
258+ return true;
259+ });
260+ if (started) {
261+ await page.waitForNavigation({ waitUntil: 'networkidle0' });
262+ await go(page, '/temps/nouveau');
263+ await full(page, lang, 'minuteur');
264+ await go(page, '/stats');
265+ await crop(page, lang, 'x-bandeau-minuteur', '.timer-banner', 8);
266+ await go(page, '/temps/nouveau');
267+ await page.evaluate(() => {
268+ document.querySelector('form[action="/timer/abandonner"] button')?.click();
269+ });
270+ await page.waitForNavigation({ waitUntil: 'networkidle0' }).catch(() => {});
271+ } else {
272+ console.warn(`⚠ ${lang} : bouton minuteur introuvable`);
273+ }
274+
275+ // Stats de l'autre équipe (histoire « équipes »), puis retour à Maison.
276+ await switchTeam('Asso');
277+ await go(page, `/stats?semaine=${prevWeek}`);
278+ await full(page, lang, 'stats-asso');
279+ await switchTeam('Maison');
280+}
281+
282+// Le compte de démo repart en français.
283+await setLang('fr');
284+await browser.close();
285+console.log(`${written} fichiers écrits dans static/img/<langue>/`);
added docs/site-documentation/static/doc.css +308 -0
new file mode 100644
@@ -0,0 +1,308 @@
1+/* ═══ Documentation d'Ex Ego ═══════════════════════════════════════════
2+ Les tokens sont ceux du thème « Organic » de l'application
3+ (assets/style.css). Comme les pages anonymes de l'app, la doc n'a qu'un
4+ seul thème : pas de bascule contraste élevé ici.
5+ Polices sous-ensemblées depuis docs/slides/fonts (OFL, cf. static/fonts).
6+ ═══════════════════════════════════════════════════════════════════════ */
7+
8+@font-face {
9+ font-family: "Caprasimo"; font-style: normal; font-weight: 400; font-display: swap;
10+ src: url("fonts/Caprasimo-Regular.woff2") format("woff2");
11+}
12+@font-face {
13+ font-family: "Figtree"; font-style: normal; font-weight: 400; font-display: swap;
14+ src: url("fonts/Figtree-400.woff2") format("woff2");
15+}
16+@font-face {
17+ font-family: "Figtree"; font-style: normal; font-weight: 600; font-display: swap;
18+ src: url("fonts/Figtree-600.woff2") format("woff2");
19+}
20+@font-face {
21+ font-family: "Figtree"; font-style: normal; font-weight: 700; font-display: swap;
22+ src: url("fonts/Figtree-700.woff2") format("woff2");
23+}
24+
25+:root {
26+ --color-bg: #f5ead8;
27+ --color-surface: #ebddc5;
28+ --color-text: #201e1d;
29+ --color-accent: #c67139;
30+ --color-accent-deep: #9c4f1d;
31+ --color-accent-2: #7a8a5e;
32+ --color-divider: color-mix(in srgb, #201e1d 16%, transparent);
33+
34+ --color-neutral-100: #f9f4ed;
35+ --color-neutral-200: #eee7db;
36+ --color-neutral-300: #dcd3c4;
37+ --color-neutral-500: #a19786;
38+ --color-neutral-800: #474238;
39+ --color-neutral-900: #2e2b25;
40+
41+ --color-accent-100: #fff2eb;
42+ --color-accent-200: #ffe1d0;
43+ --color-accent-300: #ffc6a5;
44+ --color-accent-600: #b2622d;
45+ --color-accent-700: #8c491a;
46+ --color-accent-2-200: #e1eecc;
47+ --color-accent-2-900: #272e1b;
48+
49+ --font-heading: "Caprasimo", system-ui, sans-serif;
50+ --font-body: "Figtree", system-ui, sans-serif;
51+
52+ --space-2: 8.8px;
53+ --space-3: 13.2px;
54+ --space-4: 17.6px;
55+ --space-6: 26.4px;
56+ --space-8: 35.2px;
57+
58+ --radius-sm: 8px;
59+ --radius-md: 16px;
60+ --radius-lg: 28px;
61+
62+ --shadow-sm: 0 1px 2px color-mix(in srgb, #2e2b25 14%, transparent);
63+ --shadow-md: 0 3px 10px color-mix(in srgb, #2e2b25 16%, transparent);
64+ --shadow-lg: 0 12px 32px color-mix(in srgb, #2e2b25 22%, transparent);
65+
66+ --measure: 34rem;
67+}
68+
69+*, *::before, *::after { box-sizing: border-box; }
70+
71+body {
72+ margin: 0;
73+ background: var(--color-bg);
74+ color: var(--color-text);
75+ font-family: var(--font-body);
76+ font-size: 17px;
77+ line-height: 1.65;
78+ -webkit-text-size-adjust: 100%;
79+}
80+
81+a { color: var(--color-accent-700); }
82+a:hover { color: var(--color-accent-600); }
83+:focus-visible {
84+ outline: 3px solid var(--color-accent);
85+ outline-offset: 2px;
86+ border-radius: 4px;
87+}
88+
89+.skip {
90+ position: absolute; left: -9999px; top: 0; z-index: 10;
91+ background: var(--color-accent-deep); color: var(--color-neutral-100);
92+ padding: var(--space-3) var(--space-4); border-radius: 0 0 var(--radius-sm) 0;
93+ text-decoration: none;
94+}
95+.skip:focus { left: 0; }
96+
97+/* ─── en-tête ─── */
98+.top {
99+ position: sticky; top: 0; z-index: 5;
100+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-4);
101+ padding: var(--space-3) var(--space-4);
102+ background: var(--color-surface);
103+ border-bottom: 1px solid var(--color-divider);
104+}
105+.brand {
106+ display: flex; align-items: center; gap: var(--space-2); min-width: 0;
107+ color: var(--color-text); text-decoration: none;
108+ font-family: var(--font-heading); font-size: .92rem; line-height: 1.15;
109+}
110+.brand img { display: block; flex: none; }
111+@media (min-width: 44rem) { .brand { font-size: 1.05rem; } }
112+
113+.langs { display: flex; gap: 4px; flex: none; }
114+.lang {
115+ display: inline-flex; align-items: center; justify-content: center;
116+ min-height: 32px; min-width: 40px;
117+ padding: 2px var(--space-3);
118+ border-radius: 999px; text-decoration: none; font-size: .88rem; font-weight: 600;
119+ color: var(--color-accent-700);
120+}
121+.lang:hover { background: var(--color-accent-200); }
122+.lang.is-on {
123+ background: var(--color-accent-deep); color: var(--color-neutral-100);
124+}
125+.lang.is-off { color: var(--color-neutral-500); }
126+/* Sur petit écran, les noms de langue deviennent des codes de deux lettres. */
127+.l-long { display: none; }
128+@media (min-width: 44rem) {
129+ .l-long { display: inline; }
130+ .l-short { display: none; }
131+}
132+
133+/* ─── charpente ─── */
134+.layout {
135+ max-width: 56rem; margin: 0 auto;
136+ padding: var(--space-4);
137+ display: grid; gap: var(--space-8);
138+ grid-template-columns: 1fr;
139+ grid-template-areas: "main" "side";
140+}
141+main { min-width: 0; grid-area: main; }
142+.side { grid-area: side; }
143+
144+/* ─── sommaire ─── */
145+.to-toc {
146+ display: inline-block; margin-bottom: var(--space-4);
147+ font-size: .9rem; font-weight: 600;
148+}
149+.side {
150+ background: var(--color-neutral-100);
151+ border: 1px solid var(--color-divider);
152+ border-radius: var(--radius-md);
153+ padding: var(--space-3) var(--space-4);
154+}
155+.side-head {
156+ margin: 0 0 var(--space-2); font-weight: 700; font-size: .95rem;
157+}
158+.side ul { list-style: none; margin: 0 0 var(--space-3); padding: 0; }
159+.side li { margin: 0; }
160+.side a {
161+ display: block; padding: 6px var(--space-2);
162+ border-radius: var(--radius-sm);
163+ text-decoration: none; color: var(--color-neutral-800); font-size: .95rem;
164+}
165+.side a:hover { background: var(--color-accent-100); color: var(--color-accent-700); }
166+.side a.is-on {
167+ background: var(--color-accent-200); color: var(--color-accent-700); font-weight: 600;
168+}
169+.side-top { margin-bottom: var(--space-2); font-weight: 600; }
170+.side-title {
171+ margin: var(--space-3) 0 4px; padding: 0 var(--space-2);
172+ font-family: var(--font-heading); font-size: .95rem; color: var(--color-accent-2-900);
173+}
174+
175+@media (min-width: 56rem) {
176+ .layout {
177+ grid-template-columns: 14rem minmax(0, 1fr);
178+ grid-template-areas: "side main";
179+ gap: var(--space-8); align-items: start;
180+ }
181+ .side {
182+ position: sticky; top: 4.6rem;
183+ border: 0; background: transparent; padding: 0;
184+ }
185+ .side-head, .to-toc { display: none; }
186+}
187+
188+/* ─── prose ─── */
189+.prose { max-width: var(--measure); }
190+.prose h1 {
191+ font-family: var(--font-heading); font-weight: 400; line-height: 1.15;
192+ font-size: 2rem; margin: 0 0 var(--space-3);
193+}
194+.prose h2 {
195+ font-family: var(--font-heading); font-weight: 400; line-height: 1.2;
196+ font-size: 1.4rem; margin: var(--space-8) 0 var(--space-2);
197+}
198+.prose h3 {
199+ font-size: 1.08rem; font-weight: 700; margin: var(--space-6) 0 var(--space-2);
200+}
201+.prose p { margin: 0 0 var(--space-4); }
202+.lede {
203+ font-size: 1.12rem; color: var(--color-neutral-800);
204+ border-left: 4px solid var(--color-accent-300);
205+ padding-left: var(--space-4);
206+}
207+.prose blockquote {
208+ margin: var(--space-6) 0; padding: var(--space-4) var(--space-6);
209+ background: var(--color-accent-2-200);
210+ border-radius: var(--radius-md);
211+ font-size: 1.02rem;
212+}
213+.prose blockquote p:last-child { margin: 0; }
214+.prose ul, .prose ol { margin: 0 0 var(--space-4); padding-left: var(--space-6); }
215+.prose li { margin: 0 0 var(--space-2); }
216+.prose code {
217+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .9em;
218+ background: var(--color-neutral-200); padding: 1px 5px; border-radius: 5px;
219+}
220+.prose pre {
221+ background: var(--color-neutral-900); color: var(--color-neutral-100);
222+ padding: var(--space-4); border-radius: var(--radius-md); overflow-x: auto;
223+}
224+.prose pre code { background: none; color: inherit; padding: 0; }
225+.prose hr { border: 0; border-top: 1px solid var(--color-divider); margin: var(--space-8) 0; }
226+.prose table { border-collapse: collapse; width: 100%; font-size: .95rem; }
227+.prose th, .prose td {
228+ text-align: left; padding: var(--space-2) var(--space-3);
229+ border-bottom: 1px solid var(--color-divider); vertical-align: top;
230+}
231+
232+/* ─── figures ─── */
233+figure { margin: var(--space-6) 0; }
234+figure img { display: block; max-width: 100%; height: auto; }
235+figcaption {
236+ margin-top: var(--space-2); font-size: .9rem; color: var(--color-neutral-800);
237+}
238+.shot img {
239+ width: 100%; max-width: 300px;
240+ border-radius: var(--radius-lg);
241+ box-shadow: var(--shadow-lg);
242+ background: var(--color-surface);
243+}
244+.extrait img {
245+ width: 100%; max-width: 380px;
246+ border-radius: var(--radius-md);
247+ box-shadow: var(--shadow-md);
248+}
249+.duo > div { display: flex; flex-wrap: wrap; gap: var(--space-4); }
250+.duo img {
251+ width: 100%; max-width: 250px;
252+ border-radius: var(--radius-lg);
253+ box-shadow: var(--shadow-lg);
254+}
255+
256+/* ─── aparté ─── */
257+.apart {
258+ margin: var(--space-6) 0; padding: var(--space-4) var(--space-6);
259+ background: var(--color-accent-100);
260+ border-left: 4px solid var(--color-accent-300);
261+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
262+}
263+.apart-t { margin: 0 0 var(--space-2); font-weight: 700; }
264+.apart p:last-child { margin: 0; }
265+
266+/* ─── cartes de section ─── */
267+.cards { display: grid; gap: var(--space-3); margin: var(--space-6) 0; }
268+.card {
269+ display: block; padding: var(--space-4);
270+ background: var(--color-neutral-100);
271+ border: 1px solid var(--color-divider);
272+ border-radius: var(--radius-md);
273+ text-decoration: none; color: var(--color-text);
274+ box-shadow: var(--shadow-sm);
275+}
276+.card:hover { border-color: var(--color-accent-300); background: var(--color-accent-100); }
277+.card-title {
278+ display: block; font-family: var(--font-heading); font-size: 1.1rem;
279+ color: var(--color-accent-700);
280+}
281+.card-desc { display: block; margin-top: 4px; color: var(--color-neutral-800); font-size: .95rem; }
282+
283+/* ─── pagination ─── */
284+.pager {
285+ display: flex; justify-content: space-between; gap: var(--space-4);
286+ margin-top: var(--space-8); padding-top: var(--space-4);
287+ border-top: 1px solid var(--color-divider);
288+}
289+.pager a {
290+ flex: 1; padding: var(--space-3) var(--space-4);
291+ background: var(--color-neutral-100);
292+ border: 1px solid var(--color-divider); border-radius: var(--radius-md);
293+ text-decoration: none; font-weight: 600;
294+}
295+.pager .next { text-align: right; }
296+.pager a span {
297+ display: block; font-size: .8rem; font-weight: 400; color: var(--color-neutral-800);
298+}
299+
300+/* ─── pied ─── */
301+.foot {
302+ margin-top: var(--space-8);
303+ padding: var(--space-6) var(--space-4);
304+ background: var(--color-surface);
305+ border-top: 1px solid var(--color-divider);
306+ font-size: .92rem;
307+}
308+.foot p { max-width: 68rem; margin: 0 auto; }
new file mode 100644
@@ -0,0 +1,308 @@
1+/* ═══ Documentation d'Ex Ego ═══════════════════════════════════════════
2+ Les tokens sont ceux du thème « Organic » de l'application
3+ (assets/style.css). Comme les pages anonymes de l'app, la doc n'a qu'un
4+ seul thème : pas de bascule contraste élevé ici.
5+ Polices sous-ensemblées depuis docs/slides/fonts (OFL, cf. static/fonts).
6+ ═══════════════════════════════════════════════════════════════════════ */
7+
8+@font-face {
9+ font-family: "Caprasimo"; font-style: normal; font-weight: 400; font-display: swap;
10+ src: url("fonts/Caprasimo-Regular.woff2") format("woff2");
11+}
12+@font-face {
13+ font-family: "Figtree"; font-style: normal; font-weight: 400; font-display: swap;
14+ src: url("fonts/Figtree-400.woff2") format("woff2");
15+}
16+@font-face {
17+ font-family: "Figtree"; font-style: normal; font-weight: 600; font-display: swap;
18+ src: url("fonts/Figtree-600.woff2") format("woff2");
19+}
20+@font-face {
21+ font-family: "Figtree"; font-style: normal; font-weight: 700; font-display: swap;
22+ src: url("fonts/Figtree-700.woff2") format("woff2");
23+}
24+
25+:root {
26+ --color-bg: #f5ead8;
27+ --color-surface: #ebddc5;
28+ --color-text: #201e1d;
29+ --color-accent: #c67139;
30+ --color-accent-deep: #9c4f1d;
31+ --color-accent-2: #7a8a5e;
32+ --color-divider: color-mix(in srgb, #201e1d 16%, transparent);
33+
34+ --color-neutral-100: #f9f4ed;
35+ --color-neutral-200: #eee7db;
36+ --color-neutral-300: #dcd3c4;
37+ --color-neutral-500: #a19786;
38+ --color-neutral-800: #474238;
39+ --color-neutral-900: #2e2b25;
40+
41+ --color-accent-100: #fff2eb;
42+ --color-accent-200: #ffe1d0;
43+ --color-accent-300: #ffc6a5;
44+ --color-accent-600: #b2622d;
45+ --color-accent-700: #8c491a;
46+ --color-accent-2-200: #e1eecc;
47+ --color-accent-2-900: #272e1b;
48+
49+ --font-heading: "Caprasimo", system-ui, sans-serif;
50+ --font-body: "Figtree", system-ui, sans-serif;
51+
52+ --space-2: 8.8px;
53+ --space-3: 13.2px;
54+ --space-4: 17.6px;
55+ --space-6: 26.4px;
56+ --space-8: 35.2px;
57+
58+ --radius-sm: 8px;
59+ --radius-md: 16px;
60+ --radius-lg: 28px;
61+
62+ --shadow-sm: 0 1px 2px color-mix(in srgb, #2e2b25 14%, transparent);
63+ --shadow-md: 0 3px 10px color-mix(in srgb, #2e2b25 16%, transparent);
64+ --shadow-lg: 0 12px 32px color-mix(in srgb, #2e2b25 22%, transparent);
65+
66+ --measure: 34rem;
67+}
68+
69+*, *::before, *::after { box-sizing: border-box; }
70+
71+body {
72+ margin: 0;
73+ background: var(--color-bg);
74+ color: var(--color-text);
75+ font-family: var(--font-body);
76+ font-size: 17px;
77+ line-height: 1.65;
78+ -webkit-text-size-adjust: 100%;
79+}
80+
81+a { color: var(--color-accent-700); }
82+a:hover { color: var(--color-accent-600); }
83+:focus-visible {
84+ outline: 3px solid var(--color-accent);
85+ outline-offset: 2px;
86+ border-radius: 4px;
87+}
88+
89+.skip {
90+ position: absolute; left: -9999px; top: 0; z-index: 10;
91+ background: var(--color-accent-deep); color: var(--color-neutral-100);
92+ padding: var(--space-3) var(--space-4); border-radius: 0 0 var(--radius-sm) 0;
93+ text-decoration: none;
94+}
95+.skip:focus { left: 0; }
96+
97+/* ─── en-tête ─── */
98+.top {
99+ position: sticky; top: 0; z-index: 5;
100+ display: flex; align-items: center; justify-content: space-between; gap: var(--space-4);
101+ padding: var(--space-3) var(--space-4);
102+ background: var(--color-surface);
103+ border-bottom: 1px solid var(--color-divider);
104+}
105+.brand {
106+ display: flex; align-items: center; gap: var(--space-2); min-width: 0;
107+ color: var(--color-text); text-decoration: none;
108+ font-family: var(--font-heading); font-size: .92rem; line-height: 1.15;
109+}
110+.brand img { display: block; flex: none; }
111+@media (min-width: 44rem) { .brand { font-size: 1.05rem; } }
112+
113+.langs { display: flex; gap: 4px; flex: none; }
114+.lang {
115+ display: inline-flex; align-items: center; justify-content: center;
116+ min-height: 32px; min-width: 40px;
117+ padding: 2px var(--space-3);
118+ border-radius: 999px; text-decoration: none; font-size: .88rem; font-weight: 600;
119+ color: var(--color-accent-700);
120+}
121+.lang:hover { background: var(--color-accent-200); }
122+.lang.is-on {
123+ background: var(--color-accent-deep); color: var(--color-neutral-100);
124+}
125+.lang.is-off { color: var(--color-neutral-500); }
126+/* Sur petit écran, les noms de langue deviennent des codes de deux lettres. */
127+.l-long { display: none; }
128+@media (min-width: 44rem) {
129+ .l-long { display: inline; }
130+ .l-short { display: none; }
131+}
132+
133+/* ─── charpente ─── */
134+.layout {
135+ max-width: 56rem; margin: 0 auto;
136+ padding: var(--space-4);
137+ display: grid; gap: var(--space-8);
138+ grid-template-columns: 1fr;
139+ grid-template-areas: "main" "side";
140+}
141+main { min-width: 0; grid-area: main; }
142+.side { grid-area: side; }
143+
144+/* ─── sommaire ─── */
145+.to-toc {
146+ display: inline-block; margin-bottom: var(--space-4);
147+ font-size: .9rem; font-weight: 600;
148+}
149+.side {
150+ background: var(--color-neutral-100);
151+ border: 1px solid var(--color-divider);
152+ border-radius: var(--radius-md);
153+ padding: var(--space-3) var(--space-4);
154+}
155+.side-head {
156+ margin: 0 0 var(--space-2); font-weight: 700; font-size: .95rem;
157+}
158+.side ul { list-style: none; margin: 0 0 var(--space-3); padding: 0; }
159+.side li { margin: 0; }
160+.side a {
161+ display: block; padding: 6px var(--space-2);
162+ border-radius: var(--radius-sm);
163+ text-decoration: none; color: var(--color-neutral-800); font-size: .95rem;
164+}
165+.side a:hover { background: var(--color-accent-100); color: var(--color-accent-700); }
166+.side a.is-on {
167+ background: var(--color-accent-200); color: var(--color-accent-700); font-weight: 600;
168+}
169+.side-top { margin-bottom: var(--space-2); font-weight: 600; }
170+.side-title {
171+ margin: var(--space-3) 0 4px; padding: 0 var(--space-2);
172+ font-family: var(--font-heading); font-size: .95rem; color: var(--color-accent-2-900);
173+}
174+
175+@media (min-width: 56rem) {
176+ .layout {
177+ grid-template-columns: 14rem minmax(0, 1fr);
178+ grid-template-areas: "side main";
179+ gap: var(--space-8); align-items: start;
180+ }
181+ .side {
182+ position: sticky; top: 4.6rem;
183+ border: 0; background: transparent; padding: 0;
184+ }
185+ .side-head, .to-toc { display: none; }
186+}
187+
188+/* ─── prose ─── */
189+.prose { max-width: var(--measure); }
190+.prose h1 {
191+ font-family: var(--font-heading); font-weight: 400; line-height: 1.15;
192+ font-size: 2rem; margin: 0 0 var(--space-3);
193+}
194+.prose h2 {
195+ font-family: var(--font-heading); font-weight: 400; line-height: 1.2;
196+ font-size: 1.4rem; margin: var(--space-8) 0 var(--space-2);
197+}
198+.prose h3 {
199+ font-size: 1.08rem; font-weight: 700; margin: var(--space-6) 0 var(--space-2);
200+}
201+.prose p { margin: 0 0 var(--space-4); }
202+.lede {
203+ font-size: 1.12rem; color: var(--color-neutral-800);
204+ border-left: 4px solid var(--color-accent-300);
205+ padding-left: var(--space-4);
206+}
207+.prose blockquote {
208+ margin: var(--space-6) 0; padding: var(--space-4) var(--space-6);
209+ background: var(--color-accent-2-200);
210+ border-radius: var(--radius-md);
211+ font-size: 1.02rem;
212+}
213+.prose blockquote p:last-child { margin: 0; }
214+.prose ul, .prose ol { margin: 0 0 var(--space-4); padding-left: var(--space-6); }
215+.prose li { margin: 0 0 var(--space-2); }
216+.prose code {
217+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .9em;
218+ background: var(--color-neutral-200); padding: 1px 5px; border-radius: 5px;
219+}
220+.prose pre {
221+ background: var(--color-neutral-900); color: var(--color-neutral-100);
222+ padding: var(--space-4); border-radius: var(--radius-md); overflow-x: auto;
223+}
224+.prose pre code { background: none; color: inherit; padding: 0; }
225+.prose hr { border: 0; border-top: 1px solid var(--color-divider); margin: var(--space-8) 0; }
226+.prose table { border-collapse: collapse; width: 100%; font-size: .95rem; }
227+.prose th, .prose td {
228+ text-align: left; padding: var(--space-2) var(--space-3);
229+ border-bottom: 1px solid var(--color-divider); vertical-align: top;
230+}
231+
232+/* ─── figures ─── */
233+figure { margin: var(--space-6) 0; }
234+figure img { display: block; max-width: 100%; height: auto; }
235+figcaption {
236+ margin-top: var(--space-2); font-size: .9rem; color: var(--color-neutral-800);
237+}
238+.shot img {
239+ width: 100%; max-width: 300px;
240+ border-radius: var(--radius-lg);
241+ box-shadow: var(--shadow-lg);
242+ background: var(--color-surface);
243+}
244+.extrait img {
245+ width: 100%; max-width: 380px;
246+ border-radius: var(--radius-md);
247+ box-shadow: var(--shadow-md);
248+}
249+.duo > div { display: flex; flex-wrap: wrap; gap: var(--space-4); }
250+.duo img {
251+ width: 100%; max-width: 250px;
252+ border-radius: var(--radius-lg);
253+ box-shadow: var(--shadow-lg);
254+}
255+
256+/* ─── aparté ─── */
257+.apart {
258+ margin: var(--space-6) 0; padding: var(--space-4) var(--space-6);
259+ background: var(--color-accent-100);
260+ border-left: 4px solid var(--color-accent-300);
261+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
262+}
263+.apart-t { margin: 0 0 var(--space-2); font-weight: 700; }
264+.apart p:last-child { margin: 0; }
265+
266+/* ─── cartes de section ─── */
267+.cards { display: grid; gap: var(--space-3); margin: var(--space-6) 0; }
268+.card {
269+ display: block; padding: var(--space-4);
270+ background: var(--color-neutral-100);
271+ border: 1px solid var(--color-divider);
272+ border-radius: var(--radius-md);
273+ text-decoration: none; color: var(--color-text);
274+ box-shadow: var(--shadow-sm);
275+}
276+.card:hover { border-color: var(--color-accent-300); background: var(--color-accent-100); }
277+.card-title {
278+ display: block; font-family: var(--font-heading); font-size: 1.1rem;
279+ color: var(--color-accent-700);
280+}
281+.card-desc { display: block; margin-top: 4px; color: var(--color-neutral-800); font-size: .95rem; }
282+
283+/* ─── pagination ─── */
284+.pager {
285+ display: flex; justify-content: space-between; gap: var(--space-4);
286+ margin-top: var(--space-8); padding-top: var(--space-4);
287+ border-top: 1px solid var(--color-divider);
288+}
289+.pager a {
290+ flex: 1; padding: var(--space-3) var(--space-4);
291+ background: var(--color-neutral-100);
292+ border: 1px solid var(--color-divider); border-radius: var(--radius-md);
293+ text-decoration: none; font-weight: 600;
294+}
295+.pager .next { text-align: right; }
296+.pager a span {
297+ display: block; font-size: .8rem; font-weight: 400; color: var(--color-neutral-800);
298+}
299+
300+/* ─── pied ─── */
301+.foot {
302+ margin-top: var(--space-8);
303+ padding: var(--space-6) var(--space-4);
304+ background: var(--color-surface);
305+ border-top: 1px solid var(--color-divider);
306+ font-size: .92rem;
307+}
308+.foot p { max-width: 68rem; margin: 0 auto; }
added docs/site-documentation/static/fonts/Caprasimo-Regular.woff2 +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Caprasimo-Regular.woff2 differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Caprasimo-Regular.woff2 differBinary files /dev/null and b/docs/site-documentation/static/fonts/Caprasimo-Regular.woff2 differ
added docs/site-documentation/static/fonts/Figtree-400.woff2 +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-400.woff2 differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-400.woff2 differBinary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-400.woff2 differ
added docs/site-documentation/static/fonts/Figtree-600.woff2 +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-600.woff2 differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-600.woff2 differBinary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-600.woff2 differ
added docs/site-documentation/static/fonts/Figtree-700.woff2 +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-700.woff2 differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-700.woff2 differBinary files /dev/null and b/docs/site-documentation/static/fonts/Figtree-700.woff2 differ
added docs/site-documentation/static/fonts/OFL-Caprasimo.txt +93 -0
new file mode 100644
@@ -0,0 +1,93 @@
1+Copyright 2023 The Caprasimo Project Authors (https://github.com/docrepair-fonts/caprasimo-fonts).
2+
3+This Font Software is licensed under the SIL Open Font License, Version 1.1.
4+This license is copied below, and is also available with a FAQ at:
5+https://scripts.sil.org/OFL
6+
7+
8+-----------------------------------------------------------
9+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10+-----------------------------------------------------------
11+
12+PREAMBLE
13+The goals of the Open Font License (OFL) are to stimulate worldwide
14+development of collaborative font projects, to support the font creation
15+efforts of academic and linguistic communities, and to provide a free and
16+open framework in which fonts may be shared and improved in partnership
17+with others.
18+
19+The OFL allows the licensed fonts to be used, studied, modified and
20+redistributed freely as long as they are not sold by themselves. The
21+fonts, including any derivative works, can be bundled, embedded,
22+redistributed and/or sold with any software provided that any reserved
23+names are not used by derivative works. The fonts and derivatives,
24+however, cannot be released under any other type of license. The
25+requirement for fonts to remain under this license does not apply
26+to any document created using the fonts or their derivatives.
27+
28+DEFINITIONS
29+"Font Software" refers to the set of files released by the Copyright
30+Holder(s) under this license and clearly marked as such. This may
31+include source files, build scripts and documentation.
32+
33+"Reserved Font Name" refers to any names specified as such after the
34+copyright statement(s).
35+
36+"Original Version" refers to the collection of Font Software components as
37+distributed by the Copyright Holder(s).
38+
39+"Modified Version" refers to any derivative made by adding to, deleting,
40+or substituting -- in part or in whole -- any of the components of the
41+Original Version, by changing formats or by porting the Font Software to a
42+new environment.
43+
44+"Author" refers to any designer, engineer, programmer, technical
45+writer or other person who contributed to the Font Software.
46+
47+PERMISSION & CONDITIONS
48+Permission is hereby granted, free of charge, to any person obtaining
49+a copy of the Font Software, to use, study, copy, merge, embed, modify,
50+redistribute, and sell modified and unmodified copies of the Font
51+Software, subject to the following conditions:
52+
53+1) Neither the Font Software nor any of its individual components,
54+in Original or Modified Versions, may be sold by itself.
55+
56+2) Original or Modified Versions of the Font Software may be bundled,
57+redistributed and/or sold with any software, provided that each copy
58+contains the above copyright notice and this license. These can be
59+included either as stand-alone text files, human-readable headers or
60+in the appropriate machine-readable metadata fields within text or
61+binary files as long as those fields can be easily viewed by the user.
62+
63+3) No Modified Version of the Font Software may use the Reserved Font
64+Name(s) unless explicit written permission is granted by the corresponding
65+Copyright Holder. This restriction only applies to the primary font name as
66+presented to the users.
67+
68+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69+Software shall not be used to promote, endorse or advertise any
70+Modified Version, except to acknowledge the contribution(s) of the
71+Copyright Holder(s) and the Author(s) or with their explicit written
72+permission.
73+
74+5) The Font Software, modified or unmodified, in part or in whole,
75+must be distributed entirely under this license, and must not be
76+distributed under any other license. The requirement for fonts to
77+remain under this license does not apply to any document created
78+using the Font Software.
79+
80+TERMINATION
81+This license becomes null and void if any of the above conditions are
82+not met.
83+
84+DISCLAIMER
85+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93+OTHER DEALINGS IN THE FONT SOFTWARE.
new file mode 100644
@@ -0,0 +1,93 @@
1+Copyright 2023 The Caprasimo Project Authors (https://github.com/docrepair-fonts/caprasimo-fonts).
2+
3+This Font Software is licensed under the SIL Open Font License, Version 1.1.
4+This license is copied below, and is also available with a FAQ at:
5+https://scripts.sil.org/OFL
6+
7+
8+-----------------------------------------------------------
9+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10+-----------------------------------------------------------
11+
12+PREAMBLE
13+The goals of the Open Font License (OFL) are to stimulate worldwide
14+development of collaborative font projects, to support the font creation
15+efforts of academic and linguistic communities, and to provide a free and
16+open framework in which fonts may be shared and improved in partnership
17+with others.
18+
19+The OFL allows the licensed fonts to be used, studied, modified and
20+redistributed freely as long as they are not sold by themselves. The
21+fonts, including any derivative works, can be bundled, embedded,
22+redistributed and/or sold with any software provided that any reserved
23+names are not used by derivative works. The fonts and derivatives,
24+however, cannot be released under any other type of license. The
25+requirement for fonts to remain under this license does not apply
26+to any document created using the fonts or their derivatives.
27+
28+DEFINITIONS
29+"Font Software" refers to the set of files released by the Copyright
30+Holder(s) under this license and clearly marked as such. This may
31+include source files, build scripts and documentation.
32+
33+"Reserved Font Name" refers to any names specified as such after the
34+copyright statement(s).
35+
36+"Original Version" refers to the collection of Font Software components as
37+distributed by the Copyright Holder(s).
38+
39+"Modified Version" refers to any derivative made by adding to, deleting,
40+or substituting -- in part or in whole -- any of the components of the
41+Original Version, by changing formats or by porting the Font Software to a
42+new environment.
43+
44+"Author" refers to any designer, engineer, programmer, technical
45+writer or other person who contributed to the Font Software.
46+
47+PERMISSION & CONDITIONS
48+Permission is hereby granted, free of charge, to any person obtaining
49+a copy of the Font Software, to use, study, copy, merge, embed, modify,
50+redistribute, and sell modified and unmodified copies of the Font
51+Software, subject to the following conditions:
52+
53+1) Neither the Font Software nor any of its individual components,
54+in Original or Modified Versions, may be sold by itself.
55+
56+2) Original or Modified Versions of the Font Software may be bundled,
57+redistributed and/or sold with any software, provided that each copy
58+contains the above copyright notice and this license. These can be
59+included either as stand-alone text files, human-readable headers or
60+in the appropriate machine-readable metadata fields within text or
61+binary files as long as those fields can be easily viewed by the user.
62+
63+3) No Modified Version of the Font Software may use the Reserved Font
64+Name(s) unless explicit written permission is granted by the corresponding
65+Copyright Holder. This restriction only applies to the primary font name as
66+presented to the users.
67+
68+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69+Software shall not be used to promote, endorse or advertise any
70+Modified Version, except to acknowledge the contribution(s) of the
71+Copyright Holder(s) and the Author(s) or with their explicit written
72+permission.
73+
74+5) The Font Software, modified or unmodified, in part or in whole,
75+must be distributed entirely under this license, and must not be
76+distributed under any other license. The requirement for fonts to
77+remain under this license does not apply to any document created
78+using the Font Software.
79+
80+TERMINATION
81+This license becomes null and void if any of the above conditions are
82+not met.
83+
84+DISCLAIMER
85+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93+OTHER DEALINGS IN THE FONT SOFTWARE.
added docs/site-documentation/static/fonts/OFL-Figtree.txt +93 -0
new file mode 100644
@@ -0,0 +1,93 @@
1+Copyright 2022 The Figtree Project Authors (https://github.com/erikdkennedy/figtree)
2+
3+This Font Software is licensed under the SIL Open Font License, Version 1.1.
4+This license is copied below, and is also available with a FAQ at:
5+http://scripts.sil.org/OFL
6+
7+
8+-----------------------------------------------------------
9+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10+-----------------------------------------------------------
11+
12+PREAMBLE
13+The goals of the Open Font License (OFL) are to stimulate worldwide
14+development of collaborative font projects, to support the font creation
15+efforts of academic and linguistic communities, and to provide a free and
16+open framework in which fonts may be shared and improved in partnership
17+with others.
18+
19+The OFL allows the licensed fonts to be used, studied, modified and
20+redistributed freely as long as they are not sold by themselves. The
21+fonts, including any derivative works, can be bundled, embedded,
22+redistributed and/or sold with any software provided that any reserved
23+names are not used by derivative works. The fonts and derivatives,
24+however, cannot be released under any other type of license. The
25+requirement for fonts to remain under this license does not apply
26+to any document created using the fonts or their derivatives.
27+
28+DEFINITIONS
29+"Font Software" refers to the set of files released by the Copyright
30+Holder(s) under this license and clearly marked as such. This may
31+include source files, build scripts and documentation.
32+
33+"Reserved Font Name" refers to any names specified as such after the
34+copyright statement(s).
35+
36+"Original Version" refers to the collection of Font Software components as
37+distributed by the Copyright Holder(s).
38+
39+"Modified Version" refers to any derivative made by adding to, deleting,
40+or substituting -- in part or in whole -- any of the components of the
41+Original Version, by changing formats or by porting the Font Software to a
42+new environment.
43+
44+"Author" refers to any designer, engineer, programmer, technical
45+writer or other person who contributed to the Font Software.
46+
47+PERMISSION & CONDITIONS
48+Permission is hereby granted, free of charge, to any person obtaining
49+a copy of the Font Software, to use, study, copy, merge, embed, modify,
50+redistribute, and sell modified and unmodified copies of the Font
51+Software, subject to the following conditions:
52+
53+1) Neither the Font Software nor any of its individual components,
54+in Original or Modified Versions, may be sold by itself.
55+
56+2) Original or Modified Versions of the Font Software may be bundled,
57+redistributed and/or sold with any software, provided that each copy
58+contains the above copyright notice and this license. These can be
59+included either as stand-alone text files, human-readable headers or
60+in the appropriate machine-readable metadata fields within text or
61+binary files as long as those fields can be easily viewed by the user.
62+
63+3) No Modified Version of the Font Software may use the Reserved Font
64+Name(s) unless explicit written permission is granted by the corresponding
65+Copyright Holder. This restriction only applies to the primary font name as
66+presented to the users.
67+
68+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69+Software shall not be used to promote, endorse or advertise any
70+Modified Version, except to acknowledge the contribution(s) of the
71+Copyright Holder(s) and the Author(s) or with their explicit written
72+permission.
73+
74+5) The Font Software, modified or unmodified, in part or in whole,
75+must be distributed entirely under this license, and must not be
76+distributed under any other license. The requirement for fonts to
77+remain under this license does not apply to any document created
78+using the Font Software.
79+
80+TERMINATION
81+This license becomes null and void if any of the above conditions are
82+not met.
83+
84+DISCLAIMER
85+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93+OTHER DEALINGS IN THE FONT SOFTWARE.
new file mode 100644
@@ -0,0 +1,93 @@
1+Copyright 2022 The Figtree Project Authors (https://github.com/erikdkennedy/figtree)
2+
3+This Font Software is licensed under the SIL Open Font License, Version 1.1.
4+This license is copied below, and is also available with a FAQ at:
5+http://scripts.sil.org/OFL
6+
7+
8+-----------------------------------------------------------
9+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10+-----------------------------------------------------------
11+
12+PREAMBLE
13+The goals of the Open Font License (OFL) are to stimulate worldwide
14+development of collaborative font projects, to support the font creation
15+efforts of academic and linguistic communities, and to provide a free and
16+open framework in which fonts may be shared and improved in partnership
17+with others.
18+
19+The OFL allows the licensed fonts to be used, studied, modified and
20+redistributed freely as long as they are not sold by themselves. The
21+fonts, including any derivative works, can be bundled, embedded,
22+redistributed and/or sold with any software provided that any reserved
23+names are not used by derivative works. The fonts and derivatives,
24+however, cannot be released under any other type of license. The
25+requirement for fonts to remain under this license does not apply
26+to any document created using the fonts or their derivatives.
27+
28+DEFINITIONS
29+"Font Software" refers to the set of files released by the Copyright
30+Holder(s) under this license and clearly marked as such. This may
31+include source files, build scripts and documentation.
32+
33+"Reserved Font Name" refers to any names specified as such after the
34+copyright statement(s).
35+
36+"Original Version" refers to the collection of Font Software components as
37+distributed by the Copyright Holder(s).
38+
39+"Modified Version" refers to any derivative made by adding to, deleting,
40+or substituting -- in part or in whole -- any of the components of the
41+Original Version, by changing formats or by porting the Font Software to a
42+new environment.
43+
44+"Author" refers to any designer, engineer, programmer, technical
45+writer or other person who contributed to the Font Software.
46+
47+PERMISSION & CONDITIONS
48+Permission is hereby granted, free of charge, to any person obtaining
49+a copy of the Font Software, to use, study, copy, merge, embed, modify,
50+redistribute, and sell modified and unmodified copies of the Font
51+Software, subject to the following conditions:
52+
53+1) Neither the Font Software nor any of its individual components,
54+in Original or Modified Versions, may be sold by itself.
55+
56+2) Original or Modified Versions of the Font Software may be bundled,
57+redistributed and/or sold with any software, provided that each copy
58+contains the above copyright notice and this license. These can be
59+included either as stand-alone text files, human-readable headers or
60+in the appropriate machine-readable metadata fields within text or
61+binary files as long as those fields can be easily viewed by the user.
62+
63+3) No Modified Version of the Font Software may use the Reserved Font
64+Name(s) unless explicit written permission is granted by the corresponding
65+Copyright Holder. This restriction only applies to the primary font name as
66+presented to the users.
67+
68+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69+Software shall not be used to promote, endorse or advertise any
70+Modified Version, except to acknowledge the contribution(s) of the
71+Copyright Holder(s) and the Author(s) or with their explicit written
72+permission.
73+
74+5) The Font Software, modified or unmodified, in part or in whole,
75+must be distributed entirely under this license, and must not be
76+distributed under any other license. The requirement for fonts to
77+remain under this license does not apply to any document created
78+using the Font Software.
79+
80+TERMINATION
81+This license becomes null and void if any of the above conditions are
82+not met.
83+
84+DISCLAIMER
85+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93+OTHER DEALINGS IN THE FONT SOFTWARE.
added docs/site-documentation/static/img/de/ajouter-categorie.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-categorie.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-categorie.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-categorie.jxl differ
added docs/site-documentation/static/img/de/ajouter-categorie.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-categorie.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-categorie.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-categorie.png differ
added docs/site-documentation/static/img/de/ajouter-choix.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-choix.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-choix.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-choix.jxl differ
added docs/site-documentation/static/img/de/ajouter-choix.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-choix.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-choix.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-choix.png differ
added docs/site-documentation/static/img/de/ajouter-duree.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-duree.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-duree.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-duree.jxl differ
added docs/site-documentation/static/img/de/ajouter-duree.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-duree.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-duree.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/ajouter-duree.png differ
added docs/site-documentation/static/img/de/categories.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/categories.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/categories.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/categories.jxl differ
added docs/site-documentation/static/img/de/categories.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/categories.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/categories.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/categories.png differ
added docs/site-documentation/static/img/de/connexion.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/connexion.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/connexion.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/connexion.jxl differ
added docs/site-documentation/static/img/de/connexion.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/connexion.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/connexion.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/connexion.png differ
added docs/site-documentation/static/img/de/equipes.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/equipes.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/equipes.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/equipes.jxl differ
added docs/site-documentation/static/img/de/equipes.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/equipes.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/equipes.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/equipes.png differ
added docs/site-documentation/static/img/de/erreur-404.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/erreur-404.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/erreur-404.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/erreur-404.jxl differ
added docs/site-documentation/static/img/de/erreur-404.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/erreur-404.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/erreur-404.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/erreur-404.png differ
added docs/site-documentation/static/img/de/mes-temps.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/mes-temps.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/mes-temps.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/mes-temps.jxl differ
added docs/site-documentation/static/img/de/mes-temps.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/mes-temps.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/mes-temps.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/mes-temps.png differ
added docs/site-documentation/static/img/de/minuteur.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/minuteur.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/minuteur.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/minuteur.jxl differ
added docs/site-documentation/static/img/de/minuteur.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/minuteur.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/minuteur.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/minuteur.png differ
added docs/site-documentation/static/img/de/modifier-temps.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/modifier-temps.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/modifier-temps.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/modifier-temps.jxl differ
added docs/site-documentation/static/img/de/modifier-temps.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/modifier-temps.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/modifier-temps.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/modifier-temps.png differ
added docs/site-documentation/static/img/de/parametres.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/parametres.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/parametres.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/parametres.jxl differ
added docs/site-documentation/static/img/de/parametres.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/parametres.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/parametres.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/parametres.png differ
added docs/site-documentation/static/img/de/stats-asso.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-asso.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-asso.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats-asso.jxl differ
added docs/site-documentation/static/img/de/stats-asso.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-asso.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-asso.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats-asso.png differ
added docs/site-documentation/static/img/de/stats-detail.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-detail.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-detail.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats-detail.jxl differ
added docs/site-documentation/static/img/de/stats-detail.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-detail.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-detail.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats-detail.png differ
added docs/site-documentation/static/img/de/stats-groupe.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-groupe.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-groupe.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats-groupe.jxl differ
added docs/site-documentation/static/img/de/stats-groupe.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-groupe.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats-groupe.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats-groupe.png differ
added docs/site-documentation/static/img/de/stats.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats.jxl differ
added docs/site-documentation/static/img/de/stats.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/stats.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/stats.png differ
added docs/site-documentation/static/img/de/tache-effectuee.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-effectuee.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-effectuee.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/tache-effectuee.jxl differ
added docs/site-documentation/static/img/de/tache-effectuee.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-effectuee.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-effectuee.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/tache-effectuee.png differ
added docs/site-documentation/static/img/de/tache-modifier.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-modifier.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-modifier.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/tache-modifier.jxl differ
added docs/site-documentation/static/img/de/tache-modifier.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-modifier.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-modifier.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/tache-modifier.png differ
added docs/site-documentation/static/img/de/tache-nouvelle.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-nouvelle.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-nouvelle.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/tache-nouvelle.jxl differ
added docs/site-documentation/static/img/de/tache-nouvelle.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-nouvelle.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/tache-nouvelle.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/tache-nouvelle.png differ
added docs/site-documentation/static/img/de/taches.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/taches.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/taches.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/taches.jxl differ
added docs/site-documentation/static/img/de/taches.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/taches.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/taches.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/taches.png differ
added docs/site-documentation/static/img/de/x-bandeau-minuteur.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-bandeau-minuteur.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-bandeau-minuteur.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-bandeau-minuteur.jxl differ
added docs/site-documentation/static/img/de/x-bandeau-minuteur.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-bandeau-minuteur.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-bandeau-minuteur.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-bandeau-minuteur.png differ
added docs/site-documentation/static/img/de/x-categorie-pill.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-categorie-pill.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-categorie-pill.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-categorie-pill.jxl differ
added docs/site-documentation/static/img/de/x-categorie-pill.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-categorie-pill.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-categorie-pill.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-categorie-pill.png differ
added docs/site-documentation/static/img/de/x-entete.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-entete.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-entete.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-entete.jxl differ
added docs/site-documentation/static/img/de/x-entete.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-entete.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-entete.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-entete.png differ
added docs/site-documentation/static/img/de/x-groupe-carte.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-groupe-carte.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-groupe-carte.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-groupe-carte.jxl differ
added docs/site-documentation/static/img/de/x-groupe-carte.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-groupe-carte.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-groupe-carte.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-groupe-carte.png differ
added docs/site-documentation/static/img/de/x-invitation.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-invitation.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-invitation.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-invitation.jxl differ
added docs/site-documentation/static/img/de/x-invitation.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-invitation.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-invitation.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-invitation.png differ
added docs/site-documentation/static/img/de/x-legende.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-legende.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-legende.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-legende.jxl differ
added docs/site-documentation/static/img/de/x-legende.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-legende.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-legende.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-legende.png differ
added docs/site-documentation/static/img/de/x-scopes.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-scopes.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-scopes.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-scopes.jxl differ
added docs/site-documentation/static/img/de/x-scopes.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-scopes.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-scopes.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-scopes.png differ
added docs/site-documentation/static/img/de/x-stepper.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-stepper.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-stepper.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-stepper.jxl differ
added docs/site-documentation/static/img/de/x-stepper.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-stepper.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-stepper.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-stepper.png differ
added docs/site-documentation/static/img/de/x-tabbar.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-tabbar.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-tabbar.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-tabbar.jxl differ
added docs/site-documentation/static/img/de/x-tabbar.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-tabbar.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-tabbar.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-tabbar.png differ
added docs/site-documentation/static/img/de/x-todo-carte.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-todo-carte.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-todo-carte.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-todo-carte.jxl differ
added docs/site-documentation/static/img/de/x-todo-carte.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-todo-carte.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/de/x-todo-carte.png differBinary files /dev/null and b/docs/site-documentation/static/img/de/x-todo-carte.png differ
added docs/site-documentation/static/img/en/ajouter-categorie.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-categorie.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-categorie.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-categorie.jxl differ
added docs/site-documentation/static/img/en/ajouter-categorie.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-categorie.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-categorie.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-categorie.png differ
added docs/site-documentation/static/img/en/ajouter-choix.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-choix.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-choix.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-choix.jxl differ
added docs/site-documentation/static/img/en/ajouter-choix.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-choix.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-choix.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-choix.png differ
added docs/site-documentation/static/img/en/ajouter-duree.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-duree.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-duree.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-duree.jxl differ
added docs/site-documentation/static/img/en/ajouter-duree.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-duree.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-duree.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/ajouter-duree.png differ
added docs/site-documentation/static/img/en/categories.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/categories.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/categories.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/categories.jxl differ
added docs/site-documentation/static/img/en/categories.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/categories.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/categories.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/categories.png differ
added docs/site-documentation/static/img/en/connexion.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/connexion.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/connexion.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/connexion.jxl differ
added docs/site-documentation/static/img/en/connexion.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/connexion.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/connexion.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/connexion.png differ
added docs/site-documentation/static/img/en/equipes.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/equipes.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/equipes.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/equipes.jxl differ
added docs/site-documentation/static/img/en/equipes.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/equipes.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/equipes.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/equipes.png differ
added docs/site-documentation/static/img/en/erreur-404.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/erreur-404.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/erreur-404.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/erreur-404.jxl differ
added docs/site-documentation/static/img/en/erreur-404.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/erreur-404.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/erreur-404.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/erreur-404.png differ
added docs/site-documentation/static/img/en/mes-temps.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/mes-temps.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/mes-temps.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/mes-temps.jxl differ
added docs/site-documentation/static/img/en/mes-temps.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/mes-temps.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/mes-temps.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/mes-temps.png differ
added docs/site-documentation/static/img/en/minuteur.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/minuteur.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/minuteur.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/minuteur.jxl differ
added docs/site-documentation/static/img/en/minuteur.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/minuteur.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/minuteur.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/minuteur.png differ
added docs/site-documentation/static/img/en/modifier-temps.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/modifier-temps.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/modifier-temps.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/modifier-temps.jxl differ
added docs/site-documentation/static/img/en/modifier-temps.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/modifier-temps.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/modifier-temps.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/modifier-temps.png differ
added docs/site-documentation/static/img/en/parametres.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/parametres.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/parametres.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/parametres.jxl differ
added docs/site-documentation/static/img/en/parametres.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/parametres.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/parametres.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/parametres.png differ
added docs/site-documentation/static/img/en/stats-asso.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-asso.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-asso.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats-asso.jxl differ
added docs/site-documentation/static/img/en/stats-asso.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-asso.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-asso.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats-asso.png differ
added docs/site-documentation/static/img/en/stats-detail.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-detail.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-detail.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats-detail.jxl differ
added docs/site-documentation/static/img/en/stats-detail.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-detail.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-detail.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats-detail.png differ
added docs/site-documentation/static/img/en/stats-groupe.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-groupe.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-groupe.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats-groupe.jxl differ
added docs/site-documentation/static/img/en/stats-groupe.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-groupe.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats-groupe.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats-groupe.png differ
added docs/site-documentation/static/img/en/stats.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats.jxl differ
added docs/site-documentation/static/img/en/stats.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/stats.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/stats.png differ
added docs/site-documentation/static/img/en/tache-effectuee.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-effectuee.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-effectuee.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/tache-effectuee.jxl differ
added docs/site-documentation/static/img/en/tache-effectuee.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-effectuee.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-effectuee.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/tache-effectuee.png differ
added docs/site-documentation/static/img/en/tache-modifier.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-modifier.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-modifier.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/tache-modifier.jxl differ
added docs/site-documentation/static/img/en/tache-modifier.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-modifier.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-modifier.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/tache-modifier.png differ
added docs/site-documentation/static/img/en/tache-nouvelle.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-nouvelle.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-nouvelle.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/tache-nouvelle.jxl differ
added docs/site-documentation/static/img/en/tache-nouvelle.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-nouvelle.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/tache-nouvelle.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/tache-nouvelle.png differ
added docs/site-documentation/static/img/en/taches.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/taches.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/taches.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/taches.jxl differ
added docs/site-documentation/static/img/en/taches.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/taches.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/taches.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/taches.png differ
added docs/site-documentation/static/img/en/x-bandeau-minuteur.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-bandeau-minuteur.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-bandeau-minuteur.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-bandeau-minuteur.jxl differ
added docs/site-documentation/static/img/en/x-bandeau-minuteur.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-bandeau-minuteur.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-bandeau-minuteur.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-bandeau-minuteur.png differ
added docs/site-documentation/static/img/en/x-categorie-pill.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-categorie-pill.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-categorie-pill.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-categorie-pill.jxl differ
added docs/site-documentation/static/img/en/x-categorie-pill.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-categorie-pill.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-categorie-pill.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-categorie-pill.png differ
added docs/site-documentation/static/img/en/x-entete.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-entete.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-entete.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-entete.jxl differ
added docs/site-documentation/static/img/en/x-entete.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-entete.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-entete.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-entete.png differ
added docs/site-documentation/static/img/en/x-groupe-carte.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-groupe-carte.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-groupe-carte.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-groupe-carte.jxl differ
added docs/site-documentation/static/img/en/x-groupe-carte.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-groupe-carte.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-groupe-carte.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-groupe-carte.png differ
added docs/site-documentation/static/img/en/x-invitation.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-invitation.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-invitation.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-invitation.jxl differ
added docs/site-documentation/static/img/en/x-invitation.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-invitation.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-invitation.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-invitation.png differ
added docs/site-documentation/static/img/en/x-legende.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-legende.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-legende.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-legende.jxl differ
added docs/site-documentation/static/img/en/x-legende.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-legende.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-legende.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-legende.png differ
added docs/site-documentation/static/img/en/x-scopes.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-scopes.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-scopes.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-scopes.jxl differ
added docs/site-documentation/static/img/en/x-scopes.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-scopes.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-scopes.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-scopes.png differ
added docs/site-documentation/static/img/en/x-stepper.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-stepper.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-stepper.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-stepper.jxl differ
added docs/site-documentation/static/img/en/x-stepper.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-stepper.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-stepper.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-stepper.png differ
added docs/site-documentation/static/img/en/x-tabbar.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-tabbar.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-tabbar.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-tabbar.jxl differ
added docs/site-documentation/static/img/en/x-tabbar.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-tabbar.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-tabbar.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-tabbar.png differ
added docs/site-documentation/static/img/en/x-todo-carte.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-todo-carte.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-todo-carte.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-todo-carte.jxl differ
added docs/site-documentation/static/img/en/x-todo-carte.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-todo-carte.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/en/x-todo-carte.png differBinary files /dev/null and b/docs/site-documentation/static/img/en/x-todo-carte.png differ
added docs/site-documentation/static/img/fr/ajouter-categorie.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-categorie.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-categorie.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-categorie.jxl differ
added docs/site-documentation/static/img/fr/ajouter-categorie.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-categorie.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-categorie.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-categorie.png differ
added docs/site-documentation/static/img/fr/ajouter-choix.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-choix.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-choix.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-choix.jxl differ
added docs/site-documentation/static/img/fr/ajouter-choix.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-choix.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-choix.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-choix.png differ
added docs/site-documentation/static/img/fr/ajouter-duree.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-duree.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-duree.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-duree.jxl differ
added docs/site-documentation/static/img/fr/ajouter-duree.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-duree.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-duree.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/ajouter-duree.png differ
added docs/site-documentation/static/img/fr/categories.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/categories.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/categories.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/categories.jxl differ
added docs/site-documentation/static/img/fr/categories.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/categories.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/categories.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/categories.png differ
added docs/site-documentation/static/img/fr/connexion.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/connexion.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/connexion.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/connexion.jxl differ
added docs/site-documentation/static/img/fr/connexion.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/connexion.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/connexion.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/connexion.png differ
added docs/site-documentation/static/img/fr/equipes.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/equipes.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/equipes.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/equipes.jxl differ
added docs/site-documentation/static/img/fr/equipes.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/equipes.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/equipes.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/equipes.png differ
added docs/site-documentation/static/img/fr/erreur-404.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/erreur-404.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/erreur-404.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/erreur-404.jxl differ
added docs/site-documentation/static/img/fr/erreur-404.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/erreur-404.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/erreur-404.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/erreur-404.png differ
added docs/site-documentation/static/img/fr/mes-temps.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/mes-temps.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/mes-temps.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/mes-temps.jxl differ
added docs/site-documentation/static/img/fr/mes-temps.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/mes-temps.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/mes-temps.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/mes-temps.png differ
added docs/site-documentation/static/img/fr/minuteur.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/minuteur.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/minuteur.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/minuteur.jxl differ
added docs/site-documentation/static/img/fr/minuteur.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/minuteur.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/minuteur.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/minuteur.png differ
added docs/site-documentation/static/img/fr/modifier-temps.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/modifier-temps.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/modifier-temps.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/modifier-temps.jxl differ
added docs/site-documentation/static/img/fr/modifier-temps.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/modifier-temps.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/modifier-temps.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/modifier-temps.png differ
added docs/site-documentation/static/img/fr/parametres.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/parametres.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/parametres.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/parametres.jxl differ
added docs/site-documentation/static/img/fr/parametres.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/parametres.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/parametres.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/parametres.png differ
added docs/site-documentation/static/img/fr/stats-asso.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-asso.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-asso.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats-asso.jxl differ
added docs/site-documentation/static/img/fr/stats-asso.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-asso.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-asso.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats-asso.png differ
added docs/site-documentation/static/img/fr/stats-detail.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-detail.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-detail.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats-detail.jxl differ
added docs/site-documentation/static/img/fr/stats-detail.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-detail.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-detail.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats-detail.png differ
added docs/site-documentation/static/img/fr/stats-groupe.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-groupe.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-groupe.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats-groupe.jxl differ
added docs/site-documentation/static/img/fr/stats-groupe.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-groupe.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats-groupe.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats-groupe.png differ
added docs/site-documentation/static/img/fr/stats.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats.jxl differ
added docs/site-documentation/static/img/fr/stats.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/stats.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/stats.png differ
added docs/site-documentation/static/img/fr/tache-effectuee.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-effectuee.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-effectuee.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/tache-effectuee.jxl differ
added docs/site-documentation/static/img/fr/tache-effectuee.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-effectuee.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-effectuee.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/tache-effectuee.png differ
added docs/site-documentation/static/img/fr/tache-modifier.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-modifier.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-modifier.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/tache-modifier.jxl differ
added docs/site-documentation/static/img/fr/tache-modifier.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-modifier.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-modifier.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/tache-modifier.png differ
added docs/site-documentation/static/img/fr/tache-nouvelle.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-nouvelle.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-nouvelle.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/tache-nouvelle.jxl differ
added docs/site-documentation/static/img/fr/tache-nouvelle.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-nouvelle.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/tache-nouvelle.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/tache-nouvelle.png differ
added docs/site-documentation/static/img/fr/taches.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/taches.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/taches.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/taches.jxl differ
added docs/site-documentation/static/img/fr/taches.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/taches.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/taches.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/taches.png differ
added docs/site-documentation/static/img/fr/x-bandeau-minuteur.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-bandeau-minuteur.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-bandeau-minuteur.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-bandeau-minuteur.jxl differ
added docs/site-documentation/static/img/fr/x-bandeau-minuteur.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-bandeau-minuteur.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-bandeau-minuteur.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-bandeau-minuteur.png differ
added docs/site-documentation/static/img/fr/x-categorie-pill.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-categorie-pill.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-categorie-pill.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-categorie-pill.jxl differ
added docs/site-documentation/static/img/fr/x-categorie-pill.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-categorie-pill.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-categorie-pill.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-categorie-pill.png differ
added docs/site-documentation/static/img/fr/x-entete.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-entete.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-entete.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-entete.jxl differ
added docs/site-documentation/static/img/fr/x-entete.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-entete.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-entete.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-entete.png differ
added docs/site-documentation/static/img/fr/x-groupe-carte.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-groupe-carte.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-groupe-carte.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-groupe-carte.jxl differ
added docs/site-documentation/static/img/fr/x-groupe-carte.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-groupe-carte.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-groupe-carte.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-groupe-carte.png differ
added docs/site-documentation/static/img/fr/x-invitation.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-invitation.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-invitation.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-invitation.jxl differ
added docs/site-documentation/static/img/fr/x-invitation.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-invitation.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-invitation.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-invitation.png differ
added docs/site-documentation/static/img/fr/x-legende.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-legende.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-legende.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-legende.jxl differ
added docs/site-documentation/static/img/fr/x-legende.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-legende.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-legende.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-legende.png differ
added docs/site-documentation/static/img/fr/x-scopes.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-scopes.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-scopes.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-scopes.jxl differ
added docs/site-documentation/static/img/fr/x-scopes.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-scopes.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-scopes.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-scopes.png differ
added docs/site-documentation/static/img/fr/x-stepper.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-stepper.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-stepper.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-stepper.jxl differ
added docs/site-documentation/static/img/fr/x-stepper.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-stepper.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-stepper.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-stepper.png differ
added docs/site-documentation/static/img/fr/x-tabbar.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-tabbar.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-tabbar.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-tabbar.jxl differ
added docs/site-documentation/static/img/fr/x-tabbar.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-tabbar.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-tabbar.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-tabbar.png differ
added docs/site-documentation/static/img/fr/x-todo-carte.jxl +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-todo-carte.jxl differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-todo-carte.jxl differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-todo-carte.jxl differ
added docs/site-documentation/static/img/fr/x-todo-carte.png +0 -0
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-todo-carte.png differ
new file mode 100644
Binary files /dev/null and b/docs/site-documentation/static/img/fr/x-todo-carte.png differBinary files /dev/null and b/docs/site-documentation/static/img/fr/x-todo-carte.png differ
added docs/site-documentation/static/img/logo.svg +16 -0
new file mode 100644
@@ -0,0 +1,16 @@
1+<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96">
2+ <!-- Ex Ego — « le cadran ex aequo » : un signe égal dans un cadran d'horloge
3+ (anneau + quatre graduations, 12 h plus marquée). Deux traits de longueur
4+ égale, partagés terracotta/sauge en proportions inversées : des
5+ contributions différentes, un total égal. -->
6+ <circle cx="48" cy="48" r="44" fill="#f5ead8"/>
7+ <circle cx="48" cy="48" r="40" fill="none" stroke="#201e1d" stroke-width="2.4" opacity=".38"/>
8+ <circle cx="48" cy="14" r="3.3" fill="#201e1d" opacity=".7"/>
9+ <circle cx="48" cy="82" r="3.3" fill="#201e1d" opacity=".5"/>
10+ <circle cx="14" cy="48" r="3.3" fill="#201e1d" opacity=".5"/>
11+ <circle cx="82" cy="48" r="3.3" fill="#201e1d" opacity=".5"/>
12+ <rect x="27" y="35.5" width="42" height="10.5" rx="5.25" fill="#c67139"/>
13+ <path d="M53.5 35.5 h10.25 a5.25 5.25 0 0 1 0 10.5 h-10.25 z" fill="#7a8a5e"/>
14+ <rect x="27" y="50" width="42" height="10.5" rx="5.25" fill="#7a8a5e"/>
15+ <path d="M43.5 50 h20.25 a5.25 5.25 0 0 1 0 10.5 h-20.25 z" fill="#c67139"/>
16+</svg>
new file mode 100644
@@ -0,0 +1,16 @@
1+<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96">
2+ <!-- Ex Ego — « le cadran ex aequo » : un signe égal dans un cadran d'horloge
3+ (anneau + quatre graduations, 12 h plus marquée). Deux traits de longueur
4+ égale, partagés terracotta/sauge en proportions inversées : des
5+ contributions différentes, un total égal. -->
6+ <circle cx="48" cy="48" r="44" fill="#f5ead8"/>
7+ <circle cx="48" cy="48" r="40" fill="none" stroke="#201e1d" stroke-width="2.4" opacity=".38"/>
8+ <circle cx="48" cy="14" r="3.3" fill="#201e1d" opacity=".7"/>
9+ <circle cx="48" cy="82" r="3.3" fill="#201e1d" opacity=".5"/>
10+ <circle cx="14" cy="48" r="3.3" fill="#201e1d" opacity=".5"/>
11+ <circle cx="82" cy="48" r="3.3" fill="#201e1d" opacity=".5"/>
12+ <rect x="27" y="35.5" width="42" height="10.5" rx="5.25" fill="#c67139"/>
13+ <path d="M53.5 35.5 h10.25 a5.25 5.25 0 0 1 0 10.5 h-10.25 z" fill="#7a8a5e"/>
14+ <rect x="27" y="50" width="42" height="10.5" rx="5.25" fill="#7a8a5e"/>
15+ <path d="M43.5 50 h20.25 a5.25 5.25 0 0 1 0 10.5 h-20.25 z" fill="#c67139"/>
16+</svg>
added docs/site-documentation/templates/base.html +82 -0
new file mode 100644
@@ -0,0 +1,82 @@
1+{# Gabarit commun. Les pages anonymes d'Ex Ego sont toujours en thème
2+ Organic : la documentation suit la même règle, sans bascule de thème. #}
3+{%- set home = get_section(path="_index.md", lang=lang, allow_missing=true) -%}
4+{%- set ecrans = get_section(path="ecrans/_index.md", lang=lang, allow_missing=true) -%}
5+{%- set histoires = get_section(path="histoires/_index.md", lang=lang, allow_missing=true) -%}
6+{%- set here = current_path | default(value="/") -%}
7+<!doctype html>
8+<html lang="{{ lang }}">
9+<head>
10+<meta charset="utf-8">
11+<meta name="viewport" content="width=device-width, initial-scale=1">
12+<title>{% block title %}{{ config.title }}{% endblock %}</title>
13+<meta name="description" content="{% block description %}{{ config.description }}{% endblock %}">
14+<meta name="color-scheme" content="light">
15+<link rel="stylesheet" href="{{ get_url(path='doc.css', cachebust=true) }}">
16+<link rel="icon" href="{{ get_url(path='img/logo.svg') }}" type="image/svg+xml">
17+{%- block alternates %}{% endblock %}
18+</head>
19+<body>
20+<a class="skip" href="#contenu">{{ trans(key="skip", lang=lang) }}</a>
21+
22+<header class="top">
23+ <a class="brand" href="{{ home?.permalink or config.base_url }}">
24+ <img src="{{ get_url(path='img/logo.svg') }}" alt="" width="28" height="28">
25+ <span>{{ config.title }}</span>
26+ </a>
27+ <nav class="langs" aria-label="{{ trans(key='languages', lang=lang) }}">
28+ {%- for code in config.extra.langs -%}
29+ {%- set label = trans(key="lang_" ~ code, lang=config.default_language) -%}
30+ {%- if code == lang -%}
31+ <span class="lang is-on" aria-current="true"><span class="l-long">{{ label }}</span><span class="l-short">{{ code | upper }}</span></span>
32+ {%- else -%}
33+ {%- set_global target = "" -%}
34+ {%- if page is defined -%}
35+ {%- for t in page.translations -%}{%- if t.lang == code -%}{%- set_global target = t.permalink -%}{%- endif -%}{%- endfor -%}
36+ {%- elif section is defined -%}
37+ {%- for t in section.translations -%}{%- if t.lang == code -%}{%- set_global target = t.permalink -%}{%- endif -%}{%- endfor -%}
38+ {%- endif -%}
39+ {%- if target == "" -%}
40+ {#- Page non traduite : on renvoie vers l'accueil de cette langue. -#}
41+ {%- set root = get_section(path="_index.md", lang=code, allow_missing=true) -%}
42+ {%- if root -%}{%- set_global target = root.permalink -%}{%- endif -%}
43+ {%- endif -%}
44+ {%- if target == "" -%}
45+ <span class="lang is-off"><span class="l-long">{{ label }}</span><span class="l-short">{{ code | upper }}</span></span>
46+ {%- else -%}
47+ <a class="lang" href="{{ target }}" hreflang="{{ code }}" aria-label="{{ label }}"><span class="l-long">{{ label }}</span><span class="l-short" aria-hidden="true">{{ code | upper }}</span></a>
48+ {%- endif -%}
49+ {%- endif -%}
50+ {%- endfor -%}
51+ </nav>
52+</header>
53+
54+{#- Sur téléphone, le sommaire passe APRÈS le contenu (ordre de grille) :
55+ un menu de dix-huit entrées en tête de page repousserait le texte hors de
56+ l'écran. Le lien ci-dessous y saute, et sur grand écran la colonne
57+ reprend sa place à gauche. -#}
58+<div class="layout">
59+ <main id="contenu">
60+ <a class="to-toc" href="#sommaire">{{ trans(key="summary", lang=lang) }}</a>
61+{% block content %}{% endblock %}
62+ </main>
63+
64+ <nav class="side" id="sommaire" aria-label="{{ trans(key='sections', lang=lang) }}">
65+ <p class="side-head">{{ trans(key="summary", lang=lang) }}</p>
66+ <a class="side-top{% if here == home?.path %} is-on{% endif %}" href="{{ home?.permalink or config.base_url }}">{{ trans(key="home", lang=lang) }}</a>
67+ {%- for s in [ecrans, histoires] %}{% if s %}
68+ <p class="side-title">{{ s.title }}</p>
69+ <ul>
70+ {%- for p in s.pages %}
71+ <li><a href="{{ p.permalink }}"{% if here == p.path %} class="is-on" aria-current="page"{% endif %}>{{ p.title }}</a></li>
72+ {%- endfor %}
73+ </ul>
74+ {% endif %}{%- endfor %}
75+ </nav>
76+</div>
77+
78+<footer class="foot">
79+ <p>{{ trans(key="footer", lang=lang) }} <a href="{{ config.extra.app_url }}">{{ trans(key="open_app", lang=lang) }}</a></p>
80+</footer>
81+</body>
82+</html>
new file mode 100644
@@ -0,0 +1,82 @@
1+{# Gabarit commun. Les pages anonymes d'Ex Ego sont toujours en thème
2+ Organic : la documentation suit la même règle, sans bascule de thème. #}
3+{%- set home = get_section(path="_index.md", lang=lang, allow_missing=true) -%}
4+{%- set ecrans = get_section(path="ecrans/_index.md", lang=lang, allow_missing=true) -%}
5+{%- set histoires = get_section(path="histoires/_index.md", lang=lang, allow_missing=true) -%}
6+{%- set here = current_path | default(value="/") -%}
7+<!doctype html>
8+<html lang="{{ lang }}">
9+<head>
10+<meta charset="utf-8">
11+<meta name="viewport" content="width=device-width, initial-scale=1">
12+<title>{% block title %}{{ config.title }}{% endblock %}</title>
13+<meta name="description" content="{% block description %}{{ config.description }}{% endblock %}">
14+<meta name="color-scheme" content="light">
15+<link rel="stylesheet" href="{{ get_url(path='doc.css', cachebust=true) }}">
16+<link rel="icon" href="{{ get_url(path='img/logo.svg') }}" type="image/svg+xml">
17+{%- block alternates %}{% endblock %}
18+</head>
19+<body>
20+<a class="skip" href="#contenu">{{ trans(key="skip", lang=lang) }}</a>
21+
22+<header class="top">
23+ <a class="brand" href="{{ home?.permalink or config.base_url }}">
24+ <img src="{{ get_url(path='img/logo.svg') }}" alt="" width="28" height="28">
25+ <span>{{ config.title }}</span>
26+ </a>
27+ <nav class="langs" aria-label="{{ trans(key='languages', lang=lang) }}">
28+ {%- for code in config.extra.langs -%}
29+ {%- set label = trans(key="lang_" ~ code, lang=config.default_language) -%}
30+ {%- if code == lang -%}
31+ <span class="lang is-on" aria-current="true"><span class="l-long">{{ label }}</span><span class="l-short">{{ code | upper }}</span></span>
32+ {%- else -%}
33+ {%- set_global target = "" -%}
34+ {%- if page is defined -%}
35+ {%- for t in page.translations -%}{%- if t.lang == code -%}{%- set_global target = t.permalink -%}{%- endif -%}{%- endfor -%}
36+ {%- elif section is defined -%}
37+ {%- for t in section.translations -%}{%- if t.lang == code -%}{%- set_global target = t.permalink -%}{%- endif -%}{%- endfor -%}
38+ {%- endif -%}
39+ {%- if target == "" -%}
40+ {#- Page non traduite : on renvoie vers l'accueil de cette langue. -#}
41+ {%- set root = get_section(path="_index.md", lang=code, allow_missing=true) -%}
42+ {%- if root -%}{%- set_global target = root.permalink -%}{%- endif -%}
43+ {%- endif -%}
44+ {%- if target == "" -%}
45+ <span class="lang is-off"><span class="l-long">{{ label }}</span><span class="l-short">{{ code | upper }}</span></span>
46+ {%- else -%}
47+ <a class="lang" href="{{ target }}" hreflang="{{ code }}" aria-label="{{ label }}"><span class="l-long">{{ label }}</span><span class="l-short" aria-hidden="true">{{ code | upper }}</span></a>
48+ {%- endif -%}
49+ {%- endif -%}
50+ {%- endfor -%}
51+ </nav>
52+</header>
53+
54+{#- Sur téléphone, le sommaire passe APRÈS le contenu (ordre de grille) :
55+ un menu de dix-huit entrées en tête de page repousserait le texte hors de
56+ l'écran. Le lien ci-dessous y saute, et sur grand écran la colonne
57+ reprend sa place à gauche. -#}
58+<div class="layout">
59+ <main id="contenu">
60+ <a class="to-toc" href="#sommaire">{{ trans(key="summary", lang=lang) }}</a>
61+{% block content %}{% endblock %}
62+ </main>
63+
64+ <nav class="side" id="sommaire" aria-label="{{ trans(key='sections', lang=lang) }}">
65+ <p class="side-head">{{ trans(key="summary", lang=lang) }}</p>
66+ <a class="side-top{% if here == home?.path %} is-on{% endif %}" href="{{ home?.permalink or config.base_url }}">{{ trans(key="home", lang=lang) }}</a>
67+ {%- for s in [ecrans, histoires] %}{% if s %}
68+ <p class="side-title">{{ s.title }}</p>
69+ <ul>
70+ {%- for p in s.pages %}
71+ <li><a href="{{ p.permalink }}"{% if here == p.path %} class="is-on" aria-current="page"{% endif %}>{{ p.title }}</a></li>
72+ {%- endfor %}
73+ </ul>
74+ {% endif %}{%- endfor %}
75+ </nav>
76+</div>
77+
78+<footer class="foot">
79+ <p>{{ trans(key="footer", lang=lang) }} <a href="{{ config.extra.app_url }}">{{ trans(key="open_app", lang=lang) }}</a></p>
80+</footer>
81+</body>
82+</html>
added docs/site-documentation/templates/components.html +65 -0
new file mode 100644
@@ -0,0 +1,65 @@
1+{# Composants Tera appelés depuis le markdown (Zola 0.23 a supprimé les
2+ shortcodes : le contenu des pages est templaté directement).
3+
4+ Les captures sont trilingues : chaque appel passe la langue de la page,
5+ `lang={lang}`, parce qu'un composant ne voit pas le contexte de l'appelant.
6+ Chaque image existe en JPEG XL (proposé d'abord) et en PNG (repli). #}
7+
8+{# Capture pleine page, format téléphone.
9+ {{<shot name="stats" alt="…" lang={lang} legende="…" />}} #}
10+{% component shot(name: string, alt: string, lang: string, legende: string = "") %}
11+{% set meta = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ name ~ ".png", allow_missing=true) %}
12+<figure class="shot">
13+ <picture>
14+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.jxl') }}">
15+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.png') }}" alt="{{ alt }}"
16+ {% if meta %}width="{{ meta.width }}" height="{{ meta.height }}"{% endif %} loading="lazy" decoding="async">
17+ </picture>
18+ {% if legende %}<figcaption>{{ legende }}</figcaption>{% endif %}
19+</figure>
20+{% endcomponent shot %}
21+
22+{# Extrait recadré, posé dans le fil du texte.
23+ {{<extrait name="x-scopes" alt="…" lang={lang} legende="…" />}} #}
24+{% component extrait(name: string, alt: string, lang: string, legende: string = "") %}
25+{% set meta = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ name ~ ".png", allow_missing=true) %}
26+<figure class="extrait">
27+ <picture>
28+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.jxl') }}">
29+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.png') }}" alt="{{ alt }}"
30+ {% if meta %}width="{{ meta.width }}" height="{{ meta.height }}"{% endif %} loading="lazy" decoding="async">
31+ </picture>
32+ {% if legende %}<figcaption>{{ legende }}</figcaption>{% endif %}
33+</figure>
34+{% endcomponent extrait %}
35+
36+{# Deux captures côte à côte (deux étapes, avant et après).
37+ {{<duo a="…" b="…" alt_a="…" alt_b="…" lang={lang} legende="…" />}} #}
38+{% component duo(a: string, b: string, alt_a: string, alt_b: string, lang: string, legende: string = "") %}
39+{% set ma = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ a ~ ".png", allow_missing=true) %}
40+{% set mb = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ b ~ ".png", allow_missing=true) %}
41+<figure class="duo">
42+ <div>
43+ <picture>
44+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ a ~ '.jxl') }}">
45+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ a ~ '.png') }}" alt="{{ alt_a }}"
46+ {% if ma %}width="{{ ma.width }}" height="{{ ma.height }}"{% endif %} loading="lazy" decoding="async">
47+ </picture>
48+ <picture>
49+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ b ~ '.jxl') }}">
50+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ b ~ '.png') }}" alt="{{ alt_b }}"
51+ {% if mb %}width="{{ mb.width }}" height="{{ mb.height }}"{% endif %} loading="lazy" decoding="async">
52+ </picture>
53+ </div>
54+ {% if legende %}<figcaption>{{ legende }}</figcaption>{% endif %}
55+</figure>
56+{% endcomponent duo %}
57+
58+{# Encadré d'aparté (règle, piège, rappel).
59+ {% <apart titre="…"> %} … {% </apart> %} #}
60+{% component apart(titre: string) %}
61+<aside class="apart">
62+ <p class="apart-t">{{ titre }}</p>
63+ {{ body }}
64+</aside>
65+{% endcomponent apart %}
new file mode 100644
@@ -0,0 +1,65 @@
1+{# Composants Tera appelés depuis le markdown (Zola 0.23 a supprimé les
2+ shortcodes : le contenu des pages est templaté directement).
3+
4+ Les captures sont trilingues : chaque appel passe la langue de la page,
5+ `lang={lang}`, parce qu'un composant ne voit pas le contexte de l'appelant.
6+ Chaque image existe en JPEG XL (proposé d'abord) et en PNG (repli). #}
7+
8+{# Capture pleine page, format téléphone.
9+ {{<shot name="stats" alt="…" lang={lang} legende="…" />}} #}
10+{% component shot(name: string, alt: string, lang: string, legende: string = "") %}
11+{% set meta = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ name ~ ".png", allow_missing=true) %}
12+<figure class="shot">
13+ <picture>
14+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.jxl') }}">
15+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.png') }}" alt="{{ alt }}"
16+ {% if meta %}width="{{ meta.width }}" height="{{ meta.height }}"{% endif %} loading="lazy" decoding="async">
17+ </picture>
18+ {% if legende %}<figcaption>{{ legende }}</figcaption>{% endif %}
19+</figure>
20+{% endcomponent shot %}
21+
22+{# Extrait recadré, posé dans le fil du texte.
23+ {{<extrait name="x-scopes" alt="…" lang={lang} legende="…" />}} #}
24+{% component extrait(name: string, alt: string, lang: string, legende: string = "") %}
25+{% set meta = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ name ~ ".png", allow_missing=true) %}
26+<figure class="extrait">
27+ <picture>
28+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.jxl') }}">
29+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ name ~ '.png') }}" alt="{{ alt }}"
30+ {% if meta %}width="{{ meta.width }}" height="{{ meta.height }}"{% endif %} loading="lazy" decoding="async">
31+ </picture>
32+ {% if legende %}<figcaption>{{ legende }}</figcaption>{% endif %}
33+</figure>
34+{% endcomponent extrait %}
35+
36+{# Deux captures côte à côte (deux étapes, avant et après).
37+ {{<duo a="…" b="…" alt_a="…" alt_b="…" lang={lang} legende="…" />}} #}
38+{% component duo(a: string, b: string, alt_a: string, alt_b: string, lang: string, legende: string = "") %}
39+{% set ma = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ a ~ ".png", allow_missing=true) %}
40+{% set mb = get_image_metadata(path="static/img/" ~ lang ~ "/" ~ b ~ ".png", allow_missing=true) %}
41+<figure class="duo">
42+ <div>
43+ <picture>
44+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ a ~ '.jxl') }}">
45+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ a ~ '.png') }}" alt="{{ alt_a }}"
46+ {% if ma %}width="{{ ma.width }}" height="{{ ma.height }}"{% endif %} loading="lazy" decoding="async">
47+ </picture>
48+ <picture>
49+ <source type="image/jxl" srcset="{{ get_url(path='img/' ~ lang ~ '/' ~ b ~ '.jxl') }}">
50+ <img src="{{ get_url(path='img/' ~ lang ~ '/' ~ b ~ '.png') }}" alt="{{ alt_b }}"
51+ {% if mb %}width="{{ mb.width }}" height="{{ mb.height }}"{% endif %} loading="lazy" decoding="async">
52+ </picture>
53+ </div>
54+ {% if legende %}<figcaption>{{ legende }}</figcaption>{% endif %}
55+</figure>
56+{% endcomponent duo %}
57+
58+{# Encadré d'aparté (règle, piège, rappel).
59+ {% <apart titre="…"> %} … {% </apart> %} #}
60+{% component apart(titre: string) %}
61+<aside class="apart">
62+ <p class="apart-t">{{ titre }}</p>
63+ {{ body }}
64+</aside>
65+{% endcomponent apart %}
added docs/site-documentation/templates/index.html +27 -0
new file mode 100644
@@ -0,0 +1,27 @@
1+{% extends "base.html" %}
2+{% block title %}{{ config.title }}{% endblock %}
3+{% block description %}{{ section.description | default(value=config.description) }}{% endblock %}
4+{% block alternates %}
5+{%- for t in section.translations %}
6+<link rel="alternate" hreflang="{{ t.lang }}" href="{{ t.permalink }}">
7+{%- endfor %}
8+{% endblock %}
9+{% block content %}
10+<article class="prose home">
11+ <h1>{{ section.title }}</h1>
12+ {%- if section.description %}
13+ <p class="lede">{{ section.description }}</p>
14+ {%- endif %}
15+ {{ section.content | safe }}
16+
17+ <div class="cards">
18+ {%- for s in section.subsections %}
19+ {%- set sub = get_section(path=s) %}
20+ <a class="card" href="{{ sub.permalink }}">
21+ <span class="card-title">{{ sub.title }}</span>
22+ {%- if sub.description %}<span class="card-desc">{{ sub.description }}</span>{% endif %}
23+ </a>
24+ {%- endfor %}
25+ </div>
26+</article>
27+{% endblock %}
new file mode 100644
@@ -0,0 +1,27 @@
1+{% extends "base.html" %}
2+{% block title %}{{ config.title }}{% endblock %}
3+{% block description %}{{ section.description | default(value=config.description) }}{% endblock %}
4+{% block alternates %}
5+{%- for t in section.translations %}
6+<link rel="alternate" hreflang="{{ t.lang }}" href="{{ t.permalink }}">
7+{%- endfor %}
8+{% endblock %}
9+{% block content %}
10+<article class="prose home">
11+ <h1>{{ section.title }}</h1>
12+ {%- if section.description %}
13+ <p class="lede">{{ section.description }}</p>
14+ {%- endif %}
15+ {{ section.content | safe }}
16+
17+ <div class="cards">
18+ {%- for s in section.subsections %}
19+ {%- set sub = get_section(path=s) %}
20+ <a class="card" href="{{ sub.permalink }}">
21+ <span class="card-title">{{ sub.title }}</span>
22+ {%- if sub.description %}<span class="card-desc">{{ sub.description }}</span>{% endif %}
23+ </a>
24+ {%- endfor %}
25+ </div>
26+</article>
27+{% endblock %}
added docs/site-documentation/templates/page.html +22 -0
new file mode 100644
@@ -0,0 +1,22 @@
1+{% extends "base.html" %}
2+{% block title %}{{ page.title }} · {{ config.title }}{% endblock %}
3+{% block description %}{{ page.description | default(value=config.description) }}{% endblock %}
4+{% block alternates %}
5+{%- for t in page.translations %}
6+<link rel="alternate" hreflang="{{ t.lang }}" href="{{ t.permalink }}">
7+{%- endfor %}
8+{% endblock %}
9+{% block content %}
10+<article class="prose">
11+ <h1>{{ page.title }}</h1>
12+ {%- if page.description %}
13+ <p class="lede">{{ page.description }}</p>
14+ {%- endif %}
15+ {{ page.content | safe }}
16+
17+ <nav class="pager" aria-label="{{ trans(key='pager', lang=lang) }}">
18+ {%- if page.lower %}<a class="prev" href="{{ page.lower.permalink }}"><span>{{ trans(key="prev", lang=lang) }}</span>{{ page.lower.title }}</a>{% endif %}
19+ {%- if page.higher %}<a class="next" href="{{ page.higher.permalink }}"><span>{{ trans(key="next", lang=lang) }}</span>{{ page.higher.title }}</a>{% endif %}
20+ </nav>
21+</article>
22+{% endblock %}
new file mode 100644
@@ -0,0 +1,22 @@
1+{% extends "base.html" %}
2+{% block title %}{{ page.title }} · {{ config.title }}{% endblock %}
3+{% block description %}{{ page.description | default(value=config.description) }}{% endblock %}
4+{% block alternates %}
5+{%- for t in page.translations %}
6+<link rel="alternate" hreflang="{{ t.lang }}" href="{{ t.permalink }}">
7+{%- endfor %}
8+{% endblock %}
9+{% block content %}
10+<article class="prose">
11+ <h1>{{ page.title }}</h1>
12+ {%- if page.description %}
13+ <p class="lede">{{ page.description }}</p>
14+ {%- endif %}
15+ {{ page.content | safe }}
16+
17+ <nav class="pager" aria-label="{{ trans(key='pager', lang=lang) }}">
18+ {%- if page.lower %}<a class="prev" href="{{ page.lower.permalink }}"><span>{{ trans(key="prev", lang=lang) }}</span>{{ page.lower.title }}</a>{% endif %}
19+ {%- if page.higher %}<a class="next" href="{{ page.higher.permalink }}"><span>{{ trans(key="next", lang=lang) }}</span>{{ page.higher.title }}</a>{% endif %}
20+ </nav>
21+</article>
22+{% endblock %}
added docs/site-documentation/templates/section.html +26 -0
new file mode 100644
@@ -0,0 +1,26 @@
1+{% extends "base.html" %}
2+{% block title %}{{ section.title }} · {{ config.title }}{% endblock %}
3+{% block description %}{{ section.description | default(value=config.description) }}{% endblock %}
4+{% block alternates %}
5+{%- for t in section.translations %}
6+<link rel="alternate" hreflang="{{ t.lang }}" href="{{ t.permalink }}">
7+{%- endfor %}
8+{% endblock %}
9+{% block content %}
10+<article class="prose">
11+ <h1>{{ section.title }}</h1>
12+ {%- if section.description %}
13+ <p class="lede">{{ section.description }}</p>
14+ {%- endif %}
15+ {{ section.content | safe }}
16+
17+ <div class="cards">
18+ {%- for p in section.pages %}
19+ <a class="card" href="{{ p.permalink }}">
20+ <span class="card-title">{{ p.title }}</span>
21+ {%- if p.description %}<span class="card-desc">{{ p.description }}</span>{% endif %}
22+ </a>
23+ {%- endfor %}
24+ </div>
25+</article>
26+{% endblock %}
new file mode 100644
@@ -0,0 +1,26 @@
1+{% extends "base.html" %}
2+{% block title %}{{ section.title }} · {{ config.title }}{% endblock %}
3+{% block description %}{{ section.description | default(value=config.description) }}{% endblock %}
4+{% block alternates %}
5+{%- for t in section.translations %}
6+<link rel="alternate" hreflang="{{ t.lang }}" href="{{ t.permalink }}">
7+{%- endfor %}
8+{% endblock %}
9+{% block content %}
10+<article class="prose">
11+ <h1>{{ section.title }}</h1>
12+ {%- if section.description %}
13+ <p class="lede">{{ section.description }}</p>
14+ {%- endif %}
15+ {{ section.content | safe }}
16+
17+ <div class="cards">
18+ {%- for p in section.pages %}
19+ <a class="card" href="{{ p.permalink }}">
20+ <span class="card-title">{{ p.title }}</span>
21+ {%- if p.description %}<span class="card-desc">{{ p.description }}</span>{% endif %}
22+ </a>
23+ {%- endfor %}
24+ </div>
25+</article>
26+{% endblock %}
modified docs/slides/demo/seed.mjs +31 -2
@@ -66,6 +66,8 @@ out.push('BEGIN;');
6666 // ---------------------------------------------------------------- catégories
6767
6868 // L'ordre de création (= ordre des UUIDv7) fixe la couleur : PALETTE[rang].
69+// `group` met la catégorie à part : son temps sort des stats de l'équipe et
70+// se lit dans un panneau dédié. Ici, le temps de présence avec le bébé.
6971 const categories = [
7072 { team: 'Maison', name: 'Cuisine' },
7173 { team: 'Maison', name: 'Courses' },
@@ -76,14 +78,20 @@ const categories = [
7678 { team: 'Asso du quartier', name: 'Réunions' },
7779 { team: 'Asso du quartier', name: 'Buvette' },
7880 { team: 'Asso du quartier', name: 'Communication' },
81+ { team: 'Maison', name: 'Jeux', group: 'Temps avec Alix' },
82+ { team: 'Maison', name: 'Histoires', group: 'Temps avec Alix' },
83+ { team: 'Maison', name: 'Balade', group: 'Temps avec Alix' },
84+ { team: 'Maison', name: 'Jardin', archived: true },
7985 ];
8086 const catId = {};
8187 categories.forEach((c, i) => {
8288 const ms = dayMs(-60) + i * 60_000;
8389 catId[c.name] = uuidv7(ms);
90+ const grp = c.group ? `'${c.group.replace(/'/g, "''")}'` : 'NULL';
8491 out.push(
85- `INSERT INTO categories (id, name, archived, created_at, team_id)` +
86- ` VALUES ('${catId[c.name]}', '${c.name}', FALSE, '${new Date(ms).toISOString()}', ${team(c.team)});`,
92+ `INSERT INTO categories (id, name, archived, created_at, team_id, group_name)` +
93+ ` VALUES ('${catId[c.name]}', '${c.name}', ${c.archived ? 'TRUE' : 'FALSE'},` +
94+ ` '${new Date(ms).toISOString()}', ${team(c.team)}, ${grp});`,
8795 );
8896 });
8997
@@ -113,6 +121,14 @@ const habits = [
113121 ['Communication', 'noa', 0.2, 20, 60],
114122 ['Communication', 'camille', 0.05, 20, 40],
115123 ['Communication', 'sacha', 0.03, 20, 40],
124+ // Temps avec Alix : mis à part, donc absent des stats d'équipe et lisible
125+ // dans son propre panneau. Sacha en fait un peu plus que camille.
126+ ['Jeux', 'camille', 0.5, 20, 45],
127+ ['Jeux', 'sacha', 0.6, 25, 60],
128+ ['Histoires', 'camille', 0.55, 10, 25],
129+ ['Histoires', 'sacha', 0.45, 10, 20],
130+ ['Balade', 'camille', 0.2, 45, 90],
131+ ['Balade', 'sacha', 0.25, 45, 120],
116132 ];
117133 let entries = 0;
118134 for (let d = -55; d <= 0; d++) {
@@ -191,6 +207,19 @@ const todos = [
191207 changes: [[-2, 2, 'sacha']],
192208 assignees: ['sacha'],
193209 },
210+ {
211+ // Prise par camille : le compte des captures voit le verrou de son côté
212+ // (bouton « Relâcher » et « J'ai fini »).
213+ name: 'Ranger la chambre d’Alix',
214+ cat: 'Enfants',
215+ created: -5,
216+ activation: -1,
217+ state: 1,
218+ changes: [
219+ [-5, 2, 'sacha'],
220+ [0, 1, 'camille'],
221+ ],
222+ },
194223 ];
195224 for (const t of todos) {
196225 const id = uuidv7(dayMs(t.created));
@@ -66,6 +66,8 @@ out.push('BEGIN;');
66 // ---------------------------------------------------------------- catégories66 // ---------------------------------------------------------------- catégories
67 67
68 // L'ordre de création (= ordre des UUIDv7) fixe la couleur : PALETTE[rang].68 // L'ordre de création (= ordre des UUIDv7) fixe la couleur : PALETTE[rang].
69+// `group` met la catégorie à part : son temps sort des stats de l'équipe et
70+// se lit dans un panneau dédié. Ici, le temps de présence avec le bébé.
69 const categories = [71 const categories = [
70 { team: 'Maison', name: 'Cuisine' },72 { team: 'Maison', name: 'Cuisine' },
71 { team: 'Maison', name: 'Courses' },73 { team: 'Maison', name: 'Courses' },
@@ -76,14 +78,20 @@ const categories = [
76 { team: 'Asso du quartier', name: 'Réunions' },78 { team: 'Asso du quartier', name: 'Réunions' },
77 { team: 'Asso du quartier', name: 'Buvette' },79 { team: 'Asso du quartier', name: 'Buvette' },
78 { team: 'Asso du quartier', name: 'Communication' },80 { team: 'Asso du quartier', name: 'Communication' },
81+ { team: 'Maison', name: 'Jeux', group: 'Temps avec Alix' },
82+ { team: 'Maison', name: 'Histoires', group: 'Temps avec Alix' },
83+ { team: 'Maison', name: 'Balade', group: 'Temps avec Alix' },
84+ { team: 'Maison', name: 'Jardin', archived: true },
79 ];85 ];
80 const catId = {};86 const catId = {};
81 categories.forEach((c, i) => {87 categories.forEach((c, i) => {
82 const ms = dayMs(-60) + i * 60_000;88 const ms = dayMs(-60) + i * 60_000;
83 catId[c.name] = uuidv7(ms);89 catId[c.name] = uuidv7(ms);
90+ const grp = c.group ? `'${c.group.replace(/'/g, "''")}'` : 'NULL';
84 out.push(91 out.push(
85- `INSERT INTO categories (id, name, archived, created_at, team_id)` +92+ `INSERT INTO categories (id, name, archived, created_at, team_id, group_name)` +
86- ` VALUES ('${catId[c.name]}', '${c.name}', FALSE, '${new Date(ms).toISOString()}', ${team(c.team)});`,93+ ` VALUES ('${catId[c.name]}', '${c.name}', ${c.archived ? 'TRUE' : 'FALSE'},` +
94+ ` '${new Date(ms).toISOString()}', ${team(c.team)}, ${grp});`,
87 );95 );
88 });96 });
89 97
@@ -113,6 +121,14 @@ const habits = [
113 ['Communication', 'noa', 0.2, 20, 60],121 ['Communication', 'noa', 0.2, 20, 60],
114 ['Communication', 'camille', 0.05, 20, 40],122 ['Communication', 'camille', 0.05, 20, 40],
115 ['Communication', 'sacha', 0.03, 20, 40],123 ['Communication', 'sacha', 0.03, 20, 40],
124+ // Temps avec Alix : mis à part, donc absent des stats d'équipe et lisible
125+ // dans son propre panneau. Sacha en fait un peu plus que camille.
126+ ['Jeux', 'camille', 0.5, 20, 45],
127+ ['Jeux', 'sacha', 0.6, 25, 60],
128+ ['Histoires', 'camille', 0.55, 10, 25],
129+ ['Histoires', 'sacha', 0.45, 10, 20],
130+ ['Balade', 'camille', 0.2, 45, 90],
131+ ['Balade', 'sacha', 0.25, 45, 120],
116 ];132 ];
117 let entries = 0;133 let entries = 0;
118 for (let d = -55; d <= 0; d++) {134 for (let d = -55; d <= 0; d++) {
@@ -191,6 +207,19 @@ const todos = [
191 changes: [[-2, 2, 'sacha']],207 changes: [[-2, 2, 'sacha']],
192 assignees: ['sacha'],208 assignees: ['sacha'],
193 },209 },
210+ {
211+ // Prise par camille : le compte des captures voit le verrou de son côté
212+ // (bouton « Relâcher » et « J'ai fini »).
213+ name: 'Ranger la chambre d’Alix',
214+ cat: 'Enfants',
215+ created: -5,
216+ activation: -1,
217+ state: 1,
218+ changes: [
219+ [-5, 2, 'sacha'],
220+ [0, 1, 'camille'],
221+ ],
222+ },
194 ];223 ];
195 for (const t of todos) {224 for (const t of todos) {
196 const id = uuidv7(dayMs(t.created));225 const id = uuidv7(dayMs(t.created));