diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cf7d00..8d61b48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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). > **En cours de développement** : les changements à venir sont listés dans la section -> [Unreleased](#unreleased). La dernière version livrée est **2.72.1**. +> [Unreleased](#unreleased). La dernière version livrée est **2.73.0**. --- @@ -14,6 +14,19 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [2.73.0] — 2026-10-21 + +### Ajouté + +- **Menu des applications par la marque ✦** (barre commune + **v0.1.3**, #215) : cliquer le ✦ — un peu plus gros (24 px) — + ouvre le menu des 4 applications (liens, icônes, badges), sur + mobile comme sur bureau. C'est le changement d'app en mobile, + où les onglets sont repliés depuis la v0.1.2. Fermeture au + clic extérieur ou à Échap. Choix de Bruno (2026-10-21). + +--- + ## [2.72.1] — 2026-10-21 ### Corrigé diff --git a/README.fr.md b/README.fr.md index ce70b19..d364dd2 100644 --- a/README.fr.md +++ b/README.fr.md @@ -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. -[![Version](https://img.shields.io/badge/Version-2.72.1-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.73.0-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l ## 📝 Changelog -Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.72.1). +Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.73.0). --- -*Projet : ObsiGate | Version : 2.72.1 | Dernière mise à jour : Septembre 2026* +*Projet : ObsiGate | Version : 2.73.0 | Dernière mise à jour : Septembre 2026* diff --git a/README.md b/README.md index ff0ed7b..e8e98a2 100644 --- a/README.md +++ b/README.md @@ -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. -[![Version](https://img.shields.io/badge/Version-2.72.1-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.73.0-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) ## 📝 Changelog -See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.72.1). +See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.73.0). --- -*Project: ObsiGate | Version: 2.72.1 | Last updated: September 2026* +*Project: ObsiGate | Version: 2.73.0 | Last updated: September 2026* diff --git a/VERSION b/VERSION index af4fa19..6406782 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.72.1 +2.73.0 diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index fb98666..be158b4 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "obsigate-desktop" -version = "2.72.1" +version = "2.73.0" dependencies = [ "chrono", "env_logger", diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 98f7e19..3fef11f 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obsigate-desktop" -version = "2.72.1" +version = "2.73.0" description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian" authors = ["Bruno Charest"] edition = "2021" diff --git a/desktop/tauri.conf.json b/desktop/tauri.conf.json index 5e0434f..23e9726 100644 --- a/desktop/tauri.conf.json +++ b/desktop/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json", "productName": "ObsiGate", - "version": "2.72.1", + "version": "2.73.0", "identifier": "com.obsigate.desktop", "build": { "frontendDist": "../frontend", diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index c087528..45defe9 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # ObsiGate — Roadmap -> **Version :** 2.72.1 | **Dernière mise à jour :** 2026-10-21 +> **Version :** 2.73.0 | **Dernière mise à jour :** 2026-10-21 > **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact > vers les fonctionnalités livrées. > - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)** diff --git a/frontend/draco-barre.css b/frontend/draco-barre.css index 9014a47..bec8c50 100644 --- a/frontend/draco-barre.css +++ b/frontend/draco-barre.css @@ -1,5 +1,7 @@ /* Barre d'apps commune dracodev — v0.1.0 (bloc 0, ACC-0.2) ; - v0.1.2 : palier mobile resserré selon la spec (voir @media 700px). + v0.1.2 : palier mobile resserré selon la spec (voir @media 700px) ; + v0.1.3 : la marque ✦ (plus grande) ouvre le menu des applications — + c'est LE changement d'app en mobile (choix de Bruno, 2026-10-21). Jetons repris du prototype validé Console v7.2. Thème : clair par défaut, sombre via [data-theme="dark"] sur ou prefers-color-scheme si l'app intégratrice ne force rien. */ @@ -8,6 +10,7 @@ --bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3; --ink: #1b1d1a; --ink-2: #5c615a; --ink-3: #787d75; --line: #dedfd9; --agent: #c2437e; --danger: #cf4444; + position: relative; height: 60px; box-sizing: border-box; display: grid; grid-template-columns: auto minmax(200px, 520px) auto; align-items: center; gap: 16px; padding: 0 12px; @@ -25,9 +28,29 @@ .draco-bar-centre { justify-content: center; } .draco-bar-droite { justify-content: flex-end; } -/* Marque */ -.draco-brand { display: flex; align-items: center; gap: 7px; color: var(--ink); text-decoration: none; font-weight: 800; } -.draco-brand-mark { color: var(--agent); } +/* Marque — bouton du menu des applications (v0.1.3) */ +.draco-brand { display: flex; align-items: center; gap: 7px; color: var(--ink); text-decoration: none; font-weight: 800; cursor: pointer; border-radius: 10px; padding: 4px 6px; margin: -4px -6px; } +.draco-brand:hover { background: var(--surface-2); } +.draco-brand-mark { color: var(--agent); font-size: 24px; line-height: 1; } + +/* Menu des applications — construit par le JS depuis les onglets */ +.draco-apps-menu { + position: absolute; top: calc(100% + 6px); left: 10px; z-index: 400; + min-width: 248px; padding: 6px; + background: var(--surface); border: 1px solid var(--line); border-radius: 14px; + box-shadow: 0 16px 44px rgb(0 0 0 / .28); +} +.draco-apps-menu[hidden] { display: none; } +.draco-apps-item { + display: flex; align-items: center; gap: 10px; + padding: 8px 10px; border-radius: 10px; + color: var(--ink); text-decoration: none; +} +.draco-apps-item:hover, .draco-apps-item:focus-visible { background: var(--surface-2); } +.draco-apps-item[data-active="true"] { background: var(--surface-3); box-shadow: inset 2px 0 0 var(--agent); } +.draco-apps-item-txt { display: flex; flex-direction: column; min-width: 0; flex: 1; } +.draco-apps-item-nom { font-weight: 700; font-size: 14px; } +.draco-apps-item-role { font-size: 12px; color: var(--ink-2); } /* Onglets d'apps — accordéon : seule l'app courante est déployée */ .draco-apptabs { display: flex; gap: 6px; } diff --git a/frontend/draco-barre.js b/frontend/draco-barre.js index b39ba50..b5e454b 100644 --- a/frontend/draco-barre.js +++ b/frontend/draco-barre.js @@ -1,4 +1,5 @@ -/* Barre d'apps commune dracodev — comportement (v0.1.0, ACC-0.2) +/* Barre d'apps commune dracodev — comportement (v0.1.0, ACC-0.2 ; + * v0.1.3 : menu des applications ouvert par la marque ✦). * * 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 @@ -14,6 +15,9 @@ * Actions émises (data-act) : rail, palette, domaine (data-dom), * alertes, spark, menu, rappel-entete. L'app intégratrice décide de * chacune (ouvrir la palette, le panneau Spark, changer de domaine…). + * Action INTERNE (jamais relayée) : apps — la marque ✦ ouvre le menu + * des applications, construit depuis les onglets ; c'est le moyen de + * changer d'app en mobile, où les onglets sont repliés (v0.1.2). */ (function () { "use strict"; @@ -21,15 +25,16 @@ function setCounts(counts) { Object.keys(counts || {}).forEach(function (k) { - var b = document.querySelector('.draco-badge[data-badge="' + k + '"]'); - if (!b) return; - b.textContent = counts[k]; - b.hidden = !(counts[k] > 0); + /* Toutes les occurrences : l'onglet ET sa ligne dans le menu. */ + document.querySelectorAll('.draco-badge[data-badge="' + k + '"]').forEach(function (b) { + b.textContent = counts[k]; + b.hidden = !(counts[k] > 0); + }); }); } function setCurrent(app) { - document.querySelectorAll(".draco-apptab").forEach(function (t) { - t.dataset.active = t.dataset.app === app ? "true" : "false"; + document.querySelectorAll(".draco-apptab, .draco-apps-item").forEach(function (t) { + if (t.dataset.app) t.dataset.active = t.dataset.app === app ? "true" : "false"; }); } function setDomain(dom) { @@ -38,8 +43,70 @@ }); } + /* ── Menu des applications (v0.1.3) ────────────────────────────── + * Construit depuis les onglets présents dans la barre : mêmes + * liens, mêmes icônes, mêmes badges. Ouvert par la marque ✦ + * (data-act="apps"), fermé par un clic extérieur, Échap, ou le + * choix d'une application (la navigation suit son cours). */ + var bar = document.querySelector(".draco-bar"); + var brand = bar ? bar.querySelector(".draco-brand") : null; + var menu = null; + + function buildMenu() { + if (!bar || !brand || menu) return; + menu = document.createElement("div"); + menu.className = "draco-apps-menu"; + menu.hidden = true; + menu.setAttribute("role", "menu"); + menu.setAttribute("aria-label", "Applications"); + document.querySelectorAll(".draco-apptab").forEach(function (t) { + var a = document.createElement("a"); + a.className = "draco-apps-item"; + a.href = t.getAttribute("href"); + a.dataset.app = t.dataset.app; + a.setAttribute("role", "menuitem"); + var ico = t.querySelector(".draco-apptab-ico"); + if (ico) a.appendChild(ico.cloneNode(true)); + var txt = document.createElement("span"); + txt.className = "draco-apps-item-txt"; + var fort = t.querySelector(".draco-apptab-txt strong"); + var petit = t.querySelector(".draco-apptab-txt small"); + var nom = document.createElement("span"); + nom.className = "draco-apps-item-nom"; + nom.textContent = fort ? fort.textContent : t.dataset.app; + txt.appendChild(nom); + if (petit) { + var role = document.createElement("span"); + role.className = "draco-apps-item-role"; + role.textContent = petit.textContent; + txt.appendChild(role); + } + a.appendChild(txt); + var badge = t.querySelector(".draco-badge"); + if (badge) a.appendChild(badge.cloneNode(true)); + menu.appendChild(a); + }); + bar.appendChild(menu); + } + + function toggleMenu(force) { + buildMenu(); + if (!menu) return; + var open = typeof force === "boolean" ? force : menu.hidden; + menu.hidden = !open; + if (brand) brand.setAttribute("aria-expanded", open ? "true" : "false"); + } + document.addEventListener("click", function (ev) { var el = ev.target.closest("[data-act]"); + if (el && el.dataset.act === "apps") { + ev.preventDefault(); + toggleMenu(); + return; + } + if (menu && !menu.hidden && !ev.target.closest(".draco-apps-menu") && !ev.target.closest(".draco-brand")) { + toggleMenu(false); + } if (!el) return; var act = el.dataset.act; if (act === "domaine") setDomain(el.dataset.dom); @@ -47,9 +114,14 @@ else document.dispatchEvent(new CustomEvent("draco:bar", { detail: { act: act, el: el } })); }); + document.addEventListener("keydown", function (ev) { + if (ev.key === "Escape") toggleMenu(false); + }); + /* API publique : l'app met les compteurs à jour sans recharger. */ window.DRACO_BAR = { setCounts: setCounts, setCurrent: setCurrent, setDomain: setDomain }; + buildMenu(); if (cfg.current) setCurrent(cfg.current); if (cfg.domain) setDomain(cfg.domain); if (cfg.counts) setCounts(cfg.counts); diff --git a/frontend/index.html b/frontend/index.html index 637f9a8..cbb485b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -331,14 +331,14 @@
- +