ObsiGate 2.84.1 — carte HUB-18 « Thème commun » (fusion #132). Barre commune v0.5.0 (PR commons #12, branche hub18-theme-commun de Projets/dracodev-commons). Aucune fusion : fusion sur l'ordre de Bruno.
Hypothèse d'ordre : cette PR suppose que les PR de la vague 1 (HUB-15/HUB-16) fusionnent avant elle ; elle est branchée sur main (2.84.0) et vise 2.84.1 (bump patch via scripts/bump_version.py, fichiers dérivés synchronisés par l'outil du dépôt).
Contenu
frontend/draco-barre.js re-vendangé verbatim depuis commons v0.5.0 (CSS et fragment inchangés) : la barre apprend la préférence de thème du Hub (GET <hub>/api/profil/theme, cookie draco, URL du Hub résolue — jamais figée), cache localStoragedraco-theme-hub (TTL 12 h) appliqué synchrone à l'init, fetch asynchrone non bloquant, application par data-theme, événement draco:theme. Repli intégral si le Hub ne répond pas / non-OK / theme: null : comportement actuel inchangé.
Initialisation propre à ObsiGate (frontend/app.js, initTheme()) : écoute de draco:theme → le mode effectif est routé par applyTheme() (icône et libellé du bouton de thème + feuilles highlight.js synchronisés ; le mode appliqué devient le choix local mémorisé obsigate-theme — convergence assumée) ; reprise de DRACO_BAR.themeMode si la barre s'est initialisée avant le module. Le bouton de bascule local reste fonctionnel pour la session.
Portes
tests/test_draco_barre.py + tests/test_version.py : 60 passed (fonds main à environnement identique : 59 passed — le test ajouté verrouille la vendange v0.5.0 et l'écouteur draco:theme). Exécutés avec --noconftest dans cette VM (le conftest.py partagé exige fastapi, absent de l'environnement local ; ces deux fichiers n'en dépendent pas — la suite complète reste au CI du dépôt).
Syntaxe JS vérifiée (node --check) sur app.js et draco-barre.js.
**ObsiGate 2.84.1** — carte **HUB-18 « Thème commun »** (fusion #132). Barre commune **v0.5.0** (PR commons #12, branche `hub18-theme-commun` de `Projets/dracodev-commons`). **Aucune fusion** : fusion sur l'ordre de Bruno.
**Hypothèse d'ordre** : cette PR suppose que les PR de la vague 1 (HUB-15/HUB-16) fusionnent avant elle ; elle est branchée sur `main` (2.84.0) et vise **2.84.1** (bump patch via `scripts/bump_version.py`, fichiers dérivés synchronisés par l'outil du dépôt).
## Contenu
- `frontend/draco-barre.js` re-vendangé **verbatim** depuis commons v0.5.0 (CSS et fragment inchangés) : la barre apprend la préférence de thème du Hub (`GET <hub>/api/profil/theme`, cookie draco, URL du Hub résolue — jamais figée), cache `localStorage` `draco-theme-hub` (TTL 12 h) appliqué synchrone à l'init, fetch asynchrone non bloquant, application par `data-theme`, événement `draco:theme`. **Repli intégral** si le Hub ne répond pas / non-OK / `theme: null` : comportement actuel inchangé.
- **Initialisation propre à ObsiGate** (`frontend/app.js`, `initTheme()`) : écoute de `draco:theme` → le mode effectif est routé par `applyTheme()` (icône et libellé du bouton de thème + feuilles highlight.js synchronisés ; le mode appliqué devient le choix local mémorisé `obsigate-theme` — convergence assumée) ; reprise de `DRACO_BAR.themeMode` si la barre s'est initialisée avant le module. Le bouton de bascule local reste fonctionnel pour la session.
## Portes
- `tests/test_draco_barre.py` + `tests/test_version.py` : **60 passed** (fonds `main` à environnement identique : 59 passed — le test ajouté verrouille la vendange v0.5.0 et l'écouteur `draco:theme`). Exécutés avec `--noconftest` dans cette VM (le `conftest.py` partagé exige `fastapi`, absent de l'environnement local ; ces deux fichiers n'en dépendent pas — la suite complète reste au CI du dépôt).
- Syntaxe JS vérifiée (`node --check`) sur `app.js` et `draco-barre.js`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
ObsiGate 2.84.1 — carte HUB-18 « Thème commun » (fusion #132). Barre commune v0.5.0 (PR commons #12, branche
hub18-theme-commundeProjets/dracodev-commons). Aucune fusion : fusion sur l'ordre de Bruno.Hypothèse d'ordre : cette PR suppose que les PR de la vague 1 (HUB-15/HUB-16) fusionnent avant elle ; elle est branchée sur
main(2.84.0) et vise 2.84.1 (bump patch viascripts/bump_version.py, fichiers dérivés synchronisés par l'outil du dépôt).Contenu
frontend/draco-barre.jsre-vendangé verbatim depuis commons v0.5.0 (CSS et fragment inchangés) : la barre apprend la préférence de thème du Hub (GET <hub>/api/profil/theme, cookie draco, URL du Hub résolue — jamais figée), cachelocalStoragedraco-theme-hub(TTL 12 h) appliqué synchrone à l'init, fetch asynchrone non bloquant, application pardata-theme, événementdraco:theme. Repli intégral si le Hub ne répond pas / non-OK /theme: null: comportement actuel inchangé.frontend/app.js,initTheme()) : écoute dedraco:theme→ le mode effectif est routé parapplyTheme()(icône et libellé du bouton de thème + feuilles highlight.js synchronisés ; le mode appliqué devient le choix local mémoriséobsigate-theme— convergence assumée) ; reprise deDRACO_BAR.themeModesi la barre s'est initialisée avant le module. Le bouton de bascule local reste fonctionnel pour la session.Portes
tests/test_draco_barre.py+tests/test_version.py: 60 passed (fondsmainà environnement identique : 59 passed — le test ajouté verrouille la vendange v0.5.0 et l'écouteurdraco:theme). Exécutés avec--noconftestdans cette VM (leconftest.pypartagé exigefastapi, absent de l'environnement local ; ces deux fichiers n'en dépendent pas — la suite complète reste au CI du dépôt).node --check) surapp.jsetdraco-barre.js.