ObsiGate 2.83.4 — barre v0.4.0 : icônes monoline dans le menu compte (HUB-11) #64
+7
-1
@@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
|
|||||||
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
> **En cours de développement** : les changements à venir sont listés dans la section
|
> **En cours de développement** : les changements à venir sont listés dans la section
|
||||||
> [Unreleased](#unreleased). La dernière version livrée est **2.83.3**.
|
> [Unreleased](#unreleased). La dernière version livrée est **2.83.4**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,6 +14,12 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [2.83.4] — 2026-11-05
|
||||||
|
|
||||||
|
- **Barre commune v0.4.0 — icônes monoline du menu compte (HUB-11, fusion #125)** : `frontend/draco-barre.js` et `frontend/draco-barre.css` re-vendangés **verbatim** depuis dracodev-commons v0.4.0 (branche `menu-compte-icones-v0-4-0`, PR commons #10). Les items du menu compte — **Télécharger**, **À Propos**, **Aides**, **Profil**, **Déconnexion** — reçoivent des **icônes SVG monoline** (contour, trait fin, `currentColor`, ~18 px) dans le style des icônes du rail de la console Spark ; aucun emoji. L'en-tête d'identité reste sans icône ; les liens Hub et le relais « Déconnexion » sont inchangés. Garde ajoutée à `tests/test_draco_barre.py`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [2.83.3] — 2026-11-04
|
## [2.83.3] — 2026-11-04
|
||||||
|
|
||||||
- **Barre commune v0.3.0 — liens Hub du menu compte (HUB-1, fusion #115)** : `frontend/draco-barre.js` et `frontend/draco-barre.css` re-vendangés **verbatim** depuis dracodev-commons v0.3.0 (branche `hub-menu-compte-v0-3-0`, PR commons #9). Le menu compte gagne les liens **Télécharger**, **À Propos**, **Aides** et **Profil** (devenu un lien, plus un relais) vers le Hub. Branchement hôte : `backend/draco_config.py` gagne la clé `hub` (défaut officiel `https://hub.dracodev.net`, variable `DRACO_HUB_URL`, dérivation `-dev` → `hub-dev` depuis l'hôte de l'agent), servie dans `window.DRACO_URLS` ; `frontend/index.html` la passe en `urls.hub` de `DRACO_BAR_CONFIG`. « Déconnexion » reste relayée, inchangée. Aucun nouvel onglet : le Hub n'apparaît que dans le menu compte.
|
- **Barre commune v0.3.0 — liens Hub du menu compte (HUB-1, fusion #115)** : `frontend/draco-barre.js` et `frontend/draco-barre.css` re-vendangés **verbatim** depuis dracodev-commons v0.3.0 (branche `hub-menu-compte-v0-3-0`, PR commons #9). Le menu compte gagne les liens **Télécharger**, **À Propos**, **Aides** et **Profil** (devenu un lien, plus un relais) vers le Hub. Branchement hôte : `backend/draco_config.py` gagne la clé `hub` (défaut officiel `https://hub.dracodev.net`, variable `DRACO_HUB_URL`, dérivation `-dev` → `hub-dev` depuis l'hôte de l'agent), servie dans `window.DRACO_URLS` ; `frontend/index.html` la passe en `urls.hub` de `DRACO_BAR_CONFIG`. « Déconnexion » reste relayée, inchangée. Aucun nouvel onglet : le Hub n'apparaît que dans le menu compte.
|
||||||
|
|||||||
+3
-3
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.83.3).
|
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.83.4).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Projet : ObsiGate | Version : 2.83.3 | Dernière mise à jour : Septembre 2026*
|
*Projet : ObsiGate | Version : 2.83.4 | Dernière mise à jour : Septembre 2026*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface.
|
**Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE)
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 Changelog
|
||||||
|
|
||||||
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.83.3).
|
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.83.4).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Project: ObsiGate | Version: 2.83.3 | Last updated: September 2026*
|
*Project: ObsiGate | Version: 2.83.4 | Last updated: September 2026*
|
||||||
|
|||||||
Generated
+1
-1
@@ -2626,7 +2626,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.83.3"
|
version = "2.83.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.83.3"
|
version = "2.83.4"
|
||||||
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
||||||
authors = ["Bruno Charest"]
|
authors = ["Bruno Charest"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
||||||
"productName": "ObsiGate",
|
"productName": "ObsiGate",
|
||||||
"version": "2.83.3",
|
"version": "2.83.4",
|
||||||
"identifier": "com.obsigate.desktop",
|
"identifier": "com.obsigate.desktop",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../frontend",
|
"frontendDist": "../frontend",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# ObsiGate — Roadmap
|
# ObsiGate — Roadmap
|
||||||
|
|
||||||
> **Version :** 2.83.3 | **Dernière mise à jour :** 2026-11-04
|
> **Version :** 2.83.4 | **Dernière mise à jour :** 2026-11-05
|
||||||
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
||||||
> vers les fonctionnalités livrées.
|
> vers les fonctionnalités livrées.
|
||||||
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
||||||
|
|||||||
@@ -24,6 +24,10 @@
|
|||||||
compte (Télécharger, À Propos, Aides, Profil) réutilisent
|
compte (Télécharger, À Propos, Aides, Profil) réutilisent
|
||||||
.draco-menu-item (déjà ancre-compatible : text-decoration none)
|
.draco-menu-item (déjà ancre-compatible : text-decoration none)
|
||||||
et le séparateur .draco-menu-sep du menu des applications.
|
et le séparateur .draco-menu-sep du menu des applications.
|
||||||
|
v0.4.0 (HUB-11) : .draco-menu-icone — les icônes monoline des
|
||||||
|
items du menu compte (SVG inline construit par le JS) : 18 px,
|
||||||
|
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.
|
Jetons repris du prototype validé Console v7.2.
|
||||||
Thème : clair par défaut, sombre via [data-theme="dark"] sur <html>
|
Thème : clair par défaut, sombre via [data-theme="dark"] sur <html>
|
||||||
ou prefers-color-scheme si l'app intégratrice ne force rien
|
ou prefers-color-scheme si l'app intégratrice ne force rien
|
||||||
@@ -94,6 +98,15 @@
|
|||||||
text-decoration: none; cursor: pointer;
|
text-decoration: none; cursor: pointer;
|
||||||
}
|
}
|
||||||
.draco-menu-item:hover, .draco-menu-item:focus-visible { background: var(--surface-2); }
|
.draco-menu-item:hover, .draco-menu-item:focus-visible { background: var(--surface-2); }
|
||||||
|
/* Icônes monoline du menu compte (v0.4.0) : appendues après le
|
||||||
|
libellé dans le DOM, replacées à gauche par order: -1. */
|
||||||
|
.draco-menu-icone {
|
||||||
|
order: -1; flex: none; display: inline-flex; align-items: center;
|
||||||
|
width: 18px; height: 18px; color: var(--ink-2);
|
||||||
|
}
|
||||||
|
.draco-menu-icone svg { display: block; width: 18px; height: 18px; }
|
||||||
|
.draco-menu-item:hover .draco-menu-icone,
|
||||||
|
.draco-menu-item:focus-visible .draco-menu-icone { color: var(--ink); }
|
||||||
.draco-menu-sep { height: 1px; margin: 6px 10px; background: var(--line); }
|
.draco-menu-sep { height: 1px; margin: 6px 10px; background: var(--line); }
|
||||||
.draco-compte-nom {
|
.draco-compte-nom {
|
||||||
padding: 8px 10px 10px; font-weight: 700; font-size: 14px;
|
padding: 8px 10px 10px; font-weight: 700; font-size: 14px;
|
||||||
|
|||||||
@@ -29,6 +29,13 @@
|
|||||||
* l'ouverture des menus. Le Hub n'a pas d'onglet dans la barre :
|
* l'ouverture des menus. Le Hub n'a pas d'onglet dans la barre :
|
||||||
* comme spark, sa clé est résolue et exposée via DRACO_BAR.urls,
|
* comme spark, sa clé est résolue et exposée via DRACO_BAR.urls,
|
||||||
* sans étape « href rendu » (voir « URL » ci-dessous).
|
* sans étape « href rendu » (voir « URL » ci-dessous).
|
||||||
|
* v0.4.0 (carte HUB-11, fusion #125) : icônes monoline dans le
|
||||||
|
* menu compte — chaque item (les 4 liens du Hub et « Déconnexion »)
|
||||||
|
* reçoit un glyphe SVG inline dans le style des icônes du rail de
|
||||||
|
* la console (contour, trait fin régulier, currentColor, aucun
|
||||||
|
* remplissage), aligné à gauche du libellé via .draco-menu-icone.
|
||||||
|
* L'en-tête d'identité ne reçoit pas d'icône. Aucun changement de
|
||||||
|
* comportement : liens résolus et Déconnexion relayée inchangés.
|
||||||
*
|
*
|
||||||
* Aucun gestionnaire inline : un seul écouteur délégué sur le document
|
* Aucun gestionnaire inline : un seul écouteur délégué sur le document
|
||||||
* (patron validé par le prototype — les onclick du HTML généré sont
|
* (patron validé par le prototype — les onclick du HTML généré sont
|
||||||
@@ -483,6 +490,66 @@
|
|||||||
if (!appsMenu.hidden) lastOpener = brand;
|
if (!appsMenu.hidden) lastOpener = brand;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Icônes monoline du menu compte (v0.4.0) — glyphes contour
|
||||||
|
* dans le style des icônes du rail de la console : viewBox 24,
|
||||||
|
* stroke currentColor, remplissage nul, extrémités rondes.
|
||||||
|
* Chaque glyphe est une liste de primitives [balise, attributs]
|
||||||
|
* construites en DOM (jamais d'innerHTML), comme le reste du
|
||||||
|
* fichier. Le libellé reste le nœud texte de l'item ; l'icône,
|
||||||
|
* appendue après, est replacée à gauche par le CSS (order: -1
|
||||||
|
* sur .draco-menu-icone, l'item étant déjà en flex). */
|
||||||
|
var MENU_ICONES = {
|
||||||
|
/* Flèche vers le bas dans un plateau. */
|
||||||
|
"telecharger": [
|
||||||
|
["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }],
|
||||||
|
["polyline", { points: "7 10 12 15 17 10" }],
|
||||||
|
["line", { x1: "12", y1: "15", x2: "12", y2: "3" }]
|
||||||
|
],
|
||||||
|
/* Cercle d'information. */
|
||||||
|
"a-propos": [
|
||||||
|
["circle", { cx: "12", cy: "12", r: "9" }],
|
||||||
|
["line", { x1: "12", y1: "11", x2: "12", y2: "16" }],
|
||||||
|
["line", { x1: "12", y1: "8", x2: "12.01", y2: "8" }]
|
||||||
|
],
|
||||||
|
/* Cercle d'interrogation. */
|
||||||
|
"aide": [
|
||||||
|
["circle", { cx: "12", cy: "12", r: "9" }],
|
||||||
|
["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }],
|
||||||
|
["line", { x1: "12", y1: "17", x2: "12.01", y2: "17" }]
|
||||||
|
],
|
||||||
|
/* Personne : tête + épaules. */
|
||||||
|
"profil": [
|
||||||
|
["path", { d: "M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }],
|
||||||
|
["circle", { cx: "12", cy: "7", r: "4" }]
|
||||||
|
],
|
||||||
|
/* Flèche sortant d'un cadre (porte). */
|
||||||
|
"deconnexion": [
|
||||||
|
["path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }],
|
||||||
|
["polyline", { points: "16 17 21 12 16 7" }],
|
||||||
|
["line", { x1: "21", y1: "12", x2: "9", y2: "12" }]
|
||||||
|
]
|
||||||
|
};
|
||||||
|
function menuIcone(nom) {
|
||||||
|
var span = document.createElement("span");
|
||||||
|
span.className = "draco-menu-icone";
|
||||||
|
span.setAttribute("aria-hidden", "true");
|
||||||
|
var svg = document.createElement("svg");
|
||||||
|
svg.setAttribute("viewBox", "0 0 24 24");
|
||||||
|
svg.setAttribute("fill", "none");
|
||||||
|
svg.setAttribute("stroke", "currentColor");
|
||||||
|
svg.setAttribute("stroke-width", "1.8");
|
||||||
|
svg.setAttribute("stroke-linecap", "round");
|
||||||
|
svg.setAttribute("stroke-linejoin", "round");
|
||||||
|
svg.setAttribute("focusable", "false");
|
||||||
|
(MENU_ICONES[nom] || []).forEach(function (spec) {
|
||||||
|
var el = document.createElement(spec[0]);
|
||||||
|
for (var k in spec[1]) el.setAttribute(k, spec[1][k]);
|
||||||
|
svg.appendChild(el);
|
||||||
|
});
|
||||||
|
span.appendChild(svg);
|
||||||
|
return span;
|
||||||
|
}
|
||||||
|
|
||||||
/* Menu compte (v0.1.6 ; v0.3.0 pour les liens) — en-tête
|
/* Menu compte (v0.1.6 ; v0.3.0 pour les liens) — en-tête
|
||||||
* d'identité, puis les liens du Hub (Télécharger, À Propos,
|
* d'identité, puis les liens du Hub (Télécharger, À Propos,
|
||||||
* Aides, Profil — vrais <a href>, même patron que le menu des
|
* Aides, Profil — vrais <a href>, même patron que le menu des
|
||||||
@@ -508,6 +575,7 @@
|
|||||||
a.setAttribute("data-hub-link", pair[0]);
|
a.setAttribute("data-hub-link", pair[0]);
|
||||||
a.setAttribute("role", "menuitem");
|
a.setAttribute("role", "menuitem");
|
||||||
a.textContent = pair[1];
|
a.textContent = pair[1];
|
||||||
|
a.appendChild(menuIcone(pair[0]));
|
||||||
compteMenu.appendChild(a);
|
compteMenu.appendChild(a);
|
||||||
});
|
});
|
||||||
var sep = document.createElement("div");
|
var sep = document.createElement("div");
|
||||||
@@ -520,6 +588,7 @@
|
|||||||
b.setAttribute("data-compte-act", "deconnexion");
|
b.setAttribute("data-compte-act", "deconnexion");
|
||||||
b.setAttribute("role", "menuitem");
|
b.setAttribute("role", "menuitem");
|
||||||
b.textContent = "Déconnexion";
|
b.textContent = "Déconnexion";
|
||||||
|
b.appendChild(menuIcone("deconnexion"));
|
||||||
compteMenu.appendChild(b);
|
compteMenu.appendChild(b);
|
||||||
bar.appendChild(compteMenu);
|
bar.appendChild(compteMenu);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsigate",
|
"name": "obsigate",
|
||||||
"version": "2.83.3",
|
"version": "2.83.4",
|
||||||
"description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.",
|
"description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.",
|
||||||
"main": "patch.js",
|
"main": "patch.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
|
|||||||
@@ -206,3 +206,23 @@ def test_panneau_version_service_affichee_225():
|
|||||||
# La ligne naît masquée et n'est démasquée qu'avec une version lue.
|
# La ligne naît masquée et n'est démasquée qu'avec une version lue.
|
||||||
assert 'class="draco-panneau-version"' in panneau
|
assert 'class="draco-panneau-version"' in panneau
|
||||||
assert "versionEl.hidden = false" in panneau
|
assert "versionEl.hidden = false" in panneau
|
||||||
|
|
||||||
|
|
||||||
|
def test_barre_v040_icones_monoline_menu_compte():
|
||||||
|
# v0.4.0 (HUB-11, fusion #125) : les items du menu compte
|
||||||
|
# portent des icônes SVG monoline construites en DOM, dans le
|
||||||
|
# style des icônes du rail de la console — aucun emoji, aucune
|
||||||
|
# icône pleine. La vendange reste verbatim commons.
|
||||||
|
js = (FRONTEND / "draco-barre.js").read_text(encoding="utf-8")
|
||||||
|
assert "MENU_ICONES" in js
|
||||||
|
for nom in ("telecharger", "a-propos", "aide", "profil", "deconnexion"):
|
||||||
|
assert nom in js
|
||||||
|
assert "draco-menu-icone" in js
|
||||||
|
assert "stroke: currentColor" not in js # attributs posés en DOM
|
||||||
|
assert 'setAttribute("stroke", "currentColor")' in js
|
||||||
|
assert 'setAttribute("fill", "none")' in js
|
||||||
|
css = _css()
|
||||||
|
assert ".draco-menu-icone" in css
|
||||||
|
bloc = css.split(".draco-menu-icone {", 1)[1].split("}", 1)[0]
|
||||||
|
assert "width: 18px" in bloc
|
||||||
|
assert "var(--ink-2)" in bloc
|
||||||
|
|||||||
Reference in New Issue
Block a user