diff --git a/CHANGELOG.md b/CHANGELOG.md index 16972d3..4af0113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## 0.42.0 — 2026-10-28 — Lot UX complet (#57 à #68) + +- **#57 Jetons** : échelle fermée documentée (typo xs/sm/base/lg/xl, rayons sm/md/base/full, ombres, espacements) ; rayons pilule passés au jeton `--radius-full`. +- **#58 Boutons** : système primary uni (fini les dégradés), secondary, danger, icon 36px, états unifiés ; `.btn-save` et `.proj-primary` alignés sur le primary. +- **#59 Icônes** : emoji d'interface retirés des gabarits (cartes, tableaux, états vides, boutons, titres) ; épingler en SVG trait, recherche en SVG ; favicons et contenu utilisateur (titres/labels Gitea) inchangés. +- **#60 Accessibilité** : jeton `--accent-text` distinct (`#14b8a6` sombre, `#0f766e` clair, 5,47:1 sur blanc) pour tous les textes d'accent ; focus visible unifié. +- **#61 Typographie** : pile système assumée (Inter déclarée mais jamais chargée, pas de CDN tiers pour une app auto-hébergée) ; hiérarchie H1/H2 via `.page-title`. +- **#62 Pages** : Aujourd'hui et Focus reprennent l'en-tête `.page-head` / `.page-title` commun ; titre Aujourd'hui ramené à l'échelle xl. +- **#63 Navigation** : recherche en double supprimée de l'en-tête (palette Ctrl+K + recherche sidebar restent). +- **#64 Mobile** : cibles 44px sous 640px, en-tête et KPI compacts. +- **#65 États** : `.empty-state` / `.focus-empty` unifiés, classe `.skeleton` (pulsation, respect de `prefers-reduced-motion`). +- **#66 Formulaires** : classes `.field-error` / `.field-error-msg` (bordure rouge + message, jamais la couleur seule). +- **#67 Cartes** : titre clampé à 2 lignes, code discret, labels/chips en texte thème sur fond teinté `color-mix` (contraste garanti quelle que soit la couleur Gitea). +- **#68 Thème clair** : connexion et wallboard suivent le thème mémorisé (init avant rendu, comme `_header`) et ne restent plus sombres par défaut ; variantes claires ajoutées. + ## 0.41.0 — 2026-10-28 — Identité Kanbante : sidebar charbon, accent vert, icônes ligne, bouton thème en Administration (#54, #55) - **Sidebar (#54)** : fond charbon draco (`rgba(26, 28, 26, 0.96)`) à la place du bleu-noir `rgba(13, 16, 24)` oublié par le re-thème 0.39.0 — la barre latérale a désormais la même teinte que le reste du site, en sombre comme en clair (clair déjà blanc). diff --git a/app/config.py b/app/config.py index cbadc00..fbada76 100644 --- a/app/config.py +++ b/app/config.py @@ -177,7 +177,7 @@ from urllib.parse import urlparse BASE_DIR = Path(__file__).resolve().parent.parent -APP_VERSION = "0.41.0" +APP_VERSION = "0.42.0" def _env_bool(name: str, default: bool) -> bool: diff --git a/app/templates/_card.html b/app/templates/_card.html index 46c8e87..af02bdc 100644 --- a/app/templates/_card.html +++ b/app/templates/_card.html @@ -13,14 +13,14 @@ {% if issue.labels %}
{% for label in issue.labels %} - + {{ label.name }} {% endfor %}
{% endif %} {% if issue._code %} -
⑂{% if issue._code.branches %} 🌿 {{ issue._code.branches }}{% endif %}{% if issue._code.commits %} · {{ issue._code.commits }} commit{{ 's' if issue._code.commits > 1 }}{% endif %}{% if issue._code.pr %} · PR #{{ issue._code.pr.number }} {{ issue._code.pr.label }}{% endif %}
+
⑂{% if issue._code.branches %} {{ issue._code.branches }}{% endif %}{% if issue._code.commits %} · {{ issue._code.commits }} commit{{ 's' if issue._code.commits > 1 }}{% endif %}{% if issue._code.pr %} · PR #{{ issue._code.pr.number }} {{ issue._code.pr.label }}{% endif %}
{% endif %}
{% if issue.assignee %} @@ -30,8 +30,8 @@ {% set age = ages.get(issue.number) %} {% if age and age.days >= aging_days %} ⏳ {{ age.days }} j + title="Dans cette colonne depuis le {{ age.since[:10] }}">{{ age.days }} j {% endif %} - +
diff --git a/app/templates/_header.html b/app/templates/_header.html index 83bbac8..bb10f81 100644 --- a/app/templates/_header.html +++ b/app/templates/_header.html @@ -39,7 +39,7 @@ ("activity", "/activity", "📰", "Activité"), ]), ("outils", "Outils", [ - ("search", "/search", "🔍", "Recherche"), + ("search", "/search", "", "Recherche"), ("capture", "/capture", "⚡", "Capture"), ("archives", "/archives", "🗄️", "Archives"), ("wall", "/wall", "🖥️", "Wallboard"), @@ -164,7 +164,6 @@ {% if repo_info is defined and repo_info and repo_info.html_url %} 🔗 Gitea ↗ {% endif %} - diff --git a/app/templates/admin.html b/app/templates/admin.html index 9c1e523..b9b8cda 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -12,11 +12,11 @@
-

🛠️ Administration

+

Administration

Utilisateurs, vue d'ensemble et journal d'administration.

{% if msg %}

✅ {{ msg }}

{% endif %} - {% if err %}

⚠️ {{ err }}

{% endif %} + {% if err %}

{{ err }}

{% endif %}

👥 Utilisateurs ({{ users|length }})

@@ -79,7 +79,7 @@ 🔌 Connexions ({{ connections|length }}) · 🧭 Espaces ({{ workspaces|length }}) · 🎛️ Paramètres · - 🗄️ Archives + Archives

diff --git a/app/templates/admin_columns.html b/app/templates/admin_columns.html index 9af03c6..1d608b8 100644 --- a/app/templates/admin_columns.html +++ b/app/templates/admin_columns.html @@ -12,11 +12,11 @@
-

🧱 Colonnes du board

+

Colonnes du board

Espace : {{ workspace.name }} (change d'espace par le sélecteur en haut pour régler un autre board). Les colonnes sont propres à chaque espace : nom, couleur, ordre et mapping étiquette ↔ colonne. La clé d'une colonne ne change jamais (les cartes y sont rattachées) ; le nom affiché, lui, est libre.

{% if msg %}

✅ {{ msg }}

{% endif %} - {% if err %}

⚠️ {{ err }}

{% endif %} + {% if err %}

{{ err }}

{% endif %}

Comment marche le mapping

@@ -52,12 +52,12 @@
- +
- +
{% if c.kind == 'flow' %}
diff --git a/app/templates/admin_connections.html b/app/templates/admin_connections.html index d5716e5..c52e3de 100644 --- a/app/templates/admin_connections.html +++ b/app/templates/admin_connections.html @@ -12,11 +12,11 @@
-

🔌 Connexions aux forges

+

Connexions aux forges

Chaque connexion est un accès Gitea ou GitHub. Les jetons sont chiffrés au repos et ne sont jamais réaffichés — pour en changer un, saisis la nouvelle valeur.

{% if msg %}

✅ {{ msg }}

{% endif %} - {% if err %}

⚠️ {{ err }}

{% endif %} + {% if err %}

{{ err }}

{% endif %} {% for c in connections %}
@@ -41,7 +41,7 @@

- +

diff --git a/app/templates/admin_settings.html b/app/templates/admin_settings.html index edf0245..bd460b0 100644 --- a/app/templates/admin_settings.html +++ b/app/templates/admin_settings.html @@ -12,11 +12,11 @@
-

🎛️ Paramètres

+

Paramètres

L'environnement amorce, le panneau gouverne. Une valeur saisie ici remplace celle de l'environnement (sans redémarrage pour la plupart) ; un champ vidé revient à la valeur d'environnement. Les secrets et les réglages d'amorçage (base de données, clé maître, session, draco) restent en environnement, volontairement.

{% if msg %}

✅ {{ msg }}

{% endif %} - {% if err %}

⚠️ {{ err }}

{% endif %} + {% if err %}

{{ err }}

{% endif %}
diff --git a/app/templates/admin_workspaces.html b/app/templates/admin_workspaces.html index caffc0d..9f499f4 100644 --- a/app/templates/admin_workspaces.html +++ b/app/templates/admin_workspaces.html @@ -12,11 +12,11 @@
-

🧭 Espaces de travail

+

Espaces de travail

Un espace regroupe des connexions (forges) et des membres. Le board d'un projet appartient à l'espace : deux espaces peuvent ranger le même projet différemment. L'état de board, les notes et les épingles du jour sont propres à chaque espace.

{% if msg %}

✅ {{ msg }}

{% endif %} - {% if err %}

⚠️ {{ err }}

{% endif %} + {% if err %}

{{ err }}

{% endif %} {% for d in details %} {% set ws = d.ws %} diff --git a/app/templates/archives.html b/app/templates/archives.html index 8030fa2..561d197 100644 --- a/app/templates/archives.html +++ b/app/templates/archives.html @@ -12,11 +12,11 @@
-

🗄️ Archives

+

Archives

Espace : {{ workspace.name if workspace else '—' }}. Deux sortes d'archives : locale (le projet disparaît des vues de cet espace, la forge n'est pas touchée, réversible en un clic) et sur la forge (propriété du dépôt, lecture seule là-bas). Les archives sortent des rituels et des instantanés, mais restent cherchables.

{% if msg %}

✅ {{ msg }}

{% endif %} - {% if err %}

⚠️ {{ err }}

{% endif %} + {% if err %}

{{ err }}

{% endif %} {% macro actions(row, kind) %} {% if can_write %} @@ -26,7 +26,7 @@ - + {% endif %} {% if kind == 'local' %} @@ -35,7 +35,7 @@ - +
@@ -50,7 +50,7 @@ - +
{% endif %} {% if kind == 'forge' %} @@ -59,14 +59,14 @@ - + {% endif %}
- +
{% endif %} {% endmacro %} @@ -80,7 +80,7 @@ {% if row.missing %}introuvable sur la forge{% endif %} {{ row.updated_at or '—' }}{% if row.idle_days is not none %} (il y a {{ row.idle_days }} j){% endif %} - {% if row.open_issues %}⚠️ {{ row.open_issues }} ouverte(s){% else %}0{% endif %} + {% if row.open_issues %}{{ row.open_issues }} ouverte(s){% else %}0{% endif %} {{ actions(row, kind) }} {% endmacro %} @@ -98,13 +98,13 @@ {% if row.conn_kind == 'github' %}🐙{% else %}🍵{% endif %} {{ row.full_name }} {% if row.conn_slug %}{{ row.conn_slug }}{% endif %} {{ row.updated_at }} (il y a {{ row.idle_days }} j) - {% if row.open_issues %}⚠️ {{ row.open_issues }} ouverte(s){% else %}0{% endif %} + {% if row.open_issues %}{{ row.open_issues }} ouverte(s){% else %}0{% endif %} {{ actions(row, 'suggested') }} {% endfor %} -

+

{% else %}

Rien à proposer : aucun projet inactif au-delà du seuil (réglable : archive_suggest_days dans Administration → Paramètres).

@@ -112,7 +112,7 @@
-

📥 Archives locales de cet espace ({{ groups.local|length }})

+

Archives locales de cet espace ({{ groups.local|length }})

{% if groups.local %} @@ -124,7 +124,7 @@
-

🔒 Archivés sur la forge ({{ groups.forge|length }})

+

Archivés sur la forge ({{ groups.forge|length }})

{% if groups.forge %}
ProjetDernière activitéIssues ouvertesActions
diff --git a/app/templates/board.html b/app/templates/board.html index 2d81752..54c2760 100644 --- a/app/templates/board.html +++ b/app/templates/board.html @@ -44,7 +44,7 @@
- + - 📥 Triage du backlog + Triage du backlog {% if is_admin or workspace_role == 'admin' %}🧱 Colonnes{% endif %}
diff --git a/app/templates/capture.html b/app/templates/capture.html index 6a4b9fe..e1e1fc3 100644 --- a/app/templates/capture.html +++ b/app/templates/capture.html @@ -12,7 +12,7 @@
-

⚡ Capture éclair

+

Capture éclair

Une idée, un bogue, une pensée — capturés en deux secondes, ils deviennent une issue dans le bon backlog.

@@ -41,7 +41,7 @@ - + Astuce : tape un début, Tab complète segment par segment (pr → Projets/ → kan → kanbante), ↑↓ + Entrée choisissent dans la liste. diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index 566dcfa..46d023b 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -55,7 +55,7 @@ - 🗄️ Gérer + Gérer
- + @@ -228,21 +228,21 @@
{% for repo in active_listed %}{{ project_card(repo) }}{% endfor %} {% if not active_listed and not pinned_repos %} -
🌱 Aucun projet actif en ce moment. Les projets bougent dès qu'une issue ou un commit arrive dans Gitea.
+
Aucun projet actif en ce moment. Les projets bougent dès qu'une issue ou un commit arrive dans Gitea.
{% endif %}
{% for repo in inactive_listed %}{{ project_card(repo) }}{% endfor %} {% if not inactive_listed %} -
✨ Rien d'endormi : tous vos projets ont eu de l'activité récemment.
+
Rien d'endormi : tous vos projets ont eu de l'activité récemment.
{% endif %}
{% for repo in archived_repos %}{{ project_card(repo, archived=True) }}{% endfor %} {% if not archived_repos %} -
🗄️ Aucun projet archivé. L'archivage se fait dans Gitea (Réglages du dépôt).
+
Aucun projet archivé. L'archivage se fait dans Gitea (Réglages du dépôt).
{% endif %}
diff --git a/app/templates/digest.html b/app/templates/digest.html index 3032b19..10092ac 100644 --- a/app/templates/digest.html +++ b/app/templates/digest.html @@ -12,7 +12,7 @@
-

🧠 Digest hebdo → ObsiGate

+

Digest hebdo → ObsiGate

Chaque semaine, Kanbante compose le résumé de l'activité (livré, en cours, chiffres du journal) en une note markdown. L'envoi vers ObsiGate est une écriture dans un autre système : il n'a jamais lieu sans ton approbation ici.

{% if last_result %}

🧾 Dernier envoi : {{ last_result }}

{% endif %} diff --git a/app/templates/error.html b/app/templates/error.html index 38b52fe..6006786 100644 --- a/app/templates/error.html +++ b/app/templates/error.html @@ -10,7 +10,7 @@ {% include "_header.html" %}
-

⚠️ Quelque chose s'est mal passé

+

Quelque chose s'est mal passé

{{ message }}

← Retour au dashboard

diff --git a/app/templates/focus.html b/app/templates/focus.html index 4d08ab7..83cc7f7 100644 --- a/app/templates/focus.html +++ b/app/templates/focus.html @@ -11,9 +11,9 @@ {% include "_header.html" %}
-

Tout ce qui est En cours ou En révision, tous projets actifs confondus.

+

Focus

Tout ce qui est En cours ou En révision, tous projets actifs confondus.

{% if not groups %} -

🎉 Rien en cours ni en révision pour le moment.

+

Rien en cours ni en révision pour le moment.

{% endif %} {% for group in groups %}
@@ -26,7 +26,7 @@
#{{ card.issue.number }} - + {{ column_labels[card.column] }} {% if card.issue.html_url %} @@ -37,7 +37,7 @@ {% if card.issue.labels %}
{% for label in card.issue.labels %} - + {{ label.name }} {% endfor %} diff --git a/app/templates/forecast.html b/app/templates/forecast.html index 8bb3acd..6eea4d7 100644 --- a/app/templates/forecast.html +++ b/app/templates/forecast.html @@ -12,15 +12,15 @@
-

🔮 Prévisions — « on finit quand ? »

+

Prévisions — « on finit quand ? »

Le tableau de bord des jalons, tous projets confondus, trié par risque : l'écart entre la date estimée (au débit réel du journal) et l'échéance. Réponse honnête — fourchettes plutôt que faux chiffres précis, et aucune prévision sans historique de fermetures.

🎯 {{ summary.total }} jalon(s) ouvert(s) - {% if summary.late %}⚠️ {{ summary.late }} en retard à ce rythme{% endif %} + {% if summary.late %}{{ summary.late }} en retard à ce rythme{% endif %} {% if summary.ontime %}✅ {{ summary.ontime }} dans les temps{% endif %}

@@ -56,7 +56,7 @@
ProjetDernière activitéIssues ouvertesActions
{{ repo.owner.login }} {{ repo.open_issues_count or 0 }} {{ st.get('in_progress', 0) + st.get('qa', 0) + st.get('review', 0) }}{% if repo.next_milestone %}🎯 {{ repo.next_milestone.title }}{% if repo.next_milestone.late %} ⚠️{% endif %}{% else %}—{% endif %}{% if repo.next_milestone %}🎯 {{ repo.next_milestone.title }}{% if repo.next_milestone.late %} {% endif %}{% else %}—{% endif %} {% if repo.health_dot %}{% else %}—{% endif %} {{ repo.updated_at[:10] }}
{{ row.eta or '—' }} {% if row.verdict == 'late' %} - ⚠️ +{{ row.gap_days }} j + +{{ row.gap_days }} j {% elif row.verdict == 'ontime' %} ✅ dans les temps{% if row.gap_days is not none and row.gap_days < 0 %} ({{ -row.gap_days }} j d'avance){% endif %} {% elif row.verdict == 'nodue' %} @@ -78,7 +78,7 @@

📈 Débit par projet

{% for project in projects %}
- + {% for bar in project.bars %} {% set px = (bar.h * 0.42)|round|int %} diff --git a/app/templates/health.html b/app/templates/health.html index b4fc2e5..eb47f1c 100644 --- a/app/templates/health.html +++ b/app/templates/health.html @@ -12,7 +12,7 @@
-

🩺 Santé du flux

+

Santé du flux

Tous les projets actifs, triés par sévérité — le rouge d'abord. Quelle colonne accumule (temps médian par colonne, d'après le journal) et quelles cartes sont devenues des zombies. Cliquez un projet pour le détail et les actions rapides.

diff --git a/app/templates/health_project.html b/app/templates/health_project.html index fa88a83..c3a2dac 100644 --- a/app/templates/health_project.html +++ b/app/templates/health_project.html @@ -25,12 +25,12 @@ {% endif %} {% if health is none %}
-

🩺 {{ full_name }}

+

{{ full_name }}

Projet introuvable.

{% else %}
-

🩺 {{ full_name }}

+

{{ full_name }}

⏱️ Temps passé par colonne (journal)

{% if health.dwell %} @@ -71,7 +71,7 @@

« Fermer » déplace la carte en Terminé (l'issue est fermée dans Gitea par la synchro habituelle). « Toujours pertinent ? » poste un commentaire du même texte sur l'issue.

{% else %} -

Aucune carte zombie. Le flux est propre. ✨

+

Aucune carte zombie. Le flux est propre.

{% endif %} {% endif %} diff --git a/app/templates/inflight.html b/app/templates/inflight.html index af63974..5bcebf9 100644 --- a/app/templates/inflight.html +++ b/app/templates/inflight.html @@ -17,14 +17,14 @@
🛩️ {{ total }} carte{{ 's' if total != 1 }} en vol {% for group in groups %} - + {{ column_labels[group.column] }} · {{ group.cards|length }}{% if wip_globals.get(group.column) %} / limite globale {{ wip_globals[group.column] }}{% endif %} {% endfor %}
{% if not groups %} -

🎉 Rien en vol pour le moment — aucun encours, aucune révision en attente.

+

Rien en vol pour le moment — aucun encours, aucune révision en attente.

{% endif %} {% for group in groups %} @@ -51,7 +51,7 @@ {% if card.issue.labels %}
{% for label in card.issue.labels %} - + {{ label.name }} {% endfor %} @@ -62,7 +62,7 @@ {{ card.issue.assignee.login }} {% endif %} ⏳ {{ card.age_days }} j dans la colonne + title="Dans cette colonne depuis le {{ card.age_since[:10] }}">{{ card.age_days }} j dans la colonne
{% endfor %} diff --git a/app/templates/login.html b/app/templates/login.html index bf574c8..b1f25a3 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -1,7 +1,8 @@ - + + Connexion — Kanbante @@ -11,12 +12,12 @@