ObsiGate 2.83.1 : barre v0.2.0 — onglet ShaarIt + garde data-theme #61
@@ -129,6 +129,7 @@ DEEPSEEK_MODEL=deepseek-chat
|
|||||||
# DRACO_FLOWDECK_URL=https://flowdeck.dracodev.net
|
# DRACO_FLOWDECK_URL=https://flowdeck.dracodev.net
|
||||||
# DRACO_TIKTAK_URL=https://tiktak.dracodev.net
|
# DRACO_TIKTAK_URL=https://tiktak.dracodev.net
|
||||||
# DRACO_KANBANTE_URL=https://kanbante.dracodev.net
|
# DRACO_KANBANTE_URL=https://kanbante.dracodev.net
|
||||||
|
# DRACO_SHAARIT_URL=https://shaarit.dracodev.net
|
||||||
# DRACO_GITEA_URL=https://git.dracodev.net
|
# DRACO_GITEA_URL=https://git.dracodev.net
|
||||||
|
|
||||||
# ── Fusion — émission d'événements vers le service d'agents (#220) ──
|
# ── Fusion — émission d'événements vers le service d'agents (#220) ──
|
||||||
|
|||||||
+8
-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.0**.
|
> [Unreleased](#unreleased). La dernière version livrée est **2.83.1**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,6 +14,13 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [2.83.1] — 2026-11-03
|
||||||
|
|
||||||
|
- **Barre commune (dracodev-commons v0.2.0 vendangée, @70c837a)** : nouvel onglet **ShaarIt** (bookmarks, réécriture Rust de Shaarli) après Kanbante et avant l'onglet Console Spark — `frontend/draco-barre.css` et `frontend/draco-barre.js` remplacés **verbatim** par la v0.2.0 (hachages vérifiés), logo `frontend/img/logos/shaarit.svg` ajouté tel quel ; le fragment porté dans `frontend/index.html` et `frontend/recherche.html` (jeton `{{URL_SHAARIT}}` remplacé par la route `/recherche`). L'URL ShaarIt suit le **même mécanisme** que les autres apps : `backend/draco_config.py` gagne la clé `shaarit` (défaut officiel `https://shaarit.dracodev.net`, variable `DRACO_SHAARIT_URL`, dérivation `-dev` → `shaarit-dev` depuis l'hôte de l'agent), servie dans `window.DRACO_URLS` et réécrite sur l'onglet comme les autres.
|
||||||
|
- **⚠️ Changement de comportement visible — garde `data-theme` (CSS v0.2.0)** : les blocs `prefers-color-scheme` du CSS vendangé sont désormais préfixés `html:not([data-theme])`. La copie précédente n'avait **pas** cette garde. ObsiGate pose toujours `data-theme` sur `<html>`, donc sa barre ne change pas en pratique ; la garde ne s'exercerait que sur une page hôte sans `data-theme` (elle ne forcerait plus le sombre système contre un choix clair). Signalé pour arbitrage à la fusion, comme chez Flowdeck où le piège était actif.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [2.83.0] — 2026-11-03
|
## [2.83.0] — 2026-11-03
|
||||||
|
|
||||||
- **Vaults DIR : exclusions par vault et lecture seule déclarable** (prépare le vault « Spark ») : trois nouvelles variables par vault DIR — `DIR_N_READONLY=true` (les mutations sont refusées en 403 « read_only » et l'arborescence n'affiche plus les actions d'écriture pour ce vault), `DIR_N_IGNORED_DIRS=.home,.venv,…` (noms de dossiers cachés à toute profondeur, en plus du global `IGNORED_DIRS`) et `DIR_N_IGNORED_PATHS=Executeurs/*/data,…` (motifs fnmatch sur le chemin relatif ; un dossier qui matche cache tout son sous-arbre). Les exclusions s'appliquent désormais **partout** — navigation (`/api/browse`), lecture (`/api/file`, `raw`, téléchargement : 404), liste des chemins et indexation — et plus seulement à l'indexeur. `/api/vaults` expose `readonly` pour chaque vault. Sans ces variables, comportement inchangé. Fiche : `docs/features/spark-vault-dir.md`. Tests : `tests/test_spark_vault_dir.py`.
|
- **Vaults DIR : exclusions par vault et lecture seule déclarable** (prépare le vault « Spark ») : trois nouvelles variables par vault DIR — `DIR_N_READONLY=true` (les mutations sont refusées en 403 « read_only » et l'arborescence n'affiche plus les actions d'écriture pour ce vault), `DIR_N_IGNORED_DIRS=.home,.venv,…` (noms de dossiers cachés à toute profondeur, en plus du global `IGNORED_DIRS`) et `DIR_N_IGNORED_PATHS=Executeurs/*/data,…` (motifs fnmatch sur le chemin relatif ; un dossier qui matche cache tout son sous-arbre). Les exclusions s'appliquent désormais **partout** — navigation (`/api/browse`), lecture (`/api/file`, `raw`, téléchargement : 404), liste des chemins et indexation — et plus seulement à l'indexeur. `/api/vaults` expose `readonly` pour chaque vault. Sans ces variables, comportement inchangé. Fiche : `docs/features/spark-vault-dir.md`. Tests : `tests/test_spark_vault_dir.py`.
|
||||||
|
|||||||
+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.0).
|
Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.83.1).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Projet : ObsiGate | Version : 2.83.0 | Dernière mise à jour : Septembre 2026*
|
*Projet : ObsiGate | Version : 2.83.1 | 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.0).
|
See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.83.1).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Project: ObsiGate | Version: 2.83.0 | Last updated: September 2026*
|
*Project: ObsiGate | Version: 2.83.1 | Last updated: September 2026*
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ Variables (voir ``.env.example``) :
|
|||||||
- ``DRACO_FLOWDECK_URL`` — base publique de Flowdeck.
|
- ``DRACO_FLOWDECK_URL`` — base publique de Flowdeck.
|
||||||
- ``DRACO_TIKTAK_URL`` — base publique de TikTak.
|
- ``DRACO_TIKTAK_URL`` — base publique de TikTak.
|
||||||
- ``DRACO_KANBANTE_URL`` — base publique de Kanbante.
|
- ``DRACO_KANBANTE_URL`` — base publique de Kanbante.
|
||||||
|
- ``DRACO_SHAARIT_URL`` — base publique de ShaarIt (barre v0.2.0).
|
||||||
- ``DRACO_GITEA_URL`` — base publique de Gitea (les cartes
|
- ``DRACO_GITEA_URL`` — base publique de Gitea (les cartes
|
||||||
Kanbante *sont* des issues Gitea, contrat liens-profonds) ;
|
Kanbante *sont* des issues Gitea, contrat liens-profonds) ;
|
||||||
distincte de ``OBSIGATE_GITEA_URL`` (source connectée de
|
distincte de ``OBSIGATE_GITEA_URL`` (source connectée de
|
||||||
@@ -50,6 +51,7 @@ DEFAUTS: dict[str, str] = {
|
|||||||
"flowdeck": "https://flowdeck.dracodev.net",
|
"flowdeck": "https://flowdeck.dracodev.net",
|
||||||
"tiktak": "https://tiktak.dracodev.net",
|
"tiktak": "https://tiktak.dracodev.net",
|
||||||
"kanbante": "https://kanbante.dracodev.net",
|
"kanbante": "https://kanbante.dracodev.net",
|
||||||
|
"shaarit": "https://shaarit.dracodev.net",
|
||||||
"gitea": "https://git.dracodev.net",
|
"gitea": "https://git.dracodev.net",
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +61,7 @@ _VARIABLES: dict[str, str] = {
|
|||||||
"flowdeck": "DRACO_FLOWDECK_URL",
|
"flowdeck": "DRACO_FLOWDECK_URL",
|
||||||
"tiktak": "DRACO_TIKTAK_URL",
|
"tiktak": "DRACO_TIKTAK_URL",
|
||||||
"kanbante": "DRACO_KANBANTE_URL",
|
"kanbante": "DRACO_KANBANTE_URL",
|
||||||
|
"shaarit": "DRACO_SHAARIT_URL",
|
||||||
"gitea": "DRACO_GITEA_URL",
|
"gitea": "DRACO_GITEA_URL",
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +74,7 @@ _SLUGS_HOTE: dict[str, str] = {
|
|||||||
"flowdeck": "flowdeck",
|
"flowdeck": "flowdeck",
|
||||||
"tiktak": "tiktak",
|
"tiktak": "tiktak",
|
||||||
"kanbante": "kanbante",
|
"kanbante": "kanbante",
|
||||||
|
"shaarit": "shaarit",
|
||||||
}
|
}
|
||||||
|
|
||||||
# Premier label de l'hôte de l'agent : ``agent`` suivi d'un suffixe
|
# Premier label de l'hôte de l'agent : ``agent`` suivi d'un suffixe
|
||||||
|
|||||||
+3
-1
@@ -966,7 +966,8 @@ if FRONTEND_DIR.exists():
|
|||||||
|
|
||||||
frontend/recherche.html est servi avec les jetons {{URL_*}}
|
frontend/recherche.html est servi avec les jetons {{URL_*}}
|
||||||
remplacés par urls_publiques() (même contrat que le fragment
|
remplacés par urls_publiques() (même contrat que le fragment
|
||||||
de barre, jeton {{URL_AGENT}} inclus pour l'onglet Console
|
de barre, jetons {{URL_SHAARIT}} et {{URL_AGENT}} inclus pour
|
||||||
|
les onglets ShaarIt (barre v0.2.0) et Console
|
||||||
Spark de la barre re-vendangée) et le nonce CSP frais ; la
|
Spark de la barre re-vendangée) et le nonce CSP frais ; la
|
||||||
réponse pose sa propre CSP (préservée par
|
réponse pose sa propre CSP (préservée par
|
||||||
SecurityHeadersMiddleware, qui ne la pose que si elle est
|
SecurityHeadersMiddleware, qui ne la pose que si elle est
|
||||||
@@ -992,6 +993,7 @@ if FRONTEND_DIR.exists():
|
|||||||
("{{URL_FLOWDECK}}", "flowdeck"),
|
("{{URL_FLOWDECK}}", "flowdeck"),
|
||||||
("{{URL_TIKTAK}}", "tiktak"),
|
("{{URL_TIKTAK}}", "tiktak"),
|
||||||
("{{URL_KANBANTE}}", "kanbante"),
|
("{{URL_KANBANTE}}", "kanbante"),
|
||||||
|
("{{URL_SHAARIT}}", "shaarit"),
|
||||||
("{{URL_AGENT}}", "agent"),
|
("{{URL_AGENT}}", "agent"),
|
||||||
):
|
):
|
||||||
html = html.replace(jeton, urls.get(cle, ""))
|
html = html.replace(jeton, urls.get(cle, ""))
|
||||||
|
|||||||
Generated
+1
-1
@@ -2626,7 +2626,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.83.0"
|
version = "2.83.1"
|
||||||
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.0"
|
version = "2.83.1"
|
||||||
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.0",
|
"version": "2.83.1",
|
||||||
"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.0 | **Dernière mise à jour :** 2026-11-03
|
> **Version :** 2.83.1 | **Dernière mise à jour :** 2026-11-03
|
||||||
> **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)**
|
||||||
|
|||||||
@@ -12,9 +12,18 @@
|
|||||||
Alertes icône seule.
|
Alertes icône seule.
|
||||||
v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée,
|
v0.1.11 : marque = étoile Spark monochrome (blanche barre foncée,
|
||||||
noire barre claire) ; anneau rouge #c00000 autour de l'avatar flottant.
|
noire barre claire) ; anneau rouge #c00000 autour de l'avatar flottant.
|
||||||
|
v0.2.0 : nouvel onglet « ShaarIt » (data-app="shaarit", --app émeraude
|
||||||
|
#059669, logo logos/shaarit.svg via {{LOGO_SHAARIT}}) avant l'onglet
|
||||||
|
agent ; GARDE data-theme : les blocs prefers-color-scheme ne
|
||||||
|
s'appliquent que si <html> n'a AUCUN attribut data-theme
|
||||||
|
(html:not([data-theme])) — avant ce correctif, un hôte ayant choisi
|
||||||
|
le clair via data-theme="light" héritait quand même du sombre
|
||||||
|
système (piège constaté dans les copies vendangées de
|
||||||
|
Kanbante/Flowdeck ; les re-vendanges de la v0.2.0 le corrigent).
|
||||||
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
|
||||||
|
(aucun attribut data-theme sur <html>). */
|
||||||
|
|
||||||
.draco-bar {
|
.draco-bar {
|
||||||
--bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3;
|
--bg: #f2f2f0; --surface: #ffffff; --surface-2: #e9eae6; --surface-3: #f6f6f3;
|
||||||
@@ -27,8 +36,12 @@
|
|||||||
background: var(--surface); border-bottom: 1px solid var(--line);
|
background: var(--surface); border-bottom: 1px solid var(--line);
|
||||||
font: 500 14px/1.3 system-ui, "Segoe UI", sans-serif; color: var(--ink);
|
font: 500 14px/1.3 system-ui, "Segoe UI", sans-serif; color: var(--ink);
|
||||||
}
|
}
|
||||||
|
/* Garde data-theme (v0.2.0) : le sombre système ne s'applique QUE si
|
||||||
|
* l'hôte n'a posé aucun data-theme sur <html>. Sans cette garde, un
|
||||||
|
* hôte en data-theme="light" sur un système sombre affichait la barre
|
||||||
|
* sombre malgré son choix explicite. */
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
.draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f;
|
html:not([data-theme]) .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f;
|
||||||
--ink:#eceee9; --ink-2:#a6aba2; --ink-3:#8b9089; --line:#2e302c; }
|
--ink:#eceee9; --ink-2:#a6aba2; --ink-3:#8b9089; --line:#2e302c; }
|
||||||
}
|
}
|
||||||
[data-theme="dark"] .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f;
|
[data-theme="dark"] .draco-bar { --bg:#101211; --surface:#1a1c1a; --surface-2:#242624; --surface-3:#20221f;
|
||||||
@@ -48,7 +61,7 @@
|
|||||||
barre foncée (filtre annulé par les règles thème ci-dessous). */
|
barre foncée (filtre annulé par les règles thème ci-dessous). */
|
||||||
.draco-brand-mark img { width: 26px; height: 26px; object-fit: cover; display: block; filter: brightness(0); }
|
.draco-brand-mark img { width: 26px; height: 26px; object-fit: cover; display: block; filter: brightness(0); }
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
.draco-bar .draco-brand-mark img { filter: none; }
|
html:not([data-theme]) .draco-bar .draco-brand-mark img { filter: none; }
|
||||||
}
|
}
|
||||||
[data-theme="dark"] .draco-bar .draco-brand-mark img { filter: none; }
|
[data-theme="dark"] .draco-bar .draco-brand-mark img { filter: none; }
|
||||||
|
|
||||||
@@ -218,6 +231,9 @@
|
|||||||
.draco-bar[data-current="flowdeck"] .draco-apptab[data-app="flowdeck"],
|
.draco-bar[data-current="flowdeck"] .draco-apptab[data-app="flowdeck"],
|
||||||
.draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"],
|
.draco-bar[data-current="tiktak"] .draco-apptab[data-app="tiktak"],
|
||||||
.draco-bar[data-current="kanbante"] .draco-apptab[data-app="kanbante"],
|
.draco-bar[data-current="kanbante"] .draco-apptab[data-app="kanbante"],
|
||||||
|
/* v0.2.0 : sur ShaarIt elle-même (data-current="shaarit"), c'est
|
||||||
|
l'onglet ShaarIt qui reste visible en mobile. */
|
||||||
|
.draco-bar[data-current="shaarit"] .draco-apptab[data-app="shaarit"],
|
||||||
/* Chantier 5 : sur la console elle-même (data-current="agent",
|
/* Chantier 5 : sur la console elle-même (data-current="agent",
|
||||||
programme console #71), c'est l'onglet Console Spark qui reste
|
programme console #71), c'est l'onglet Console Spark qui reste
|
||||||
visible en mobile — les 4 hôtes gardent leur propre courant. */
|
visible en mobile — les 4 hôtes gardent leur propre courant. */
|
||||||
|
|||||||
+18
-6
@@ -8,7 +8,12 @@
|
|||||||
* correctif fusion #70 (SANS bump de version, publication séparée) :
|
* correctif fusion #70 (SANS bump de version, publication séparée) :
|
||||||
* bouton trois points et son menu par défaut SUPPRIMÉS, « Console Spark »
|
* bouton trois points et son menu par défaut SUPPRIMÉS, « Console Spark »
|
||||||
* ajoutée au menu de la marque, fermeture/focus corrigés (voir
|
* ajoutée au menu de la marque, fermeture/focus corrigés (voir
|
||||||
* « Menu des applications », « Focus » et « Écouteurs globaux »).
|
* « Menu des applications », « Focus » et « Écouteurs globaux ») ;
|
||||||
|
* v0.2.0 : 5e application ShaarIt — clé urls.shaarit, défaut officiel
|
||||||
|
* https://shaarit.dracodev.net/, dérivation -dev shaarit-dev (même
|
||||||
|
* contrat que les autres apps), entrée APP_LABELS ; l'onglet
|
||||||
|
* (data-app="shaarit", après Kanbante, avant agent) est repris
|
||||||
|
* automatiquement par la construction du menu de la marque.
|
||||||
*
|
*
|
||||||
* 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
|
||||||
@@ -26,6 +31,7 @@
|
|||||||
* flowdeck: "https://flowdeck.dracodev.net/",
|
* flowdeck: "https://flowdeck.dracodev.net/",
|
||||||
* tiktak: "https://tiktak.dracodev.net/",
|
* tiktak: "https://tiktak.dracodev.net/",
|
||||||
* kanbante: "https://kanbante.dracodev.net/",
|
* kanbante: "https://kanbante.dracodev.net/",
|
||||||
|
* shaarit: "https://shaarit.dracodev.net/",
|
||||||
* agent: "https://agent.dracodev.net/",
|
* agent: "https://agent.dracodev.net/",
|
||||||
* spark: "https://spark.dracodev.net/"
|
* spark: "https://spark.dracodev.net/"
|
||||||
* },
|
* },
|
||||||
@@ -54,10 +60,13 @@
|
|||||||
* La clé spark ne correspond à aucun onglet de la barre : elle est
|
* La clé spark ne correspond à aucun onglet de la barre : elle est
|
||||||
* résolue et exposée via DRACO_BAR.urls pour le panneau Spark
|
* résolue et exposée via DRACO_BAR.urls pour le panneau Spark
|
||||||
* (panneau-agent), qui suit le même contrat d'injection. La clé agent,
|
* (panneau-agent), qui suit le même contrat d'injection. La clé agent,
|
||||||
* elle, a un onglet depuis le chantier 5 (ordre : ObsiGate, Flowdeck,
|
* elle, a un onglet depuis le chantier 5 (ordre, v0.2.0 : ObsiGate,
|
||||||
* TikTak, Kanbante, Console Spark) : elle suit donc l'étape « href
|
* Flowdeck, TikTak, Kanbante, ShaarIt, Console Spark) : elle suit
|
||||||
|
* donc l'étape « href
|
||||||
* rendu » comme les autres onglets, en plus d'alimenter le menu de
|
* rendu » comme les autres onglets, en plus d'alimenter le menu de
|
||||||
* la marque et DRACO_BAR.urls.
|
* la marque et DRACO_BAR.urls. Même résolution pour shaarit (v0.2.0) :
|
||||||
|
* explicite > dérivation -dev shaarit-dev > href rendu
|
||||||
|
* ({{URL_SHAARIT}}) > défaut officiel.
|
||||||
* Actions émises (data-act) : rail, palette, domaine (data-dom),
|
* Actions émises (data-act) : rail, palette, domaine (data-dom),
|
||||||
* alertes, spark, rappel-entete. L'app intégratrice décide de chacune
|
* alertes, spark, rappel-entete. L'app intégratrice décide de chacune
|
||||||
* (ouvrir la palette, le panneau Spark, changer de domaine…).
|
* (ouvrir la palette, le panneau Spark, changer de domaine…).
|
||||||
@@ -144,6 +153,7 @@
|
|||||||
flowdeck: "https://flowdeck.dracodev.net/",
|
flowdeck: "https://flowdeck.dracodev.net/",
|
||||||
tiktak: "https://tiktak.dracodev.net/",
|
tiktak: "https://tiktak.dracodev.net/",
|
||||||
kanbante: "https://kanbante.dracodev.net/",
|
kanbante: "https://kanbante.dracodev.net/",
|
||||||
|
shaarit: "https://shaarit.dracodev.net/",
|
||||||
agent: "https://agent.dracodev.net/",
|
agent: "https://agent.dracodev.net/",
|
||||||
spark: "https://spark.dracodev.net/"
|
spark: "https://spark.dracodev.net/"
|
||||||
};
|
};
|
||||||
@@ -157,12 +167,13 @@
|
|||||||
flowdeck: "https://flowdeck-dev.dracodev.net/",
|
flowdeck: "https://flowdeck-dev.dracodev.net/",
|
||||||
tiktak: "https://tiktak-dev.dracodev.net/",
|
tiktak: "https://tiktak-dev.dracodev.net/",
|
||||||
kanbante: "https://kanbante-dev.dracodev.net/",
|
kanbante: "https://kanbante-dev.dracodev.net/",
|
||||||
|
shaarit: "https://shaarit-dev.dracodev.net/",
|
||||||
agent: "https://agent-dev.dracodev.net/"
|
agent: "https://agent-dev.dracodev.net/"
|
||||||
};
|
};
|
||||||
|
|
||||||
var APP_LABELS = {
|
var APP_LABELS = {
|
||||||
obsigate: "ObsiGate", flowdeck: "Flowdeck",
|
obsigate: "ObsiGate", flowdeck: "Flowdeck",
|
||||||
tiktak: "TikTak", kanbante: "Kanbante"
|
tiktak: "TikTak", kanbante: "Kanbante", shaarit: "ShaarIt"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Vrai si hostname est un hôte -dev dracodev.net : première étiquette
|
/* Vrai si hostname est un hôte -dev dracodev.net : première étiquette
|
||||||
@@ -365,7 +376,8 @@
|
|||||||
if (badge) a.appendChild(badge.cloneNode(true));
|
if (badge) a.appendChild(badge.cloneNode(true));
|
||||||
appsMenu.appendChild(a);
|
appsMenu.appendChild(a);
|
||||||
});
|
});
|
||||||
/* Entrée « Console Spark » (#70) : après Kanbante, vers la console
|
/* Entrée « Console Spark » (#70) : après les onglets d'apps
|
||||||
|
* (ObsiGate…ShaarIt, v0.2.0), vers la console
|
||||||
* de l'agent commun (URL agent résolue — explicite > -dev >
|
* de l'agent commun (URL agent résolue — explicite > -dev >
|
||||||
* défaut prod ; aucun hôte spark-dev inventé). data-app="agent"
|
* défaut prod ; aucun hôte spark-dev inventé). data-app="agent"
|
||||||
* l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les
|
* l'intègre à refreshMenuHrefs/applyUrls/setCurrent comme les
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240">
|
||||||
|
<!-- ShaarIt — signet (bookmark) blanc sur fond émeraude #059669,
|
||||||
|
couleur signature de l'app dans la barre (#059669, distincte du
|
||||||
|
teal Kanbante #0d9488). Fond arrondi comme les logos PNG 180 px
|
||||||
|
des autres apps ; géométrie simple, aucun redessin d'un logo
|
||||||
|
existant : le signet EST le symbole de l'app (bookmarks). -->
|
||||||
|
<rect x="8" y="8" width="224" height="224" rx="48" fill="#059669"/>
|
||||||
|
<path d="M 82 52 L 158 52 L 158 190 L 120 152 L 82 190 Z" fill="#ffffff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 569 B |
+14
-3
@@ -268,9 +268,16 @@
|
|||||||
|
|
||||||
<!-- Main Application (wrapped for show/hide) -->
|
<!-- Main Application (wrapped for show/hide) -->
|
||||||
<!-- Barre d'apps commune dracodev — Fusion #215 (ACC-1.1).
|
<!-- Barre d'apps commune dracodev — Fusion #215 (ACC-1.1).
|
||||||
Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.1.11
|
Snippet FIGÉ vendangé depuis Projets/dracodev-commons v0.2.0
|
||||||
(ui/barre-apps/) : ne pas modifier la structure ici ; toute
|
(ui/barre-apps/, commit 70c837a de la branche
|
||||||
évolution passe par une nouvelle version de commons.
|
shaarit-phase3-barre-contrats) : ne pas modifier la structure
|
||||||
|
ici ; toute évolution passe par une nouvelle version de commons.
|
||||||
|
v0.2.0 : 6e onglet ShaarIt (data-app="shaarit", après Kanbante,
|
||||||
|
avant l'onglet agent) — son href porte le défaut officiel et
|
||||||
|
la réécriture DRACO_URLS ci-dessous le résout comme les
|
||||||
|
autres (config backend/draco_config, dérivation -dev incluse) ;
|
||||||
|
le CSS vendangé gagne la garde data-theme sur
|
||||||
|
prefers-color-scheme (html:not([data-theme])).
|
||||||
CSS/JS : /static/draco-barre.css, /static/draco-barre.js.
|
CSS/JS : /static/draco-barre.css, /static/draco-barre.js.
|
||||||
Icônes logos v0.1.9 (2026-10-29) : les 5 tuiles sont les logos
|
Icônes logos v0.1.9 (2026-10-29) : les 5 tuiles sont les logos
|
||||||
fournis, tels quels, servis depuis /static/img/logos/ (copie de
|
fournis, tels quels, servis depuis /static/img/logos/ (copie de
|
||||||
@@ -317,6 +324,10 @@
|
|||||||
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
|
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
|
||||||
<span class="draco-badge" data-badge="kanbante" hidden>0</span>
|
<span class="draco-badge" data-badge="kanbante" hidden>0</span>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="draco-apptab" data-app="shaarit" href="https://shaarit.dracodev.net/">
|
||||||
|
<span class="draco-apptab-ico" style="--app:#059669" data-icon="shaarit"><img src="/static/img/logos/shaarit.svg" alt="ShaarIt" width="30" height="30"></span>
|
||||||
|
<span class="draco-apptab-txt"><strong>ShaarIt</strong><small>Bookmarks</small></span>
|
||||||
|
</a>
|
||||||
<a class="draco-apptab" data-app="agent" href="https://agent.dracodev.net/">
|
<a class="draco-apptab" data-app="agent" href="https://agent.dracodev.net/">
|
||||||
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
|
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
|
||||||
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
|
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
retomberait sur les défauts prod (les jetons sont ignorés par
|
retomberait sur les défauts prod (les jetons sont ignorés par
|
||||||
le JS) — jamais d'URL inventée.
|
le JS) — jamais d'URL inventée.
|
||||||
La barre ci-dessous est une copie statique du snippet figé de
|
La barre ci-dessous est une copie statique du snippet figé de
|
||||||
index.html (commons v0.1.11 + chantier 5 fusion #69/#71, sans
|
index.html (commons v0.2.0 + chantier 5 fusion #69/#71, sans
|
||||||
bump) : les onglets sont des liens réels, le bouton central
|
bump) : les onglets sont des liens réels, le bouton central
|
||||||
replace le curseur dans la boîte (recherche.js,
|
replace le curseur dans la boîte (recherche.js,
|
||||||
clic data-act="palette"). Re-vendoring alignement recherche :
|
clic data-act="palette"). Re-vendoring alignement recherche :
|
||||||
@@ -79,6 +79,10 @@
|
|||||||
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
|
<span class="draco-apptab-txt"><strong>Kanbante</strong><small>Kanban</small></span>
|
||||||
<span class="draco-badge" data-badge="kanbante" hidden>0</span>
|
<span class="draco-badge" data-badge="kanbante" hidden>0</span>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="draco-apptab" data-app="shaarit" href="{{URL_SHAARIT}}">
|
||||||
|
<span class="draco-apptab-ico" style="--app:#059669" data-icon="shaarit"><img src="/static/img/logos/shaarit.svg" alt="ShaarIt" width="30" height="30"></span>
|
||||||
|
<span class="draco-apptab-txt"><strong>ShaarIt</strong><small>Bookmarks</small></span>
|
||||||
|
</a>
|
||||||
<a class="draco-apptab" data-app="agent" href="{{URL_AGENT}}">
|
<a class="draco-apptab" data-app="agent" href="{{URL_AGENT}}">
|
||||||
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
|
<span class="draco-apptab-ico" style="--app:#c00000" data-icon="agent"><img src="/static/img/logos/spark.png" alt="Console Spark" width="30" height="30"></span>
|
||||||
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
|
<span class="draco-apptab-txt"><strong>Console Spark</strong><small>Agent commun</small></span>
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsigate",
|
"name": "obsigate",
|
||||||
"version": "2.83.0",
|
"version": "2.83.1",
|
||||||
"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": {
|
||||||
|
|||||||
@@ -55,6 +55,29 @@ def test_menu_des_applications_par_la_marque():
|
|||||||
assert '<span class="draco-brand-mark"><img src="/static/img/brand-spark.png"' in recherche
|
assert '<span class="draco-brand-mark"><img src="/static/img/brand-spark.png"' in recherche
|
||||||
|
|
||||||
|
|
||||||
|
def test_barre_v020_onglet_shaarit_et_garde_data_theme():
|
||||||
|
# Barre v0.2.0 (dracodev-commons @70c837a) : 6e onglet ShaarIt
|
||||||
|
# après Kanbante et avant l'onglet agent, logo fourni tel quel,
|
||||||
|
# et garde data-theme sur les blocs prefers-color-scheme du CSS
|
||||||
|
# vendangé (html:not([data-theme])) — sans elle, un hôte en
|
||||||
|
# data-theme="light" sur système sombre héritait du sombre.
|
||||||
|
css = _css()
|
||||||
|
assert "html:not([data-theme]) .draco-bar {" in css
|
||||||
|
assert "html:not([data-theme]) .draco-bar .draco-brand-mark img" in css
|
||||||
|
assert (FRONTEND / "img" / "logos" / "shaarit.svg").is_file()
|
||||||
|
for nom, jeton in (("index.html", "https://shaarit.dracodev.net/"),
|
||||||
|
("recherche.html", "{{URL_SHAARIT}}")):
|
||||||
|
html = (FRONTEND / nom).read_text(encoding="utf-8")
|
||||||
|
nav = html.split('<nav class="draco-apptabs"')[1].split("</nav>")[0]
|
||||||
|
assert f'data-app="shaarit" href="{jeton}"' in nav
|
||||||
|
assert 'data-icon="shaarit"><img src="/static/img/logos/shaarit.svg"' in nav
|
||||||
|
assert nav.index('data-app="kanbante"') < nav.index('data-app="shaarit"')
|
||||||
|
assert nav.index('data-app="shaarit"') < nav.index('data-app="agent"')
|
||||||
|
js = (FRONTEND / "draco-barre.js").read_text(encoding="utf-8")
|
||||||
|
assert 'shaarit: "https://shaarit.dracodev.net/"' in js
|
||||||
|
assert 'shaarit: "https://shaarit-dev.dracodev.net/"' in js
|
||||||
|
|
||||||
|
|
||||||
def test_panneau_spark_integre_218():
|
def test_panneau_spark_integre_218():
|
||||||
# #218 : le bouton Spark de la barre ouvre le panneau de l'agent
|
# #218 : le bouton Spark de la barre ouvre le panneau de l'agent
|
||||||
# commun (mêmes assets partagés que TikTak / Flowdeck / Kanbante).
|
# commun (mêmes assets partagés que TikTak / Flowdeck / Kanbante).
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ def env_propre(monkeypatch):
|
|||||||
"""Aucune variable d'URL d'écosystème posée (défauts officiels)."""
|
"""Aucune variable d'URL d'écosystème posée (défauts officiels)."""
|
||||||
for nom in (
|
for nom in (
|
||||||
"DRACO_AGENT_URL", "DRACO_OBSIGATE_URL", "DRACO_FLOWDECK_URL",
|
"DRACO_AGENT_URL", "DRACO_OBSIGATE_URL", "DRACO_FLOWDECK_URL",
|
||||||
"DRACO_TIKTAK_URL", "DRACO_KANBANTE_URL", "DRACO_GITEA_URL",
|
"DRACO_TIKTAK_URL", "DRACO_KANBANTE_URL", "DRACO_SHAARIT_URL",
|
||||||
|
"DRACO_GITEA_URL",
|
||||||
"AGENT_EVENEMENTS_URL",
|
"AGENT_EVENEMENTS_URL",
|
||||||
):
|
):
|
||||||
monkeypatch.delenv(nom, raising=False)
|
monkeypatch.delenv(nom, raising=False)
|
||||||
@@ -37,6 +38,20 @@ def test_defauts_officiels_sans_dev(env_propre):
|
|||||||
assert "-dev" not in url
|
assert "-dev" not in url
|
||||||
|
|
||||||
|
|
||||||
|
def test_shaarit_defaut_et_derivation(env_propre):
|
||||||
|
"""Barre v0.2.0 : ShaarIt suit le même mécanisme que les autres
|
||||||
|
sœurs — défaut officiel, dérivation -dev depuis l'hôte de l'agent,
|
||||||
|
variable explicite prioritaire."""
|
||||||
|
assert draco_config.app_url("shaarit") == "https://shaarit.dracodev.net"
|
||||||
|
env_propre.setenv(
|
||||||
|
"AGENT_EVENEMENTS_URL", "https://agent-dev.dracodev.net/api/v1/evenements")
|
||||||
|
assert draco_config.app_url("shaarit") == "https://shaarit-dev.dracodev.net"
|
||||||
|
assert draco_config.urls_publiques()["shaarit"] == \
|
||||||
|
"https://shaarit-dev.dracodev.net"
|
||||||
|
env_propre.setenv("DRACO_SHAARIT_URL", "https://bm.example.net/")
|
||||||
|
assert draco_config.app_url("shaarit") == "https://bm.example.net"
|
||||||
|
|
||||||
|
|
||||||
def test_agent_derive_des_evenements(env_propre):
|
def test_agent_derive_des_evenements(env_propre):
|
||||||
"""Sans DRACO_AGENT_URL, l'origine suit AGENT_EVENEMENTS_URL —
|
"""Sans DRACO_AGENT_URL, l'origine suit AGENT_EVENEMENTS_URL —
|
||||||
la configuration réelle du poste (dev inclus)."""
|
la configuration réelle du poste (dev inclus)."""
|
||||||
|
|||||||
Reference in New Issue
Block a user