judu/ex-egopublic Fork
⑂ 97f0da3
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

feat(changelog): premières annonces (priorités des tâches, page Sécurité) — version 0.3.0Unverified

Julien Durillon committed 2026-08-26T18:06:44+02:00 Browse files
97f0da3 parent: b0ed1ae
modified Cargo.lock +1 -1
@@ -837,7 +837,7 @@ dependencies = [
837837
838838 [[package]]
839839 name = "exego"
840-version = "0.1.0"
840+version = "0.3.0"
841841 dependencies = [
842842 "anyhow",
843843 "argon2",
@@ -837,7 +837,7 @@ dependencies = [
837 837
838 [[package]]838 [[package]]
839 name = "exego"839 name = "exego"
840-version = "0.1.0"840+version = "0.3.0"
841 dependencies = [841 dependencies = [
842 "anyhow",842 "anyhow",
843 "argon2",843 "argon2",
modified Cargo.toml +1 -1
@@ -1,6 +1,6 @@
11 [package]
22 name = "exego"
3-version = "0.1.0"
3+version = "0.3.0"
44 edition = "2024"
55 license = "Unlicense"
66
@@ -1,6 +1,6 @@
1 [package]1 [package]
2 name = "exego"2 name = "exego"
3-version = "0.1.0"3+version = "0.3.0"
4 edition = "2024"4 edition = "2024"
5 license = "Unlicense"5 license = "Unlicense"
6 6
modified assets/style.css +13 -3
@@ -91,7 +91,8 @@
9191 --shadow-md: 0 0 0 1px rgba(255, 255, 255, .34);
9292 --shadow-lg: 0 0 0 1px rgba(255, 255, 255, .42);
9393
94- /* Pas de rouge en HC : liseré épais neutre, le symbole ‼ porte l'info. */
94+ /* Pas de rouge en HC : liseré épais neutre, la pilule « prio » porte
95+ l'info (blanc, texte noir). */
9596 --color-prio: #ffffff;
9697 }
9798 /* Le toast s'inverse : son fond neutral-900 devient noir en HC. */
@@ -728,12 +729,21 @@ h4.add_step_title { margin-top: var(--space-3); margin-bottom: var(--space-3); d
728729 .todo-card.other { background: var(--color-neutral-200); }
729730 .todo-card.forme { box-shadow: inset 0 0 0 1.5px var(--color-accent-2); }
730731 /* Priorité haute : liseré + ombre teintée (après .forme : il prime si les
731- deux s'appliquent). Le symbole ‼ (aria-label) double la couleur. */
732+ deux s'appliquent). La pilule « prio » double la couleur en texte. */
732733 .todo-card.prio-haute {
733734 box-shadow: inset 0 0 0 2px var(--color-prio),
734735 0 3px 10px color-mix(in srgb, var(--color-prio) 30%, transparent);
735736 }
736-.prio-flag { color: var(--color-prio); font-weight: 700; }
737+/* Pilule « prio » en haut à droite de la carte, avant le crayon. Texte crème
738+ sur le rouge brique : 5.6:1 ; en HC la pilule s'inverse (blanc sur noir)
739+ puisque --color-prio y vaut blanc et --color-bg noir. */
740+.prio-pill {
741+ flex: none; align-self: flex-start;
742+ background: var(--color-prio); color: var(--color-bg);
743+ font-size: 11px; font-weight: 700; line-height: 1;
744+ letter-spacing: .05em; text-transform: uppercase;
745+ padding: 5px 10px; border-radius: 999px;
746+}
737747 .todo-main { display: flex; align-items: center; gap: var(--space-3); }
738748 .todo-name { font-size: 16px; }
739749 .todo-meta { font-size: 13px; opacity: .7; }
@@ -91,7 +91,8 @@
91 --shadow-md: 0 0 0 1px rgba(255, 255, 255, .34);91 --shadow-md: 0 0 0 1px rgba(255, 255, 255, .34);
92 --shadow-lg: 0 0 0 1px rgba(255, 255, 255, .42);92 --shadow-lg: 0 0 0 1px rgba(255, 255, 255, .42);
93 93
94- /* Pas de rouge en HC : liseré épais neutre, le symbole ‼ porte l'info. */94+ /* Pas de rouge en HC : liseré épais neutre, la pilule « prio » porte
95+ l'info (blanc, texte noir). */
95 --color-prio: #ffffff;96 --color-prio: #ffffff;
96 }97 }
97 /* Le toast s'inverse : son fond neutral-900 devient noir en HC. */98 /* Le toast s'inverse : son fond neutral-900 devient noir en HC. */
@@ -728,12 +729,21 @@ h4.add_step_title { margin-top: var(--space-3); margin-bottom: var(--space-3); d
728 .todo-card.other { background: var(--color-neutral-200); }729 .todo-card.other { background: var(--color-neutral-200); }
729 .todo-card.forme { box-shadow: inset 0 0 0 1.5px var(--color-accent-2); }730 .todo-card.forme { box-shadow: inset 0 0 0 1.5px var(--color-accent-2); }
730 /* Priorité haute : liseré + ombre teintée (après .forme : il prime si les731 /* Priorité haute : liseré + ombre teintée (après .forme : il prime si les
731- deux s'appliquent). Le symbole ‼ (aria-label) double la couleur. */732+ deux s'appliquent). La pilule « prio » double la couleur en texte. */
732 .todo-card.prio-haute {733 .todo-card.prio-haute {
733 box-shadow: inset 0 0 0 2px var(--color-prio),734 box-shadow: inset 0 0 0 2px var(--color-prio),
734 0 3px 10px color-mix(in srgb, var(--color-prio) 30%, transparent);735 0 3px 10px color-mix(in srgb, var(--color-prio) 30%, transparent);
735 }736 }
736-.prio-flag { color: var(--color-prio); font-weight: 700; }737+/* Pilule « prio » en haut à droite de la carte, avant le crayon. Texte crème
738+ sur le rouge brique : 5.6:1 ; en HC la pilule s'inverse (blanc sur noir)
739+ puisque --color-prio y vaut blanc et --color-bg noir. */
740+.prio-pill {
741+ flex: none; align-self: flex-start;
742+ background: var(--color-prio); color: var(--color-bg);
743+ font-size: 11px; font-weight: 700; line-height: 1;
744+ letter-spacing: .05em; text-transform: uppercase;
745+ padding: 5px 10px; border-radius: 999px;
746+}
737 .todo-main { display: flex; align-items: center; gap: var(--space-3); }747 .todo-main { display: flex; align-items: center; gap: var(--space-3); }
738 .todo-name { font-size: 16px; }748 .todo-name { font-size: 16px; }
739 .todo-meta { font-size: 13px; opacity: .7; }749 .todo-meta { font-size: 13px; opacity: .7; }
added migrations/0017_changelog_priorites_securite.sql +30 -0
new file mode 100644
@@ -0,0 +1,30 @@
1+-- Deux premières annonces de changelog (cf. 0016 pour le mécanisme).
2+--
3+-- Les ids sont des UUIDv7 générés à la main au moment de l'écriture ; les
4+-- dates sont éditoriales : « priorités » est antidatée à la veille de la
5+-- mise en place du changelog, « Sécurité » porte le jour du déploiement.
6+-- La version est du texte libre affiché dans le titre (« Nouveautés de la
7+-- v0.2.0 ») — retouchable en psql si le numéro ne convient pas.
8+--
9+-- Rappel : une ligne de texte = un paragraphe à l'affichage, et chaque
10+-- annonce n'est visible que des comptes créés strictement avant sa date.
11+
12+INSERT INTO changelog_announcements (id, date, version, text_fr, text_en, text_de, text_ptbr) VALUES
13+(
14+ '01a03ec5-b676-7e83-b4a6-801ee0a1ad9d',
15+ DATE '2026-08-25',
16+ 'v0.2.0',
17+ E'Les tâches ont maintenant une priorité : basse, normale ou haute. Les hautes passent en tête de liste avec un marqueur rouge, les basses ferment la liste.\nTu la règles en créant ou en modifiant la tâche ; par défaut, elle est normale.',
18+ E'Tasks now have a priority: low, normal or high. High tasks move to the top of the list with a red marker; low ones close the list.\nYou set it when creating or editing a task; it defaults to normal.',
19+ E'Aufgaben haben jetzt eine Priorität: niedrig, normal oder hoch. Hohe Aufgaben rücken mit roter Markierung an die Spitze der Liste, niedrige ans Ende.\nDu legst sie beim Anlegen oder Bearbeiten der Aufgabe fest; Standard ist Normal.',
20+ E'As tarefas agora têm prioridade: baixa, normal ou alta. As altas sobem para o topo da lista com um marcador vermelho, as baixas fecham a lista.\nVocê define a prioridade ao criar ou editar a tarefa; o padrão é normal.'
21+),
22+(
23+ '01a03ec5-b677-77f1-96bd-95035fb9c316',
24+ DATE '2026-08-26',
25+ 'v0.3.0',
26+ E'Le changement de mot de passe a déménagé sur la nouvelle page Sécurité, accessible depuis les Réglages.\nTu peux aussi y enregistrer des clés d''accès (passkeys) et te connecter par empreinte, visage ou code de l''appareil. Le mot de passe fonctionnera toujours.',
27+ E'Changing your password has moved to the new Security page, reachable from Settings.\nYou can also register passkeys there and sign in with your fingerprint, face or device code. Your password will still work.',
28+ E'Die Passwortänderung ist auf die neue Seite Sicherheit umgezogen, erreichbar über die Optionen.\nDort kannst du auch Passkeys hinterlegen und dich per Fingerabdruck, Gesicht oder Gerätecode anmelden. Das Passwort verschwindet nicht.',
29+ E'A troca de senha mudou para a nova página Segurança, acessível pelos Ajustes.\nVocê também pode registrar chaves de acesso (passkeys) por lá e entrar com impressão digital, rosto ou código do aparelho. A senha não vai embora.'
30+);
new file mode 100644
@@ -0,0 +1,30 @@
1+-- Deux premières annonces de changelog (cf. 0016 pour le mécanisme).
2+--
3+-- Les ids sont des UUIDv7 générés à la main au moment de l'écriture ; les
4+-- dates sont éditoriales : « priorités » est antidatée à la veille de la
5+-- mise en place du changelog, « Sécurité » porte le jour du déploiement.
6+-- La version est du texte libre affiché dans le titre (« Nouveautés de la
7+-- v0.2.0 ») — retouchable en psql si le numéro ne convient pas.
8+--
9+-- Rappel : une ligne de texte = un paragraphe à l'affichage, et chaque
10+-- annonce n'est visible que des comptes créés strictement avant sa date.
11+
12+INSERT INTO changelog_announcements (id, date, version, text_fr, text_en, text_de, text_ptbr) VALUES
13+(
14+ '01a03ec5-b676-7e83-b4a6-801ee0a1ad9d',
15+ DATE '2026-08-25',
16+ 'v0.2.0',
17+ E'Les tâches ont maintenant une priorité : basse, normale ou haute. Les hautes passent en tête de liste avec un marqueur rouge, les basses ferment la liste.\nTu la règles en créant ou en modifiant la tâche ; par défaut, elle est normale.',
18+ E'Tasks now have a priority: low, normal or high. High tasks move to the top of the list with a red marker; low ones close the list.\nYou set it when creating or editing a task; it defaults to normal.',
19+ E'Aufgaben haben jetzt eine Priorität: niedrig, normal oder hoch. Hohe Aufgaben rücken mit roter Markierung an die Spitze der Liste, niedrige ans Ende.\nDu legst sie beim Anlegen oder Bearbeiten der Aufgabe fest; Standard ist Normal.',
20+ E'As tarefas agora têm prioridade: baixa, normal ou alta. As altas sobem para o topo da lista com um marcador vermelho, as baixas fecham a lista.\nVocê define a prioridade ao criar ou editar a tarefa; o padrão é normal.'
21+),
22+(
23+ '01a03ec5-b677-77f1-96bd-95035fb9c316',
24+ DATE '2026-08-26',
25+ 'v0.3.0',
26+ E'Le changement de mot de passe a déménagé sur la nouvelle page Sécurité, accessible depuis les Réglages.\nTu peux aussi y enregistrer des clés d''accès (passkeys) et te connecter par empreinte, visage ou code de l''appareil. Le mot de passe fonctionnera toujours.',
27+ E'Changing your password has moved to the new Security page, reachable from Settings.\nYou can also register passkeys there and sign in with your fingerprint, face or device code. Your password will still work.',
28+ E'Die Passwortänderung ist auf die neue Seite Sicherheit umgezogen, erreichbar über die Optionen.\nDort kannst du auch Passkeys hinterlegen und dich per Fingerabdruck, Gesicht oder Gerätecode anmelden. Das Passwort verschwindet nicht.',
29+ E'A troca de senha mudou para a nova página Segurança, acessível pelos Ajustes.\nVocê também pode registrar chaves de acesso (passkeys) por lá e entrar com impressão digital, rosto ou código do aparelho. A senha não vai embora.'
30+);
modified src/i18n.rs +5 -0
@@ -360,6 +360,7 @@ pub struct Tr {
360360 pub prio_normal: &'static str,
361361 pub prio_high: &'static str,
362362 pub prio_high_aria: &'static str,
363+ pub prio_pill: &'static str,
363364 // ─── sécurité (page mot de passe + clés d'accès WebAuthn) ───
364365 pub title_security: &'static str,
365366 /// Carte d'entrée depuis Réglages (gabarit « Mes saisies »).
@@ -698,6 +699,7 @@ pub static FR: Tr = Tr {
698699 prio_normal: "Normale",
699700 prio_high: "Haute",
700701 prio_high_aria: "Priorité haute",
702+ prio_pill: "prio",
701703 title_security: "Sécurité",
702704 security_card_desc: "Mot de passe et clés d'accès",
703705 security_hint: "Ton mot de passe reste toujours valable — les clés d'accès s'y ajoutent, elles ne le remplacent pas.",
@@ -1001,6 +1003,7 @@ pub static EN: Tr = Tr {
10011003 prio_normal: "Normal",
10021004 prio_high: "High",
10031005 prio_high_aria: "High priority",
1006+ prio_pill: "prio",
10041007 title_security: "Security",
10051008 security_card_desc: "Password and passkeys",
10061009 security_hint: "Your password always keeps working — passkeys come on top of it, they don't replace it.",
@@ -1304,6 +1307,7 @@ pub static DE: Tr = Tr {
13041307 prio_normal: "Normal",
13051308 prio_high: "Hoch",
13061309 prio_high_aria: "Hohe Priorität",
1310+ prio_pill: "prio",
13071311 title_security: "Sicherheit",
13081312 security_card_desc: "Passwort und Passkeys",
13091313 security_hint: "Dein Passwort gilt weiterhin — Passkeys kommen dazu, sie ersetzen es nicht.",
@@ -1607,6 +1611,7 @@ pub static PT_BR: Tr = Tr {
16071611 prio_normal: "Normal",
16081612 prio_high: "Alta",
16091613 prio_high_aria: "Prioridade alta",
1614+ prio_pill: "prio",
16101615 title_security: "Segurança",
16111616 security_card_desc: "Senha e chaves de acesso",
16121617 security_hint: "Sua senha continua valendo — as chaves de acesso se somam a ela, não a substituem.",
@@ -360,6 +360,7 @@ pub struct Tr {
360 pub prio_normal: &'static str,360 pub prio_normal: &'static str,
361 pub prio_high: &'static str,361 pub prio_high: &'static str,
362 pub prio_high_aria: &'static str,362 pub prio_high_aria: &'static str,
363+ pub prio_pill: &'static str,
363 // ─── sécurité (page mot de passe + clés d'accès WebAuthn) ───364 // ─── sécurité (page mot de passe + clés d'accès WebAuthn) ───
364 pub title_security: &'static str,365 pub title_security: &'static str,
365 /// Carte d'entrée depuis Réglages (gabarit « Mes saisies »).366 /// Carte d'entrée depuis Réglages (gabarit « Mes saisies »).
@@ -698,6 +699,7 @@ pub static FR: Tr = Tr {
698 prio_normal: "Normale",699 prio_normal: "Normale",
699 prio_high: "Haute",700 prio_high: "Haute",
700 prio_high_aria: "Priorité haute",701 prio_high_aria: "Priorité haute",
702+ prio_pill: "prio",
701 title_security: "Sécurité",703 title_security: "Sécurité",
702 security_card_desc: "Mot de passe et clés d'accès",704 security_card_desc: "Mot de passe et clés d'accès",
703 security_hint: "Ton mot de passe reste toujours valable — les clés d'accès s'y ajoutent, elles ne le remplacent pas.",705 security_hint: "Ton mot de passe reste toujours valable — les clés d'accès s'y ajoutent, elles ne le remplacent pas.",
@@ -1001,6 +1003,7 @@ pub static EN: Tr = Tr {
1001 prio_normal: "Normal",1003 prio_normal: "Normal",
1002 prio_high: "High",1004 prio_high: "High",
1003 prio_high_aria: "High priority",1005 prio_high_aria: "High priority",
1006+ prio_pill: "prio",
1004 title_security: "Security",1007 title_security: "Security",
1005 security_card_desc: "Password and passkeys",1008 security_card_desc: "Password and passkeys",
1006 security_hint: "Your password always keeps working — passkeys come on top of it, they don't replace it.",1009 security_hint: "Your password always keeps working — passkeys come on top of it, they don't replace it.",
@@ -1304,6 +1307,7 @@ pub static DE: Tr = Tr {
1304 prio_normal: "Normal",1307 prio_normal: "Normal",
1305 prio_high: "Hoch",1308 prio_high: "Hoch",
1306 prio_high_aria: "Hohe Priorität",1309 prio_high_aria: "Hohe Priorität",
1310+ prio_pill: "prio",
1307 title_security: "Sicherheit",1311 title_security: "Sicherheit",
1308 security_card_desc: "Passwort und Passkeys",1312 security_card_desc: "Passwort und Passkeys",
1309 security_hint: "Dein Passwort gilt weiterhin — Passkeys kommen dazu, sie ersetzen es nicht.",1313 security_hint: "Dein Passwort gilt weiterhin — Passkeys kommen dazu, sie ersetzen es nicht.",
@@ -1607,6 +1611,7 @@ pub static PT_BR: Tr = Tr {
1607 prio_normal: "Normal",1611 prio_normal: "Normal",
1608 prio_high: "Alta",1612 prio_high: "Alta",
1609 prio_high_aria: "Prioridade alta",1613 prio_high_aria: "Prioridade alta",
1614+ prio_pill: "prio",
1610 title_security: "Segurança",1615 title_security: "Segurança",
1611 security_card_desc: "Senha e chaves de acesso",1616 security_card_desc: "Senha e chaves de acesso",
1612 security_hint: "Sua senha continua valendo — as chaves de acesso se somam a ela, não a substituem.",1617 security_hint: "Sua senha continua valendo — as chaves de acesso se somam a ela, não a substituem.",
modified templates/todos.html +8 -2
@@ -28,7 +28,7 @@
2828 <div class="todo-main">
2929 <span class="team-dot" style="background:{{ t.color }}"></span>
3030 <div style="flex:1;min-width:0">
31- <div class="todo-name">{{ t.name }}{% if t.high %} <span class="prio-flag" role="img" aria-label="{{ shell.tr.prio_high_aria }}">&#8252;&#xFE0E;</span>{% endif %}</div>
31+ <div class="todo-name">{{ t.name }}</div>
3232 <div class="todo-meta">{{ t.meta }}</div>
3333 {% if !t.assignees.is_empty() %}
3434 <div class="asg-chips">
@@ -36,6 +36,9 @@
3636 </div>
3737 {% endif %}
3838 </div>
39+ {% if t.high %}
40+ <span class="prio-pill"><span aria-hidden="true">{{ shell.tr.prio_pill }}</span><span class="visually-hidden">{{ shell.tr.prio_high_aria }}</span></span>
41+ {% endif %}
3942 {% if t.mine %}
4043 <a class="btn btn-secondary btn-icon" style="flex:none" href="/taches/{{ t.id }}/modifier" aria-label="{{ t.edit_aria }}">
4144 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg>
@@ -74,7 +77,7 @@
7477 <div class="todo-main">
7578 <span class="team-dot" style="background:{{ t.color }}"></span>
7679 <div style="flex:1;min-width:0">
77- <div class="todo-name">{{ t.name }}{% if t.high %} <span class="prio-flag" role="img" aria-label="{{ shell.tr.prio_high_aria }}">&#8252;&#xFE0E;</span>{% endif %}</div>
80+ <div class="todo-name">{{ t.name }}</div>
7881 <div class="todo-meta{% if t.late %} late{% endif %}">{{ t.meta }}</div>
7982 {% if !t.assignees.is_empty() %}
8083 <div class="asg-chips">
@@ -82,6 +85,9 @@
8285 </div>
8386 {% endif %}
8487 </div>
88+ {% if t.high %}
89+ <span class="prio-pill"><span aria-hidden="true">{{ shell.tr.prio_pill }}</span><span class="visually-hidden">{{ shell.tr.prio_high_aria }}</span></span>
90+ {% endif %}
8591 <a class="btn btn-secondary btn-icon" style="flex:none" href="/taches/{{ t.id }}/modifier" aria-label="{{ t.edit_aria }}">
8692 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg>
8793 </a>
@@ -28,7 +28,7 @@
28 <div class="todo-main">28 <div class="todo-main">
29 <span class="team-dot" style="background:{{ t.color }}"></span>29 <span class="team-dot" style="background:{{ t.color }}"></span>
30 <div style="flex:1;min-width:0">30 <div style="flex:1;min-width:0">
31- <div class="todo-name">{{ t.name }}{% if t.high %} <span class="prio-flag" role="img" aria-label="{{ shell.tr.prio_high_aria }}">&#8252;&#xFE0E;</span>{% endif %}</div>31+ <div class="todo-name">{{ t.name }}</div>
32 <div class="todo-meta">{{ t.meta }}</div>32 <div class="todo-meta">{{ t.meta }}</div>
33 {% if !t.assignees.is_empty() %}33 {% if !t.assignees.is_empty() %}
34 <div class="asg-chips">34 <div class="asg-chips">
@@ -36,6 +36,9 @@
36 </div>36 </div>
37 {% endif %}37 {% endif %}
38 </div>38 </div>
39+ {% if t.high %}
40+ <span class="prio-pill"><span aria-hidden="true">{{ shell.tr.prio_pill }}</span><span class="visually-hidden">{{ shell.tr.prio_high_aria }}</span></span>
41+ {% endif %}
39 {% if t.mine %}42 {% if t.mine %}
40 <a class="btn btn-secondary btn-icon" style="flex:none" href="/taches/{{ t.id }}/modifier" aria-label="{{ t.edit_aria }}">43 <a class="btn btn-secondary btn-icon" style="flex:none" href="/taches/{{ t.id }}/modifier" aria-label="{{ t.edit_aria }}">
41 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg>44 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg>
@@ -74,7 +77,7 @@
74 <div class="todo-main">77 <div class="todo-main">
75 <span class="team-dot" style="background:{{ t.color }}"></span>78 <span class="team-dot" style="background:{{ t.color }}"></span>
76 <div style="flex:1;min-width:0">79 <div style="flex:1;min-width:0">
77- <div class="todo-name">{{ t.name }}{% if t.high %} <span class="prio-flag" role="img" aria-label="{{ shell.tr.prio_high_aria }}">&#8252;&#xFE0E;</span>{% endif %}</div>80+ <div class="todo-name">{{ t.name }}</div>
78 <div class="todo-meta{% if t.late %} late{% endif %}">{{ t.meta }}</div>81 <div class="todo-meta{% if t.late %} late{% endif %}">{{ t.meta }}</div>
79 {% if !t.assignees.is_empty() %}82 {% if !t.assignees.is_empty() %}
80 <div class="asg-chips">83 <div class="asg-chips">
@@ -82,6 +85,9 @@
82 </div>85 </div>
83 {% endif %}86 {% endif %}
84 </div>87 </div>
88+ {% if t.high %}
89+ <span class="prio-pill"><span aria-hidden="true">{{ shell.tr.prio_pill }}</span><span class="visually-hidden">{{ shell.tr.prio_high_aria }}</span></span>
90+ {% endif %}
85 <a class="btn btn-secondary btn-icon" style="flex:none" href="/taches/{{ t.id }}/modifier" aria-label="{{ t.edit_aria }}">91 <a class="btn btn-secondary btn-icon" style="flex:none" href="/taches/{{ t.id }}/modifier" aria-label="{{ t.edit_aria }}">
86 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg>92 <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"></path><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"></path></svg>
87 </a>93 </a>