- Racine : entrées « Favoris » (étoile) et « Personnel » en tête, ni
sélectionnables ni déplaçables ; fil d'Ariane et sélecteur « Déplacer
vers… » affichent Personnel/Favoris à la place de .perso/.favoris.
- Favoris : glisser un schéma sur Favoris (ou l'étoile) crée un lien, sans
déplacer l'original ; ouvrir un favori ouvre l'original sans quitter
Favoris ; Supprimer y retire seulement le lien ; emplacement de l'original
affiché ; favori cassé barré. Plus de favoris sur les dossiers. Le filtre
« Favoris » de la ligne de tags est remplacé par le dossier.
- Barre du haut : cartouche encadré « OIDC » + e-mail, ou « LOCAL » + nom
du compte, avant le bouton de déconnexion.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0174sFqehj4uGqJHQZvWy1gn
- Bouton punaise (barre de recherche de l'explorateur) : épinglé = colonne fixe
redimensionnable (comportement actuel) ; désépinglé = panneau masqué qui
s'ouvre par-dessus le canevas.
- Désépinglé : ouverture par le bouton ☰ ou en survolant le bord gauche ;
fermeture à l'ouverture d'un schéma, au clic hors du panneau, par Échap, ou
en quittant le panneau s'il a été ouvert par survol. Il revient seul quand
le schéma est fermé ou qu'aucun n'est ouvert.
- À la bascule, le défilement du canevas est compensé : le schéma ne bouge pas
à l'écran (zoom conservé, pas de recadrage).
- Choix mémorisé par navigateur (localStorage drawerPinned). Sur mobile,
l'explorateur reste un tiroir et le bouton est masqué.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XR9aSZwC3Ssajfy1R7SLPo
- AUTH_MODE=local (défaut) : comportement inchangé, Basic si AUTH_USER et
AUTH_PASSWORD sont définis, sinon aucune authentification intégrée.
- AUTH_MODE=oidc : flux Authorization Code + PKCE (S256) avec state et nonce,
découverte .well-known, vérification de l'ID Token (RS*/PS*/ES* via JWKS
avec rotation des clés, HS* avec le secret client), émetteur, audience,
expiration ; restriction optionnelle par groupes (OIDC_ALLOWED_GROUPS,
OIDC_GROUPS_CLAIM, chemin pointé accepté).
- Session : cookie HttpOnly SameSite=Lax signé HMAC (SESSION_SECRET, sinon
DATA_DIR/.session-secret), prolongée à l'usage (SESSION_TTL d'inactivité).
- Routes /auth/login, /auth/callback, /auth/logout (déconnexion propagée au
fournisseur si OIDC_LOGOUT), /auth/logged-out ; GET /api/me.
- /s/, /api/public/, /healthz et fichiers statiques restent publics.
- Sans session : l'API répond 401 + X-Auth-Login, la navigation renvoie vers
la connexion en conservant le schéma ouvert (#/chemin).
- Frontend : reconnexion automatique sur 401, bouton de déconnexion.
- Bibliothèque standard uniquement (internal/auth), tests avec un
fournisseur simulé.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018GBsBpHJW7GxFDBV7z1zmo
libraries.excalidraw.com renvoie vers l'application avec #addLibrary=<url>&token=…
Le routeur par hash prenait ce fragment pour un chemin de schéma (« extension
.excalidraw attendue »). Le lien est désormais intercepté avant le routeur :
téléchargement du .excalidrawlib (mêmes sources autorisées qu'Excalidraw),
confirmation, fusion dans la bibliothèque partagée stockée côté serveur.
- Schéma ouvert : fusion dans l'éditeur et ouverture du panneau Bibliothèque.
- Nouvel onglet : enregistrement côté serveur puis réouverture du dernier schéma.
- window.name propre à l'onglet pour que le site des bibliothèques revienne dans
l'onglet d'origine.
- La bibliothèque suit les modifications d'un schéma à l'autre et est relue au
retour sur l'onglet (évite d'écraser un ajout fait ailleurs).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MvjHH36mmWGqRw5AiHpLQd
initialData.scrollToContent centre un seul élément quand le schéma déborde
de la fenêtre (calculateScrollCenter → getClosestElementBounds) : le contenu
apparaissait à partir du milieu de l'écran. On cadre désormais tout le
schéma au premier rendu via scrollToContent(fitToContent), zoom plafonné à
100 %, dans l'éditeur comme dans la vue partagée.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ATA96SLvdmiapoLXgenYrR
- Lien /s/<jeton> : jeton = id aléatoire 128 bits + HMAC-SHA256 tronqué par la
clé du serveur (SHARE_SECRET, sinon DATA_DIR/.share-secret générée en 0600).
Valide si la signature est correcte, le lien présent dans .shares.json et non
expiré (1, 7, 30 jours ou sans expiration).
- API : GET/POST/DELETE /api/shares, POST /api/shares/revoke-all (renouvelle la
clé), GET /api/public/{jeton} hors authentification (nom, titre, logo, scène).
- Auth Basic : /s/, /api/public/, /healthz et les fichiers statiques du build
sont publics ; le reste de l'API et l'index restent protégés. Le serveur
statique ne liste plus les répertoires. X-Robots-Tag: noindex sur les liens.
- Les liens suivent renommages et déplacements, disparaissent à la suppression.
- Interface : dialogue Partager (barre du haut, menu de l'explorateur), section
Liens de partage dans Paramètres, vue publique Excalidraw en lecture seule
avec téléchargement et bascule clair/sombre.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H6J7vKwXx7uopxKhWfFJpm
- DATA_DIR/.meta.json : tags et favoris par chemin, suivis aux renommages,
déplacements, copies (tags seuls) et suppressions.
- API : GET /api/tags, POST /api/meta/favorite, POST /api/meta/tags ; Entry
porte tags et favorite ; /api/search accepte tag= et fav=true (q facultatif).
- Tags comparés sans casse ni accents, écriture existante conservée ; ils
participent à la recherche texte.
- Explorateur : ligne de filtres (Favoris, tags avec leur nombre), étoile et
tags sur les éléments, menu Favori / Tags…, actions sur la sélection,
dialogue Tags (ajout, retrait, suggestions).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H6J7vKwXx7uopxKhWfFJpm
- /api/search cherche dans les noms et dans le texte des schémas (textes et
libellés, noms de cadres, liens) ; tous les mots requis, casse et accents
ignorés, correspondances sur le nom en premier.
- Index en mémoire côté serveur : texte extrait à la première recherche, relu
seulement si le fichier change (date ou taille), rien d'écrit sur le volume.
- L'explorateur affiche l'extrait correspondant sous le nom.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H6J7vKwXx7uopxKhWfFJpm
- Avant d'écraser un schéma, le contenu précédent est copié dans
DATA_DIR/.history/<chemin>/<date>.excalidraw, au plus une version par
HISTORY_INTERVAL (10 min) ; rétention HISTORY_KEEP (50) et HISTORY_MAX_AGE.
Pas de git : l'image reste distroless.
- API : GET /api/history, GET /api/history/version, POST /api/history/snapshot,
POST /api/history/restore (le contenu remplacé devient une version).
- L'historique suit renommages et déplacements, part à la corbeille avec le
schéma supprimé.
- Dialogue Historique (barre du haut, menu de l'explorateur) : aperçu,
différences colorées avec l'état actuel, restaurer, restaurer en copie,
créer une version.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H6J7vKwXx7uopxKhWfFJpm
- Dialogue « Paramètres » (icône engrenage) : sections Apparence (titre, logo)
et Excalidraw (canal latest/next, versions publiées, commande de
reconstruction ; rappel qu'Excalidraw est compilé dans l'image).
- L'icône de mise à jour suit le canal choisi et compare par égalité (les
numéros next sont inférieurs à la dernière stable) ; elle ouvre les
paramètres sur la section Excalidraw.
- Compatibilité avec le canal next : la prop excalidrawAPI y devient
onExcalidrawAPI, les deux sont passées (image next construite et testée).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019EuvvuTv7AUc8ksDHv8VKx
Jetons --ex-* repris d'Excalidraw 0.18 (couleurs, rayons, ombres, police
Assistant, tailles de boutons), boutons au style « Bibliothèque », champ de
recherche, sélecteur vignettes/liste, zone de dépôt et icône de mise à jour.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019EuvvuTv7AUc8ksDHv8VKx
Explorateur : barre d'outils et sélecteur vignettes/liste au style
d'Excalidraw, dépôt de fichiers et dossiers du système (arborescence
recréée, .excalidraw seuls, bilan d'import). Feuille de style : jetons
--ex-* repris d'Excalidraw 0.18, clair et sombre.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019EuvvuTv7AUc8ksDHv8VKx
Suite du commit précédent : explorateur (boutons, icônes, sélecteur
vignettes/liste, dépôt de fichiers et dossiers du système, bilan d'import)
et feuille de style (jetons --ex-* repris d'Excalidraw, clair/sombre).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019EuvvuTv7AUc8ksDHv8VKx
- Jetons de couleur, rayons, ombres, police (Assistant) et tailles de boutons
repris d'Excalidraw 0.18, en clair et en sombre.
- Boutons de l'explorateur et de la barre de titre au style du bouton
« Bibliothèque », icônes au trait (jeu Tabler) à la place des glyphes.
- Glisser-déposer de fichiers et dossiers du système dans l'explorateur ou
sur un dossier : arborescence recréée, seuls les .excalidraw importés,
schémas existants conservés, bilan affiché. Bouton « Importer un dossier ».
- Icône dans la barre du haut quand une version d'Excalidraw plus récente que
celle embarquée (__EXCALIDRAW_VERSION__) est publiée ; un clic donne la
commande de reconstruction.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019EuvvuTv7AUc8ksDHv8VKx
- poignée entre l'explorateur et le canevas (souris, tactile, clavier), largeur mémorisée
- bouton clair/sombre à droite de la barre, synchronisé avec le menu d'Excalidraw
- dialogue Personnaliser : titre et logo PNG affiché en rond
- README
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WSSWgbf7gUzTzEqhjqtzN
- vue vignettes/liste, miniatures générées à la sauvegarde et à la demande
- multi-sélection (cases, Ctrl/Maj+clic, Ctrl+A, Échap, Suppr)
- glisser-déposer de la sélection, dialogue « Déplacer vers… » tactile
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZ78TqR7fgtRx3rvpNUbAL