From 4c64cbc168a68798753e4e0c0c0f05f0ec13804c Mon Sep 17 00:00:00 2001 From: Spark Date: Thu, 5 Nov 2026 05:51:09 +0000 Subject: [PATCH 1/2] =?UTF-8?q?Kanbante=200.45.12=20:=20barre=20v0.4.1=20?= =?UTF-8?q?=E2=80=94=20correctif=20des=20ic=C3=B4nes=20invisibles=20du=20m?= =?UTF-8?q?enu=20compte,=20vendange=20verbatim=20(fusion=20#125)=20+=20tes?= =?UTF-8?q?ts=20+=20version/changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 ++++++ VERSION | 2 +- static/js/draco-barre.js | 10 +++++++-- tests/test_barre_v040.py | 7 +++++- tests/test_barre_v041.py | 46 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 tests/test_barre_v041.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ff2a755..def63f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.45.12 — 2026-11-05 — Barre commune v0.4.1 : correctif des icônes invisibles du menu compte (fusion #125) + +- **Barre d'apps v0.4.1 vendangée (dracodev-commons, branche `menu-compte-icones-svg-ns-v0-4-1`, PR commons #11)** : `static/js/draco-barre.js` remplacé **verbatim** — SHA-256 JS `82c4940e…b34f85a42` (preuve dans `tests/test_barre_v041.py`). Le CSS est inchangé (empreinte v0.4.0 conservée) ; le gabarit `_draco_bar.html` est inchangé. +- **Correctif** : en v0.4.0, `menuIcone()` créait le `` des icônes et ses primitives via `document.createElement()` — espace de noms **HTML**, jamais dessinés par le navigateur : les libellés du menu compte étaient décalés d'un cran d'icône, sans aucun glyphe. La v0.4.1 crée tout via `document.createElementNS()` (espace de noms SVG). Glyphes, CSS et comportements inchangés. +- **Cache** : le bump du fichier `VERSION` change le `?v=` des CSS/JS de la barre ; `APP_VERSION` suit automatiquement (source unique `VERSION`). +- Tests : `tests/test_barre_v041.py` (verbatim v0.4.1 prouvé par SHA-256, création en espace de noms SVG) ; l'empreinte JS de `tests/test_barre_v040.py` est supersédée selon le patron habituel. + ## 0.45.11 — 2026-11-05 — Barre commune v0.4.0 : icônes monoline du menu compte (HUB-11) - **Barre d'apps v0.4.0 vendangée (dracodev-commons, branche `menu-compte-icones-v0-4-0`, PR commons #10)** : `static/css/draco-barre.css` et `static/js/draco-barre.js` remplacés **verbatim** — SHA-256 CSS `d8cf53b2…a6bd06ec`, JS `36cc24b2…e5d39a0` (preuve dans `tests/test_barre_v040.py`). Le gabarit `_draco_bar.html` est inchangé. diff --git a/VERSION b/VERSION index a1cf49f..cbb488e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.45.11 +0.45.12 diff --git a/static/js/draco-barre.js b/static/js/draco-barre.js index 582e088..7078871 100644 --- a/static/js/draco-barre.js +++ b/static/js/draco-barre.js @@ -529,11 +529,17 @@ ["line", { x1: "21", y1: "12", x2: "9", y2: "12" }] ] }; + /* Espace de noms SVG — OBLIGATOIRE : un élément « svg » (ou + * « path », « circle »…) créé par createElement() appartient à + * l'espace de noms HTML et le navigateur ne le dessine JAMAIS + * (bug v0.4.0 : libellés décalés d'un cran d'icône, aucun glyphe + * visible ; corrigé en v0.4.1, carte fusion #125). */ + var SVG_NS = "http://www.w3.org/2000/svg"; function menuIcone(nom) { var span = document.createElement("span"); span.className = "draco-menu-icone"; span.setAttribute("aria-hidden", "true"); - var svg = document.createElement("svg"); + var svg = document.createElementNS(SVG_NS, "svg"); svg.setAttribute("viewBox", "0 0 24 24"); svg.setAttribute("fill", "none"); svg.setAttribute("stroke", "currentColor"); @@ -542,7 +548,7 @@ svg.setAttribute("stroke-linejoin", "round"); svg.setAttribute("focusable", "false"); (MENU_ICONES[nom] || []).forEach(function (spec) { - var el = document.createElement(spec[0]); + var el = document.createElementNS(SVG_NS, spec[0]); for (var k in spec[1]) el.setAttribute(k, spec[1][k]); svg.appendChild(el); }); diff --git a/tests/test_barre_v040.py b/tests/test_barre_v040.py index 6ee6aa8..57e06c2 100644 --- a/tests/test_barre_v040.py +++ b/tests/test_barre_v040.py @@ -26,8 +26,13 @@ def _sha256(chemin): def test_barre_css_js_verbatim_commons_v040(): + # Remplacé en 0.45.12 : la re-vendange v0.4.1 (correctif + # fusion #125) supersède l'empreinte JS v0.4.0 — l'empreinte + # JS courante est verrouillée par tests/test_barre_v041.py. + # Le CSS, inchangé en v0.4.1, garde son empreinte v0.4.0 ; + # on garde ici la preuve que le JS a bien quitté la v0.4.0. assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V040 - assert _sha256("static/js/draco-barre.js") == SHA256_JS_V040 + assert _sha256("static/js/draco-barre.js") != SHA256_JS_V040 def test_js_icones_monoline_menu_compte(): diff --git a/tests/test_barre_v041.py b/tests/test_barre_v041.py new file mode 100644 index 0000000..8818c2a --- /dev/null +++ b/tests/test_barre_v041.py @@ -0,0 +1,46 @@ +"""Barre commune v0.4.1 (correctif fusion #125) — re-vendange 0.45.12. + +- JS vendangé VERBATIM depuis dracodev-commons, branche + menu-compte-icones-svg-ns-v0-4-1 (PR commons #11), + ui/barre-apps/. Le CSS est inchangé par rapport à la v0.4.0. +- Correctif : en v0.4.0, les icônes du menu compte étaient + créées via document.createElement() — espace de noms HTML, + jamais dessinées par le navigateur (libellés décalés d'un + cran d'icône, aucun glyphe visible en production). La v0.4.1 + crée le et ses primitives via + document.createElementNS() (espace de noms SVG). +""" +import hashlib +from pathlib import Path + +R = Path(__file__).resolve().parents[1] + +# Empreintes SHA-256 de la source commons +# (Projets/dracodev-commons, ui/barre-apps/ ; CSS : v0.4.0 +# inchangé, JS : branche du correctif v0.4.1 @32a729f). +SHA256_CSS_V040 = "d8cf53b2f6700ebc7499d43869d5cae256d1f74636f0113bffb174b8a6bd06ec" +SHA256_JS_V041 = "82c4940e8e115ed71d95f7c0dcdc906b93e49855580cc0fec7a1ccba34f85a42" + + +def _sha256(chemin): + return hashlib.sha256((R / chemin).read_bytes()).hexdigest() + + +def test_barre_css_js_verbatim_commons_v041(): + assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V040 + assert _sha256("static/js/draco-barre.js") == SHA256_JS_V041 + + +def test_js_icones_espace_de_noms_svg(): + js = (R / "static/js/draco-barre.js").read_text(encoding="utf-8") + assert "MENU_ICONES" in js + # Le correctif : création dans l'espace de noms SVG… + assert 'createElementNS(SVG_NS, "svg")' in js + assert "createElementNS(SVG_NS, spec[0])" in js + # …et plus aucune création HTML du svg ou des primitives. + assert 'createElement("svg")' not in js + assert "createElement(spec[0])" not in js + # Comportements conservés. + assert 'hub: "https://hub.dracodev.net/"' in js + assert '"profil", "Profil"' in js + assert 'data-compte-act", "deconnexion"' in js -- 2.54.0 From 261a2f952eec9801eae2cfe07a6111c2c7a02def Mon Sep 17 00:00:00 2001 From: Spark Date: Thu, 5 Nov 2026 07:08:26 +0000 Subject: [PATCH 2/2] =?UTF-8?q?Kanbante=200.45.12=20:=20barre=20v0.4.1=20?= =?UTF-8?q?=E2=80=94=20menu=20compte=20resserr=C3=A9=20=C3=A0=20232=20px,?= =?UTF-8?q?=20re-vendange=20verbatim=20(fusion=20#125)=20+=20empreintes=20?= =?UTF-8?q?des=20tests=20mises=20=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/draco-barre.css | 5 ++++- tests/test_barre_v040.py | 11 ++++++----- tests/test_barre_v041.py | 13 ++++++++----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/static/css/draco-barre.css b/static/css/draco-barre.css index ba8aa62..55ab916 100644 --- a/static/css/draco-barre.css +++ b/static/css/draco-barre.css @@ -29,6 +29,9 @@ replacées à gauche du libellé par order: -1 (l'item est en flex), couleur atténuée --ink-2, pleine --ink au survol/focus. Jetons repris du prototype validé Console v7.2. + v0.4.1 (fusion #125) : menu compte resserré — min-width + 248 → 232 px, le panneau épouse le contenu (demande de Bruno : + le menu était trop large une fois les icônes visibles). Thème : clair par défaut, sombre via [data-theme="dark"] sur ou prefers-color-scheme si l'app intégratrice ne force rien (aucun attribut data-theme sur ). */ @@ -86,7 +89,7 @@ * droite ; ses items réutilisent .draco-apps-item. */ .draco-compte-menu { position: absolute; top: calc(100% + 6px); right: 10px; z-index: 400; - min-width: 248px; padding: 6px; + min-width: 232px; padding: 6px; background: var(--surface); border: 1px solid var(--line); border-radius: 14px; box-shadow: 0 16px 44px rgb(0 0 0 / .28); } diff --git a/tests/test_barre_v040.py b/tests/test_barre_v040.py index 57e06c2..677e205 100644 --- a/tests/test_barre_v040.py +++ b/tests/test_barre_v040.py @@ -27,11 +27,12 @@ def _sha256(chemin): def test_barre_css_js_verbatim_commons_v040(): # Remplacé en 0.45.12 : la re-vendange v0.4.1 (correctif - # fusion #125) supersède l'empreinte JS v0.4.0 — l'empreinte - # JS courante est verrouillée par tests/test_barre_v041.py. - # Le CSS, inchangé en v0.4.1, garde son empreinte v0.4.0 ; - # on garde ici la preuve que le JS a bien quitté la v0.4.0. - assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V040 + # fusion #125) supersède les empreintes v0.4.0 — les empreintes + # courantes sont verrouillées par tests/test_barre_v041.py. + # Le CSS a lui aussi quitté la v0.4.0 : la v0.4.1 le resserre + # (menu compte 248 → 232 px, @edde1b5) ; on garde ici la + # preuve que les deux fichiers ont bien quitté la v0.4.0. + assert _sha256("static/css/draco-barre.css") != SHA256_CSS_V040 assert _sha256("static/js/draco-barre.js") != SHA256_JS_V040 diff --git a/tests/test_barre_v041.py b/tests/test_barre_v041.py index 8818c2a..7aa9e16 100644 --- a/tests/test_barre_v041.py +++ b/tests/test_barre_v041.py @@ -2,7 +2,9 @@ - JS vendangé VERBATIM depuis dracodev-commons, branche menu-compte-icones-svg-ns-v0-4-1 (PR commons #11), - ui/barre-apps/. Le CSS est inchangé par rapport à la v0.4.0. + ui/barre-apps/. Le CSS est lui aussi verbatim : la source + commons v0.4.1 y ajoute le resserrement du menu compte + (min-width 248 → 232 px, demande de Bruno, @edde1b5). - Correctif : en v0.4.0, les icônes du menu compte étaient créées via document.createElement() — espace de noms HTML, jamais dessinées par le navigateur (libellés décalés d'un @@ -16,9 +18,10 @@ from pathlib import Path R = Path(__file__).resolve().parents[1] # Empreintes SHA-256 de la source commons -# (Projets/dracodev-commons, ui/barre-apps/ ; CSS : v0.4.0 -# inchangé, JS : branche du correctif v0.4.1 @32a729f). -SHA256_CSS_V040 = "d8cf53b2f6700ebc7499d43869d5cae256d1f74636f0113bffb174b8a6bd06ec" +# (Projets/dracodev-commons, ui/barre-apps/ ; branche du +# correctif v0.4.1 @edde1b5 : JS espace de noms SVG, CSS +# menu compte resserré à 232 px). +SHA256_CSS_V041 = "874b26eafba5b3e174140280415edbae00cd38bc4beb39d897a4b4c5b923af6e" SHA256_JS_V041 = "82c4940e8e115ed71d95f7c0dcdc906b93e49855580cc0fec7a1ccba34f85a42" @@ -27,7 +30,7 @@ def _sha256(chemin): def test_barre_css_js_verbatim_commons_v041(): - assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V040 + assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V041 assert _sha256("static/js/draco-barre.js") == SHA256_JS_V041 -- 2.54.0